在Git中回滚
我已经提交并推动了几个补丁: A1-->A2-->A3-->A4(磁头) 每个人都把这些变更集放到了本地副本中在Git中回滚,git,Git,我已经提交并推动了几个补丁: A1-->A2-->A3-->A4(磁头) 每个人都把这些变更集放到了本地副本中 现在我们想“回滚”到A2,并从那里继续开发-基本上扔掉A3和A4。最好的方法是什么?您想要git revert和git reset取决于您想要如何处理A3和A4。要删除A3和A4的所有痕迹,请使用git reset--hard。要保留A3和A4并记录正在还原的事实,请使用git revert 编辑:亚里士多德·帕格尔茨的git签出解决方案更为优越,不过对于小的恢复,我认为git恢复没有
现在我们想“回滚”到A2,并从那里继续开发-基本上扔掉A3和A4。最好的方法是什么?您想要
git revert
和git reset
取决于您想要如何处理A3和A4。要删除A3和A4的所有痕迹,请使用git reset--hard
。要保留A3和A4并记录正在还原的事实,请使用git revert
编辑:亚里士多德·帕格尔茨的git签出
解决方案更为优越,不过对于小的恢复,我认为git恢复
没有问题。尽管如此,我还是要求给予未来的投票权
我发现这是git的一个很好的资源。丢弃这些提交可能会对从您的存储库中提取的任何人产生一些负面影响。作为另一种选择,您可能想考虑在A2:开始创建一个替代开发分支。 A1-->A2-->A3-->A4 (master/HEAD) \ -->B1-->B2 (new-master/HEAD) A1-->A2-->A3-->A4(主/磁头) \ -->B1-->B2(新主/磁头) 这样做很简单 git branch new-master master~2 git分行新主控~2
从工作副本的根目录执行以下操作
git checkout A2 -- .
git commit -m 'going back to A2'
用于此目的会很麻烦,因为您想要摆脱一系列的提交,而
revert
一次撤销一个提交
你也不想要。这只会改变你的
主分支指针:你没有错误方向的记录。协调起来也是一件痛苦的事情:因为您将master
更改为的提交不是远程存储库的master
分支指针的子对象,所以推送将失败–除非您首先在远程存储库中添加-f
(强制)或删除master
分支,然后通过推送来重新创建它。但是,每个尝试拉取的人在其本地master
分支中仍将保留旧的历史记录,因此一旦origin/master
发散,git-pull
将尝试执行合并。这并不是世界末日:他们可以通过执行git rebase——在origin/master$old\u origin\u master\u commit master
(即,将他们在旧的origin/master
基础上所做的本地提交,在新的origin/master
基础上进行再基础化)来摆脱这种局面。但是Git不知道如何自动完成这项工作,所以您必须与每个合作者进行协调。简而言之,不要这样做。原始海报几乎肯定不想重置。由于每个人都将A3和A4放入了自己的本地存储库,我认为重置会把事情搞砸。git-revert一次只能还原一次提交,而git-reset对于已发布的更改是错误的。正确的答案是git-checkout。亚里士多德·帕格尔茨:你是对的,我把它从我的答案中删掉了。