如何在Git中将主分支还原到标签?

112

我们有origin和develop两个分支。 master的初始状态被标记为tag_ABC

我们对develop分支进行了一些更改并将其推送到了origin。 然后,我们意外地将develop合并到master并将其推送到origin。

现在,我们想将master还原到检查点tag_ABC。我们该怎么做?

2个回答

190

你可以做

git checkout master
git reset --hard tag_ABC
git push --force origin master

请注意,这将覆盖上游存储库中现有的历史记录,并可能对其他已检出此存储库的开发人员造成问题。
根据Luke Wenke的评论,已检出master的其他开发人员需要执行以下操作:
git pull
git reset --hard origin/master

5
这样所有的分支都会被强制推送。你可以尝试使用命令 git push --force origin master - danza
1
作为参考,要回退到之前的提交,您可以执行 git reset --hard HEAD^ - Geoff
1
顺便提一下,git reset --hard HEAD^ 可以多次使用,每次可以回退一个提交,然后如果它在远程上,可以使用 git push --force origin master - Luke Wenke
1
另外,要将其他人的本地副本的主分支重置为早期版本,请使用 git pullgit reset --hard origin/master - Luke Wenke
在这个还原之后,给团队的一个小建议:从主分支上拉取代码!谢谢! - JRichardsz
显示剩余3条评论

132

这不是对问题的直接回答,但当搜索如何将分支代码还原到标签发布时,此页面会出现。

另一种方法是创建当前分支状态和要还原到的标签之间的差异(diff),然后将其应用于该分支。这将保持版本历史记录正确,并显示变更进入再次退出的情况。

假设您的分支名为master,您要返回的标签名为1.1.1

git checkout 1.1.1
git diff master > ~/diff.patch
git checkout master
cat ~/diff.patch | git apply
git commit -am 'Rolled back to version 1.1.1'
git push origin master

28
这应该是被接受的答案,因为它保留了历史记录,并且不会给已经克隆该代码库的其他人造成问题。 - OpenUserX03
1
这看起来很优雅。但是我试图将qa分支还原到以前的标签,只得到了补丁失败的消息。$ cat ../diff_qa.patch | git apply :55: 尾随空格。 :336: 尾随空格。 :12692: 尾随空格。 :12695: 尾随空格。
  • {{ $tag['rank']+1 }}: <stdin>:12706: 尾随空格。
    error: patch failed: .env.wholo:1 - rickatech
  • 我尝试了几种解决方案,但都没有起作用。这个解决方案非常好。非常感谢@John。 - Strabek
    1
    这是正确的做法。它是非破坏性的,并且保留完整的历史记录。 - Nitin Bansal
    我想知道为什么这不是一个内置的git命令。这可能是任何版本控制系统都应该具备的最基本功能。 - Christian Vincenzo Traina
    显示剩余2条评论

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