确定两个给定分支之间的最新合并



我需要以毫无根据的方式识别两个分支之间的差异。分支经常分叉,只有当我合并它们(一次sprint)时才需要保持一致。即使在合并后,当有人对目标分支进行热修复更改时,它们似乎也会漂移,并且无意中没有带来其他更改。无论哪种方式,git diff表示分支不同,git merge表示没有要合并的。

我可以使用git diff来识别存在的变化,并且我有一个使用git merge --allow-unrelated-histories执行无根据合并的脚本。我现在正在做的是备份到最后一次合并,这样我就可以将合并与父合并进行比较。

考虑这个git图:

...-A-B---C---D---E---F---G---H
                      ↑
...                          main
               
I-J---K---L---M---N---O
    /   /    ↑
   f   /     release
     /
--d--

我知道mainrelease分支。给定releaseO,我想确定Kmain的最后一次合并,并且提交B是父级。我如何穿越O的历史并确定K是最近的合并,B是它的父节点?

确定合并

git rev-list --min-parents=2 <O>会列出所有父母,并引导我到K,尽管在此之前我需要排除NM

确定父母

我不知道如何做到这一点(给定K,确定BB&J)。

确定父级的后代

我不知道如何做到这一点(给定B,确定H是后代;并且给定J,确定H不是后代)

遍历过程中如果我使用git rev-list和类似的,我需要遍历返回的每个提交散列(以测试父节点和父节点的后代)。不是世界末日,但如果git可以为我做的工作,这将是更少的错误倾向。

确定差异git diff --name-only <B> <K>将显示BK之间的文件差异

执行无基合并

咩。涉及checkout --orphanmerge --allow-unrelated-histories的多步骤脚本。我将把它省略,但是我有一个解决方案。

当您说同步时,您的意思是使分支A在内容中看起来就像合并B时的B一样?如果是这种情况,您可以这样做:

git checkout A
git merge --no-commit B
# I don't want to deal with the details, make it look like B, please:
git restore --staged --worktree --source=B -- .
GIT_EDITOR=true git merge --continue

你可以确定不管A和B在合并之前是什么样子,git diff B在每次合并完成时都是空的。

你甚至可以用git commit-tree来完成它,但那有点粗俗。