如何在Git中还原到特定的标签?

129

我知道如何在Git分支中恢复到旧的提交版本,但是如何回滚到由标签指定的分支状态呢? 我想象中应该是这样的:

git revert -bytag "Version 1.0 Revision 1.5"

这是可能的吗?


你想要“倒回分支”(即删除提交),还是在当前分支上添加一个新的提交,以便将该分支设置为所有文件都“与由该标签给出的提交相同”? - torek
无论哪种方法都可以完成工作,不过我认为我更愿意按照你描述的方式向当前分支添加一个新的提交。 - zachd1_618
在这种情况下,使用来自此答案git checkout <id> .方法。 - torek
5个回答

180

Git标签只是指向提交记录的指针。因此,您可以像使用HEAD、分支名称或提交sha散列值一样使用它们。您可以在接受提交/修订参数的任何git命令中使用标签。您可以尝试使用git rev-parse tagname显示其指向的提交记录。

在您的情况下,您至少有以下两个选择:

  1. 将当前分支重置为特定标签:

    git reset --hard tagname
    
  2. 在顶部生成还原提交以使您回到标签的状态:

    git revert tag
    

如果您有合并提交,这可能会导致一些冲突。


40
我认为 "git revert <tag>" 撤销的是已标记提交中的更改,而不是将您的工作副本恢复到该版本。 - Matt
要同时摆脱未跟踪/未版本化的文件,请参考 https://dev59.com/4nVD5IYBdhLWcg3wL4YA#912737。 - Abdull
8
就像 @Matt 所说的那样,被接受的答案仅仅是还原了标记的提交所做的更改。你最好使用提交哈希值,并按照这个回答操作:https://dev59.com/im855IYBdhLWcg3w1oLa#4114122 - Swagga Ting
2
嗨,你能解释一下“在标签的基础上生成还原提交以使你回到标签所代表的状态”是什么意思吗?很遗憾,我对这个完全不了解。 - John Little
“git revert”根本不起作用。看起来没有其他办法,只能强制推送。对于版本控制软件来说并不是最好的选择。 - Christian Vincenzo Traina

19

使用git reset命令:

git reset --hard "Version 1.0 Revision 1.5"

(假设指定的字符串是标签)。


6

如果您:

  • 确定要回到哪个提交记录
  • 想要删除该提交记录之后的所有提交记录
  • 将更改应用于您的远程仓库
  1. reset to a tag named reset-to-here

    git reset --hard reset-to-here
    
  2. push your change to the remote forcing by +

    git push origin +master
    

4

您可以使用git checkout命令。

我尝试了已接受的解决方案,但是遇到了一个错误:warning: refname '<tagname>' is ambiguous'

如答案所述,标签确实像指向提交的指针,因此您可以像使用提交哈希一样,只需检出标签即可。唯一的区别是您需要在其前面加上tags/

git checkout tags/<tagname>


我想你现在得到了一个分离的HEAD。 - Christian Vincenzo Traina
听起来很痛苦! :) - joshi123
根据约瑟夫-伊格纳斯·吉洛丹的说法,这并不是事实。 - Christian Vincenzo Traina
可能存在标签和分支同名的不同问题,需要使用完全限定的标签名称。请参考:https://dev59.com/2V4c5IYBdhLWcg3wM36R - Ben Butzer

0

我已经寻找解决这个问题的方法很长时间了。经过大量研究,我可以说目前没有解决这个问题的方法:

  • git reset --hard <tagname> 会改变历史记录。这不是一个撤销操作
  • git revert <tagname> 只会应用特定提交的更改
  • git revert <hash1>..<hash2> 如果有合并,则无法使用。即使您可以指定父级,如果有多个合并,则此操作可能很繁琐。我们还必须考虑每个单独的撤消必须明智选择和测试,如果我们不想破坏我们的分支。git rebasegit cherry-pick 也存在同样的问题。

所以这是我唯一有效的解决方法:

git checkout <tag name>
mkdir ../tmp
cp -r . ../tmp
git checkout master
cp -rf ../tmp/* .
rm -rf ../tmp
git commit -m "Revert"
git push

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接