我需要以毫无根据的方式识别两个分支之间的差异。分支经常分叉,只有当我合并它们(一次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--
我知道main
和release
分支。给定release
是O
,我想确定K
是main
的最后一次合并,并且提交B
是父级。我如何穿越O
的历史并确定K
是最近的合并,B
是它的父节点?
git rev-list --min-parents=2 <O>
会列出所有父母,并引导我到K
,尽管在此之前我需要排除N
和M
。
确定父母
我不知道如何做到这一点(给定K
,确定B
或B
&J
)。
确定父级的后代
我不知道如何做到这一点(给定B
,确定H
是后代;并且给定J
,确定H
不是后代)
遍历过程中如果我使用git rev-list
和类似的,我需要遍历返回的每个提交散列(以测试父节点和父节点的后代)。不是世界末日,但如果git可以为我做的工作,这将是更少的错误倾向。
确定差异git diff --name-only <B> <K>
将显示B
和K
之间的文件差异
执行无基合并
咩。涉及checkout --orphan
和merge --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
来完成它,但那有点粗俗。