如何列出所有作为某个提交的祖先的分支?

12 浏览
0 Comments

如何列出所有作为某个提交的祖先的分支?

我想查看所有作为提交abcdef1234祖先的分支。

这有点类似于以下命令的反转:

git branch --contains abcdef1234

上述命令将列出所有作为abcdef1234后代的分支。我想要看到的是所有作为abcdef1234祖先的分支列表。

我也对等效的标签感兴趣。

更新

为了更清楚,我指的是希望看到满足以下两个条件的所有提交列表:

  1. 它们是abcdef1234的祖先
  2. 它们目前由(本地或远程)分支指向。

显然,大多数提交在刚刚新建时都有分支指向它们。我只对它们在此特定时刻是否为分支感兴趣。

0
0 Comments

问题的原因是想要列出一个提交的所有祖先分支。解决方法是使用git branch --merged abcdef1234命令来列出所有已合并到指定提交的分支,即那些其顶部提交可以从指定提交访问到的分支。如果想要获取远程跟踪分支,可以使用-r选项;如果想要获取所有分支,可以使用-a选项。此外,还可以使用git branch --no-merged origin/master命令来列出未合并到指定提交的分支,这也非常有用。不幸的是,git tag命令没有类似于--merged的选项。对于没有这个选项的较新版本的Git,可以使用for-each-ref命令来实现,只需要将标签命名空间指定为refs/tags

0
0 Comments

从上述内容中可以看出,用户想要列出所有是某个提交的祖先的分支。为了解决这个问题,可以使用以下命令:

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` 命令只输出第一个文件中独有的行,即不包含在第二个文件中的行。

通过这样的处理,我们就可以得到所有不包含特定提交的分支的列表。

0
0 Comments

如何列出所有是某个提交的祖先的分支?

这个问题的出现是因为在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的一些强大功能,因此我对此表示赞赏。

0