2012-05-02 204 views
41

这不是一个主要问题,只是我想知道是否可能。如何作为单次提交的一部分恢复多次提交

假设我们有两个提交,abcd123wxyz789,这些提交发生在非相邻的独立位置,远在回购商的历史记录中。现在让我们说我们想要恢复它们。这样做

git revert abcd123 wxyz789 

会导致两个不同的提交,一个恢复abcd123和其他恢复wxyz789

这一切都很好,但如果我们想要在两个提交中修复的错误在逻辑上是链接的,并且出于自我文档的目的,我们希望做出一个包含一个提交的单个提交“我打破了一些东西,现在我正在恢复文件x,y和z“评论?有没有这样做的git命令?

(我当然知道,它可以创建一个承诺,我只是手动修复所有的变化,然后按这是痛苦的所有obbious原因。)

+0

[Revert multiple git commits]可能的重复(http://stackoverflow.com/questions/1463340/revert-multiple-git-commits) –

+0

我看到了这个线程。它和这个之间的区别在于Bill希望从HEAD回溯多个文件。我的承诺发生在“非邻近的,独立的地方,远在回购的历史中”。 – JimmidyJoo

+1

然而,重新阅读所选的答案给了我我想要的东西。 --no-commit标志是我需要的。 所以...我如何提名我的问题从存在中删除?! – JimmidyJoo

回答

52

你可以这样做:

git revert abcd123 
git revert --no-commit wxyz789 
git commit --amend 

...然后编写一条适当的提交消息来描述恢复两个提交的组合效果。

+0

这将与超过2个提交工作? –

+0

@ AntonI.Sipos是的,尽可能多的你喜欢。 – Trufa

+17

更简洁: 'git revert abcd123 wxyz789 --no-commit' 'git commit' – rmp251

29

如果复杂的复原彼此相互转换,revert --no-commit可能会有问题。

我简单的解决办法是做真正的复归和壁球:

git revert <all commits> 
git rebase -i 

,然后标记所有将恢复为squash,除了第一个,建立一个单一的提交。

+0

我非常喜欢这个解决方案! – monokrome

+1

+1。对于git学习者:1.阅读一下提交的内容,2.熟悉交互式重新分页:压缩,删除,编辑,重新绑定,重新排序提交。一旦你让你的头脑熟悉它(提示:它只是时间旅行),这个解决方案比用'--no-commit'这样的东西变得更自然。 (不要害怕“不要发布公布”规则 - 只要你在本地或私人部门做,就可以做*任何*)。 –

+1

**额外提示:**第一个可以从'pick'改变为'reword'(用于输入一个新的提交信息)或'edit'(用于暂存没有提交的改变)。对于其他回复,如果您不关心提交消息,则可以使用'fixup'而不是'squash'。 – ADTC

18
git revert -n <commits> 
git commit 

第一个命令将执行所有回复而不创建任何提交并执行最终结果(-n选项)。之后,commit命令创建一个提交。

+1

完美。简洁。它可以让你在所有回复之后添加你的提交信息,而不用回去修改其他答案所提出的提交。 –

+0

除了它不起作用。我需要回滚最后5次提交,其中3次是这些奇妙的Git合并,每当您将某人删除时发生变化。所以'commit <###>这个错误是一个合并,但没有-m选项'。每个合并都有两个父母,显然我必须确定我需要保留的每个合并的哪个父母。我甚至都不知道该怎么做,更不用说我如何指定那些我不知道的恢复命令。 – Neutrino