gpt4 book ai didi

git - 如何列出包含等效提交的分支

转载 作者:IT王子 更新时间:2023-10-29 01:15:24 24 4
gpt4 key购买 nike

在先前的问题中,有人提供了查找包含 EXACT 提交的分支的答案:

How to list branches that contain a given commit

接受的答案强调这仅适用于完全相同的提交 ID,不适用于相同的提交。进一步说明可以使用 Git Cherry 来解决这个问题。

Git cherry 似乎是为反向而准备的;发现提交未推送到上游。如果我不知道是哪个分支创建的以及什么是什么的上游,这是没有用的。所以我看不出它将如何帮助解决这个问题。

有人可以解释/提供一个示例,说明如何使用 git cherry 查找包含特定提交的“等效”的所有分支吗?

最佳答案

在回答哪些分支包含等效提交的问题之前,您必须确定“哪些提交是等效的”。一旦你有了它,你只需在每个提交上使用 git branch --contains

不幸的是,没有 100% 可靠的方法来确定等效提交。

最可靠的方法是检查提交引入的变更集的补丁 ID。这就是 git cherrygit log --cherrygit log --cherry-mark 所依赖的。在内部,它们都调用 git patch-id。补丁 ID 只是变化的标准化差异的 SHA1。任何引入相同更改的提交都将具有相同的补丁 ID。此外,任何引入大部分仅在空格或文件中应用的行号不同的相同更改的提交都将具有相同的补丁 ID。如果两个提交具有相同的补丁 ID,几乎可以保证它们是等价的——你几乎永远不会通过补丁 ID 得到误报。但假阴性经常发生。每当您执行 git cherry-pick 并且必须手动解决 merge 冲突时,您可能会在变更集中引入差异。即使更改 1 个字符也会导致生成不同的补丁 ID。

检查补丁 ID 需要按照 Chronial 的建议编写脚本。首先用类似

的东西计算原始提交的补丁 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

如果由于 merge 冲突,以上内容对您不起作用怎么办?

好吧,您还可以尝试其他一些方法。通常,当您挑选一个提交时,提交中的原始作者姓名、电子邮件和日期字段将被保留。所以你会得到一个新的提交,但作者信息将是相同的。

因此您可以通过

从您的原始提交中获取此信息
git log -1 --pretty="%an %ae %ad" ORIG_COMMIT

然后和以前一样,您必须检查历史记录中的每一次提交,打印出相同的信息并进行比较。那可能会给你一些额外的匹配。

您还可以使用 git log --grep=ORIG_COMMIT 来查找在提交消息中引用 ORIG_COMMIT 的任何提交。

如果这些都不起作用,您可以尝试查找随镐引入的特定行,或者可以 git log --grep 查找提交消息中可能唯一的其他内容.

如果这一切听起来很复杂,那么,确实如此。这就是为什么我告诉人们尽可能避免使用 cherry-pick 的原因。 git branch --contains 非常有值(value),易于使用且 100% 可靠。其他解决方案都无法与之相提并论。

关于git - 如何列出包含等效提交的分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16304574/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com