如何在Git工作副本中获取所有等效的分支?

3

使用 git branch 命令只能获取一个分支作为“当前”分支,即使检出的提交匹配多个分支。

tig 这样的工具会显示指向相同提交的所有分支。例如:

master upstream/master origin/master

我该如何从git本身中提取这些信息?

我希望在我的提示符上看到这些信息(当我正在推出代码时,知道我的工作副本与upstream/master一致对我很重要)。是否有任何命令行工具可以提供这些信息?

目前,我的bash提示符包括:

/usr/bin/git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'

这将只显示“(master)”(即本地分支)。


git status 命令可以告诉你当前分支相对于它所跟踪的分支的状态,而添加分支信息到提示符的工具通常可以配置为显示该信息。虽然多个分支可以使用某个提交作为其头,但只有一个(被检出的分支)会在下一次提交时更新;这正是检出分支的含义:下一次提交使用该分支的头作为其父提交并更新分支指针。 - chepner
1
没有引用指向您的工作副本。您要求列出指向您的 HEAD 引用的引用,它本身指向您当前(检出的)分支的末尾(即您的最新提交)。 - David Ferenczy Rogožan
@DawidFerenczy 这是正确的;工作副本和HEAD是完全不同的事情。我认为OP指的是分支尖端指向相同的提交。问题是,仅仅因为分支指向相同的尖端,并不意味着它们具有相同的历史记录 - Rafael
@Rafael 我同意。我们描述的是同一件事情。分支本身也只是引用。所以他需要列出所有指向HEAD引用所指向的提交(当前检出分支的最新提交)的分支。这就是他使用jthill答案中的命令获得的内容。 - David Ferenczy Rogožan
@Rafael,如果不是指尖提交的祖先,你所说的分支历史是什么意思? - jthill
3个回答

3
git log -1 --pretty=%D

将帮助您获取文本


1
请注意:没有分支可以引用您的工作副本。此命令显示指向您的HEAD引用的引用,该引用本身指向当前分支的末端(即您的最新提交)。 - David Ferenczy Rogožan
到目前为止,所有答案(共3个)都使用完全不同的git概念(好吧,2个使用分支,但一个使用分支内容,另一个使用其他存储库图形)来实现相同的事情!我“接受”最老且得票最多的那个,但所有答案都是正确的。 - Gabriel

2
git branch --all --points-at HEAD

根据说明书,你正在寻找的东西是这个吗:
   -a, --all
       List both remote-tracking branches and local branches.

  --points-at <object>
       Only list branches of the given object.

如果您想查看其他引用(例如标签)或在脚本中使用结果,则存在变体 - 在这种情况下,您不想花时间使用sed删除不必要的内容:

> git for-each-ref --points-at HEAD --format="%(refname:short)" refs/heads refs/remotes
master
otherbranch
origin/master
origin/HEAD

这种方法具有更详细的参数(仅提供分支,而不是从git log答案中获取标签),但需要git 2+。在git 1.x上,您只有git branch -a(甚至没有--all),而--points-at尚不存在。 - Gabriel
git branch -a --contains 命令在另一个答案中适用于 git 1.x 版本。 - Gabriel
1
@Gabriel 但是 --contains 命令也会返回那些是 HEAD 的后代分支,而不仅仅是指向 HEAD 的分支。 - A.H.

1
git branch --all --contains HEAD

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