背景
我正在尝试编写一个脚本,使用git简化我的回溯过程。
修复当前版本中的错误的一般流程如下:
- 从
master
分支创建一个bug修复分支,例如bugfix/abc
- 在
bugfix/abc
上进行所有修复错误的提交 - 将
bugfix/abc
合并到master
(不要快进合并)
现在,当我想将修复应用于例如版本1(分支v1
)时,我会执行以下操作:
- 从
bugfix/abc
创建一个新分支,例如bugfix/def
- 然后手动找到合并提交之前的
master
提交,例如f4d399238f
- 现在我使用rebase:
$ git rebase --onto v1 f4d399238f bugfix/def
这很好用(在弄清楚我必须使用合并前的提交作为上游之后)。
问题
如何在合并提交之前找到两个分支的共同祖先?(回溯过程的第2步)。
尝试过的
git merge-base bugfix/abc master
- 由于合并已经完成,这只返回
bugfix/abc
头部的提交
- 由于合并已经完成,这只返回
- 结合#1的结果,使用
git log
获取该提交的子级- 我尝试按照How do I find the next commit in git?使用各种组合的
--reverse
、--ancestry-path
和--children
,但我从未得到我期望的结果。
- 我尝试按照How do I find the next commit in git?使用各种组合的
更新
这个问题与Find common ancestor of two branches的关键区别在于这两个分支已经被合并。正如我所提到的,作为合并的分支的头部返回了最佳提交。我需要合并提交之前的共同祖先。
假设修复错误并合并到主分支后的分支如下:
A---B v1
\
C---D---F---H master
\ /
E---G bugfix/abc
运行$ git merge-base master bugfix/abc
将返回G,但我需要获得D(甚至F也可以用于使用rebase --onto
的目的)。
一旦我获得D,我会执行以下操作:
$ git branch bugfix/def bugfix/abc
$ git rebase --onto v1 D bugfix/def
$ git checkout v1
$ git merge bugfix/def
为了获得期望的结果:
E'---G' bugfix/def
/ \
A---B--------I v1
\
C---D---F---H master
\ /
E---G bugfix/abc