如何列出所有作为某个提交的祖先的分支?
问题的原因是想要列出一个提交的所有祖先分支。解决方法是使用git branch --merged abcdef1234
命令来列出所有已合并到指定提交的分支,即那些其顶部提交可以从指定提交访问到的分支。如果想要获取远程跟踪分支,可以使用-r
选项;如果想要获取所有分支,可以使用-a
选项。此外,还可以使用git branch --no-merged origin/master
命令来列出未合并到指定提交的分支,这也非常有用。不幸的是,git tag
命令没有类似于--merged
的选项。对于没有这个选项的较新版本的Git,可以使用for-each-ref
命令来实现,只需要将标签命名空间指定为refs/tags
。
从上述内容中可以看出,用户想要列出所有是某个提交的祖先的分支。为了解决这个问题,可以使用以下命令:
comm -23 <(git branch -a | sort) <(git branch -a --contains abcdefg1234 | sort)
这个命令会列出所有不包含提交 `abcdefg1234` 的分支,即 `git branch -a` 的输出减去 `git branch -a --contains abcdefg1234` 的输出。
这个命令的作用是找到不包含特定提交的分支。它使用了两个子命令来实现:
- `git branch -a`:列出所有分支(包括远程分支)的信息。
- `git branch -a --contains abcdefg1234`:列出包含提交 `abcdefg1234` 的所有分支的信息。
然后,使用 `comm` 命令将这两个输出进行比较。`comm` 命令用于比较两个已排序的文件,并根据比较结果进行处理。在这个命令中,`-23` 标志告诉 `comm` 命令只输出第一个文件中独有的行,即不包含在第二个文件中的行。
通过这样的处理,我们就可以得到所有不包含特定提交的分支的列表。
如何列出所有是某个提交的祖先的分支?
这个问题的出现是因为在Git中,我们有时候需要找到某个提交的所有祖先分支。解决这个问题的方法是使用Git命令`git for-each-ref`和`git merge-base`。
首先,我们将目标提交设为变量K,然后遍历所有形式为`refs/heads/*`或`refs/remotes/*`(即所有分支和远程跟踪分支)的标签L。每个标签L指向某个特定的提交C。如果C是K的祖先,那么就打印标签L。
下面是一个未经测试的Shell脚本,实现了这个方法:
#! /bin/sh # 找到所有目标提交的祖先分支和远程跟踪分支 showthem() { local tgt label lbltgt tgt=$(git rev-parse "$1") || return $? git for-each-ref --format='%(refname:short) %(objectname)' \ refs/heads refs/remotes | while read label lbltgt; do if git merge-base --is-ancestor $lbltgt $tgt; then echo "$label" fi done return 0 } case $# in 0) usage 1>&2; exit 1;; 1) showthem "$1";; *) for i do "echo ${i}:"; showthem "$i" || exit; done esac
该脚本使用了`git for-each-ref`命令来遍历所有分支和远程跟踪分支,并使用`git merge-base`命令来判断某个提交是否是目标提交的祖先。最后,根据判断结果打印相应的标签。
需要注意的是,这个脚本可以适用于较旧版本的Git,但可能需要根据实际情况对其进行微调,比如忽略类似`origin/HEAD`的符号引用。
通过使用`git for-each-ref`和`git merge-base`命令,我们可以方便地列出某个提交的所有祖先分支。这些方法展示了Git的一些强大功能,因此我对此表示赞赏。