我一直致力于合并到A
分支的功能分支dev
。合并后我向dev
分支做了几次提交。但是,我意识到dev
分支的当前头部已被破坏,并希望通过回滚到A
分支中的某个提交并重新应用所有提交来测试我的dev
分支。在A
合并之后,dev
和我做的额外的一些。我怎么能实现这个目标?
编辑:很多人都致力于dev
,并且我合并了我的分支A
,该分支仅由我的提交组成。基本上,我想删除所有其他人的提交,直到某些旧提交。
回滚仅用于测试目的,以查看分支A是否与分支dev
有些兼容。它不需要是最新的#34;但需要A合并到代码实际用于工作的dev
中的某个点。
答案 0 :(得分:1)
使用临时分支。
让我们绘制您现在拥有的内容,作为分支dev
和feature
分支上的一系列提交。我们暂时假设你没有将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
,即dev
到G
,当然还有您的新提交合并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'
的提交。
现在你可以运行测试了。
同样,我们首先提出E
和E
“不好”的想法。所以这一次,我们想要一个直接指向提交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-pick
和N
。这与我们之前的O
类似,不同之处在于它不会尝试“撤消”更改,而只是复制它们。我们将这些副本称为revert
和N'
(大写,因为它们是副本,而不是反向副本):
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
之后,还是其他什么。这个特别的部分非常简单,因为你有一个分支!