回滚到旧提交,但应用我的提交

时间:2016-09-28 03:20:19

标签: git github git-merge

我一直致力于合并到A分支的功能分支dev。合并后我向dev分支做了几次提交。但是,我意识到dev分支的当前头部已被破坏,并希望通过回滚到A分支中的某个提交并重新应用所有提交来测试我的dev分支。在A合并之后,dev和我做的额外的一些。我怎么能实现这个目标?

编辑:很多人都致力于dev,并且我合并了我的分支A,该分支仅由我的提交组成。基本上,我想删除所有其他人的提交,直到某些旧提交。

回滚仅用于测试目的,以查看分支A是否与分支dev有些兼容。它不需要是最新的#34;但需要A合并到代码实际用于工作的dev中的某个点。

1 个答案:

答案 0 :(得分:1)

使用临时分支。

让我们绘制您现在拥有的内容,作为分支devfeature分支上的一系列提交。我们暂时假设你没有feature分支合并到dev(即使你有,也就是说,让我们从你做{{1}之前开始}):

git checkout dev && git merge feature

现在,您已经执行了...--o--*--A--B--C--D--E--F <-- dev \ G---H--I--J--K---L <-- feature 或等效,所以让我们将合并提交添加到绘图中:

git checkout dev && git merge feature

“您的”提交是分支...--o--*--A--B--C--D--E--F--M <-- dev \ / G---H--I--J--K---L <-- feature 上的提交,在合并之前不在feature,即devG,当然还有您的新提交合并L

现在你说你已经添加了几个提交,所以让我们把它们绘制成:

M

正是在这一点上,你意识到某些事情已被打破,比如,...--o--*--A--B--C--D--E--F--M--N--O <-- dev \ / G---H--I--J--K---L <-- feature E也是如此。所以现在你想看看如果我们测试“commit F会发生什么情况,如果我们没有提交O和/或E”。

方法一:制作临时分支并恢复错误提交

(这通常是最简单的方法。你已经完成了合并;另一种方法让你重新进行合并,合并往往比恢复更难。)

第1步是获得一个临时分支。在F上,只需dev,以便您现在拥有:

git checkout -b temp

现在您可以运行...--o--*--A--B--C--D--E--F--M--N--O <-- dev, HEAD -> temp \ / G---H--I--J--K---L <-- feature 来还原两个“错误”提交。这会执行git revert <id-of-E> <id-of-F>所做的事情,但反之亦然:它会找出从git cherry-pick更改为E的内容(以便可以重复,或者在这种情况下,未完成)和“反向适用“改变为取消它。然后它以相同的方式找出从F更改为D的内容,并反向应用该更改以撤消它。

现在你有:

E

其中 f'-e' <-- temp / ...--o--*--A--B--C--D--E--F--M--N--O <-- dev \ / G---H--I--J--K---L <-- feature 是“撤消”f'的提交,F是“撤消”e'的提交。

现在你可以运行测试了。

方法二:制作临时分支,然后重新合并并挑选

同样,我们首先提出EE“不好”的想法。所以这一次,我们想要一个直接指向提交F的临时分支:D上的最后一个“好”提交。找到提交dev的ID,然后:

D

现在你有了这个 - 与以前相同的图纸,但我们为新的分支标签添加了一个“up”:

git checkout -b temp <id-of-D>

现在运行 D <-- HEAD -> temp / \ ...--o--*--A--B--C E--F--M--N--O <-- dev \ / G--H--I--J--K--L <-- feature 。这使得 new 合并提交与git merge feature完全不同,它将提交M合并到提交L中。绘制结果图有点困难,因为合并线越过D分支(我应该采取不同的方法而不是向上提升dev),但这里有一种刺:

D

现在使用 D-------m <-- HEAD -> temp / \ . ...--o--*--A--B--C E--F--M--N--O <-- dev \ ./ G--H--I--J--K--L <-- feature 复制提交git cherry-pickN。这与我们之前的O类似,不同之处在于它不会尝试“撤消”更改,而只是复制它们。我们将这些副本称为revertN'(大写,因为它们是副本,而不是反向副本):

O'

现在像以前一样运行测试。

如果测试失败怎么办?

如果事情仍然不起作用,由你来决定如何处理。但是,您可以继续在 D-------m--N'--O' <-- HEAD -> temp / \ . ...--o--*--A--B--C E--F--M--N--O <-- dev \ ./ G--H--I--J--K--L <-- feature 分支上进行提交,直到您修复了内容,然后决定如何收集这些修补程序并重做temp或添加它们在提交feature之后,还是其他什么。这个特别的部分非常简单,因为你有一个分支!