在回答哪些分支包含等效提交的问题之前,您必须确定“哪些提交是等效的”。一旦你有了它,你只需使用git branch --contains
在每个提交上。
不幸的是,没有 100% 可靠的方法来确定等效提交。
最可靠的方法是检查提交引入的变更集的补丁ID。这是什么git cherry
, git log --cherry
, and git log --cherry-mark
依靠。在内部,他们都调用git patch-id
。补丁 ID 只是变更的标准化差异的 SHA1。任何引入相同更改的提交都将具有相同的补丁 ID。此外,任何引入mostly仅在空格或文件中应用的行号不同的相同更改将具有相同的补丁 ID。如果两个提交具有相同的补丁 ID,则几乎可以保证它们是等效的 - 您几乎永远不会通过补丁 ID 得到误报。但假阴性经常发生。任何时候你做git cherry-pick
并且必须手动解决合并冲突,您可能在变更集中引入了差异。即使 1 个字符的更改也会导致生成不同的补丁 ID。
按照 Chronial 的建议,检查补丁 ID 需要编写脚本。首先计算原始提交的补丁ID,类似于
(注意 - 脚本未经测试,但应该相当接近工作)
origCommitPatchId=$(git diff ORIG_COMMIT^! | git patch-id | awk '{print $1}')
现在,您必须搜索历史记录中的所有其他提交并计算它们的补丁 ID,并查看它们是否相同。
for rev in $(git rev-list --all)
do
testPatchId=$(git diff ${rev}^1..${rev} | git patch-id | awk '{print $1}')
if [ "${origCommitPatchId}" = "${testPatchId}" ]; then
echo "${rev}"
fi
done
现在您有了 SHA 列表,您可以将它们传递给git branch -a --contains
如果由于合并冲突,上述内容对您不起作用怎么办?
嗯,您还可以尝试其他一些方法。通常,当您选择提交时,会保留提交中的原始作者姓名、电子邮件和日期字段。因此,您将得到一个新的提交,但作者信息将是相同的。
所以你可以从你的原始提交中获取这些信息
git log -1 --pretty="%an %ae %ad" ORIG_COMMIT
然后像以前一样,您必须检查历史记录中的每一次提交,打印出相同的信息并进行比较。那might给你一些额外的匹配。
你也可以使用git log --grep=ORIG_COMMIT
这将找到在提交消息中引用 ORIG_COMMIT 的任何提交。
如果这些都不起作用,您可以尝试寻找用镐引入的特定行,或者可以git log --grep
对于提交消息中可能是唯一的其他内容。
如果这一切听起来很复杂,那么事实确实如此。这就是为什么我告诉人们尽可能避免使用cherry-pick。git branch --contains
非常有价值、易于使用且 100% 可靠。其他解决方案都无法与之相媲美。