Git - 查找分支间的差异

4

我有一个分支A,它分叉成了其他分支。我还有更多的分支,它们没有从那个A分支分叉出来。如何找到哪些分支是从A分叉出来的?

例如:

-------------------------------- Master
 \  \
  \   -------------------------- A
   \         \
    \          ----------------- B
     \           \
      \            ------------- C
       \
        \
          ---------------------- D
                \
                  -------------- E

我希望输出结果为B和C。

在 Git 中,从另一个分支分叉出来的分支概念有点模糊。这是因为分支只是指向一个提交的指针,而仓库历史并不总是一棵树。 - Cristian Lupascu
例如,查看此图表,告诉我哪些分支“分离”自A。 - Cristian Lupascu
话虽如此,您可以尝试找到与分支 A 的 共同祖先 比主分支更先的分支。然而,在将分支 A 及其后代合并回主分支之后,这种方法将不再适用。 - Cristian Lupascu
1个回答

4

git branch --contains 应该提供你想要的内容。

--contains 选项显示包含特定提交的所有分支。我们想要的提交是 Amaster 分支后的第一个提交。获取 Amastermerge-base 更容易,但这也会被 master 和在 A 之后从 master 分支的任何内容所包含。

我们可以使用以下命令找到 A 上的第一个提交 SHA:

git log --format=format:%h master..A | tail -1

%h 提供了短的提交 SHA,这样我们就不必在默认输出后再进行切片。 tail 挑选出 A 上最早的提交,或者您也可以传递 --reverse 选项给 log 并使用 head。如果您的分支有一百万个提交,那么这将让进程更快地 结束, 但此时您可能还有其他问题需要考虑。

然后,我们在 branch --contains 中使用 A 的第一个 SHA:

git branch --contains $(git log --format=format:%h master..A | tail -1) --no-merged A
< p > --no-merged A选项忽略了分支A本身,而该分支明显包含我们选择的提交。

如果您当前已经检出了与A分叉的分支之一,git会像运行git branch时一样用*表示。我找不到一种在纯Git中去除它的方法,但是您可以使用许多unix命令从输出中删除它。


几乎正确 - 因为包含需要<commit>而不是分支名称。将其更正为git log master..A --oneline | tail -1,然后我会将您的答案标记为正确。顺便说一句,我可以不使用--no-merged问题。 - Uriel Frankel
更新了答案以反映--contains将采用提交标识。在那里使用分支对我来说效果很好(v2.2.1)。 - Kristján
我尝试使用分支名称,但唯一的结果是该分支本身。如果你看我的例子,只有A包含在A中,这是合乎逻辑的。 - Uriel Frankel
1
啊,我明白了我的错误。我曾经认为你的图表中A是在B分支之前提交的,而不是作为该分支的HEAD,并且在B分离后继续存在。我已经更新了你的图表,这样其他人就不会再有这种想法了,并且使用了你的tail版本更新了答案。团队合作! - Kristján

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接