gpt4 book ai didi

git - 使用 git rev-list 排除一个分支,但与包含的分支保持共同的祖先

转载 作者:太空狗 更新时间:2023-10-29 13:24:33 25 4
gpt4 key购买 nike

假设我有以下 git 存储库:

--all

我想指定所有分支的 git rev-list (--all) 但不包括给定的分支(比如,feature-D),但我想要显示 feature-D 和其他分支的共同祖先,即提交 Initial1

如果我尝试 git rev-list --all ^feature-D 提交 Initial1 被排除在外:

--all ^feature-D

当然我可以显式列出除feature-D之外的所有分支(git rev-list feature-A feature-B feature-C)来得到我想要的:

feature-A feature-B feature-C

但是有没有一种方法可以指定一个获得先前结果的rev-list,仅通过引用feature-D

(请注意,这个问题的灵感来自这个答案:https://stackoverflow.com/a/20978568/430128)

最佳答案

这有点间接,但似乎有效。我们从:

git rev-list --no-walk --all ^feature-D

它生成所有 ref 直接指向的所有 SHA-1 的列表(包括标签、分支、存储等;使用 --branches 而不是 --all 如果你只想要分支)except feature-D 下的分支:

$ git log --oneline --decorate --graph --all
* 74e0d3e (feature-D) 7
* 0448a13 6
| * ab3a532 (feature-C) 5
|/
| * 50477c7 (feature-B) 4
| * 28717e5 3
|/
* 2ac5cef (HEAD, master, feature-A) 2
* c6a10b4 1
* 76c511f Initial
$ git rev-list --no-walk --all ^feature-D
ab3a5320e792e945b896634d667df5ace4a8b871
50477c7b28b5479587e45fe97292e71a3c0851c5
28717e5628ad111e8b68323dc485fd190a780446

现在我们将其提供给git rev-list再次以获取历史记录:

$ git rev-list --no-walk --all ^feature-D | git rev-list --stdin
ab3a5320e792e945b896634d667df5ace4a8b871
50477c7b28b5479587e45fe97292e71a3c0851c5
28717e5628ad111e8b68323dc485fd190a780446
2ac5cefb971c7f5c5be33a77a6db71127982eaf5
c6a10b4568136d65b31b7e262ef7745db4962460
76c511fcf38076e0ea98db73a4923de6fc806b4a

将其通过管道传输到 git log --oneline --decorate --graph --stdin 以验证这些是正确的提交,如果目测还不够清楚的话:

* ab3a532 (feature-C) 5
| * 50477c7 (feature-B) 4
| * 28717e5 3
|/
* 2ac5cef (HEAD, master, feature-A) 2
* c6a10b4 1
* 76c511f Initial

(还有一个旁注:如果使用 git log --oneline --decorate --graph 查看中间版本,即 git rev-list --all ^feature- D,你需要添加 --boundary 才能看到提交 2;gitk 可能会添加 --boundary 来让它显示出来,不是我测试过的) .

这里有一个缺陷:如果 feature-Cfeature-B 分支不存在,您将看不到提交 2 到 Initial。我不确定,但我认为唯一真正解决这个问题的方法是使用更复杂的东西。


编辑:好的,没复杂得多。从 git for-each-ref 开始打印分支。通过 grep -v ^feature-D$ 来消除 feature-D。现在你有所有你想要的分支作为参数:

$ git log --oneline --graph --decorate $(git for-each-ref \
> --format '%(refname:short)' refs/heads/ | grep -v '^feature-D$')
* ab3a532 (feature-C) 5
| * 50477c7 (feature-B) 4
| * 28717e5 3
|/
* 2ac5cef (master, feature-A) 2
* c6a10b4 1
* 76c511f Initial

关于git - 使用 git rev-list 排除一个分支,但与包含的分支保持共同的祖先,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20979339/

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