背景
我正在尝试编写一个脚本来简化使用 git 的向后移植过程。
修复当前版本中的错误的一般过程如下:
- 分支来自
master
到错误修复分支,例如bugfix/abc
- 进行所有提交以修复错误
bugfix/abc
- Merge
bugfix/abc
to master
(没有快进合并)
现在,当我想将修复向后移植到版本 1 时(例如分支v1
) I do:
- 从创建一个新分支
bugfix/abc
, e.g. bugfix/def
- 然后手动查找提交
master
那是在合并提交之前,例如f4d399238f
- 现在我使用变基:
$ git rebase --onto v1 f4d399238f bugfix/def
这非常有效(在弄清楚我必须在上游合并之前使用提交之后)。
Question
如何找到两个分支的共同祖先before合并提交? (用于向后移植过程的步骤 2)。
Tried
-
git merge-base bugfix/abc master
- 由于合并已经完成,这只会返回头部的提交
bugfix/abc
- Combining the result of #1 to get the child of this commit using
git log
- 我尝试以下如何在 git 中找到下一个提交? https://stackoverflow.com/questions/2263674/how-do-i-find-the-next-commit-in-git使用各种组合
--reverse
, --ancestry-path
and --children
但我从来没有得到我所期望的。
Update
这个问题和找到两个分支的共同祖先 https://stackoverflow.com/questions/1549146/find-common-ancestor-of-two-branches是两个分支已经合并了。正如我提到的最佳承诺作为合并的分支的头返回。我需要共同的祖先在合并提交之前.
假设 bug 被修复并合并到 master 后的分支如下所示:
A---B v1
\
C---D---F---H master
\ /
E---G bugfix/abc
Running $ 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
如何在合并提交之前找到两个分支的共同祖先? (用于向后移植过程的步骤 2)。
有几个选项可供使用:
git 合并基础
git merge-base http://git-scm.com/docs/git-merge-base是您正在寻找的命令
git 合并基础找到两个提交之间的最佳共同祖先,以在三向合并中使用。一个共同的祖先是better如果后者是前者的祖先,则比另一个共同祖先更重要。没有更好的共同祖先的共同祖先是最好的共同祖先,即合并基地。请注意,一对提交可以有多个合并基础。
手动从日志中查找
git log --decorate --graph --oneline --all
这将在日志中显示分叉点,以便您可以跟踪分支的提交 ID。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)