我遇到了这个问题:已经有一些提交,包括一些已经破坏了远程开发分支的合并提交。
我承诺一切都很好。我希望在此提交后还原所有更改。实际上,我希望在一切都很好的提交本地和远程的活动分支。
答案 0 :(得分:4)
解决这个问题的最安全的方法是git revert
本地的错误提交,然后像往常一样将分支推送到遥控器。因为你有合并提交,你可能必须逐个处理每个恢复提交。对于非合并提交,只需使用:
git revert <SHA-1>
您要将<SHA-1>
替换为要还原的提交的实际哈希值。对于合并提交,它变得更加棘手,因为你需要告诉Git 你要遵循的两个父路径中的哪个。您将执行以下两个选项之一:
git revert <SHA-1> -m 1
git revert <SHA-1> -m 2
-m 1
选项告诉Git遵循第一个父级的路径,-m 2
选项告诉Git跟随第二个父级。为了安全起见,您应该检查相关分支的git日志,并找到合并提交,它是恢复的候选者。你应该看到这样的东西:
commit 599ee3d46d61d60a7ebdf584b06f78eba647526d
Merge: ece921f 57945bb
Author: Jon Skeet <jon.skeet@google.com>
Date: Wed Mar 29 10:01:29 2017 +0000
ece921f
是第一个父级,57945bb
是第二个父级。确定您想要哪一个,然后相应地还原。例如,如果您想要关注第一个父级,则可以使用以下命令恢复:
git revert 599ee3d -m 1
如果你的分支没有被其他人共享,那么获得你想要的东西的最快方法就是硬重置你的本地分支,然后强制将其推送到远程。像这样:
git checkout your_branch
git reset --hard HEAD~5 # assuming you want to nuke the last 5 bad commits
git push --force origin your_branch
但是,如果分支不与其他人共享,或者如果分支,则应该考虑此选项,并且知道执行此强制推送可能会导致共享此分支的其他人出现问题和混淆。
答案 1 :(得分:0)
我承诺一切都很好。我想在此提交后恢复所有更改。
在工作提交后恢复所有提交。您可以恢复一系列提交,例如:
$ git revert <fromCommit>..<toCommit>
$ git add .
$ git commit -m 'Revert some commits'
$ git push origin HEAD
答案 2 :(得分:0)
假设本地分支为X
,远程为origin
,其中的分支也为X
。有两种情况。第一种情况是,如果有人在推送后修改了origin/X
(即远程服务器上的X
分支)并且您关心这些修改。第二个是如果没有人修改它或你不关心修改。
在第一个场景中,origin/X
看起来像这样
1 - 2 - 3 - 4 - 5 - 6
X
目前指向6
,您的&#34;良好提交&#34;位于2
,您的错误提交为3
,4
,5
和6
由其他人推送,是项目所必需的。在这种情况下,您可以在自己的分支上执行以下操作
git pull # This will fetch `5` and `6`
git revert `3` `4` # Will apply reverse patches "removing" `3` and `4`
你的树现在就像这样
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8
其中7与3相反,8与4相反。这会将您的代码更改为1,2,5和6.然后您只需git push origin X
本地仓库。
在第二种情况下,您并不关心5
和6
(或者他们不存在)。这允许您重置分支。只需做
git reset --hard `2`
git push --force origin X
你完成了。 2之后的额外提交将被完全破坏。