gpt4 book ai didi

git - 一个 `git log` 标记如何只提交?

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

我想git log master 分支上所有标记的提交(而不是未标记的提交)。这可能吗?

最佳答案

这样做的秘诀是要意识到 git log 使用与 git rev-list 相同的规则。后一个命令有一个 --tags 标志来查看标签。因此,与到目前为止的其他答案一样,如果您愿意查看所有 标记的提交,那么这个命令就可以做到:

git log --no-walk --tags

(--no-walk 阻止这从标签开始并找到他们所有的父提交,以及 parent 的 parent ,等等。)

但是您要求“在 master 分支上标记提交”,我认为这意味着(在技术术语中)“通过 master< 可访问的标记 指向的提交”/分支”。这要困难得多(git rev-list 可以通过 --stdin --no-walk 做集 merge 集,但似乎没有办法做集合交集)。这里有几种找到正确的提交 ID 的方法,但有各种缺点:

  1. 首先制作两个文件列表:“所有标记的提交”和“所有可从 master 访问的提交”:

    git rev-list --tags --no-walk > /tmp/all-tags
    git rev-list master > /tmp/all-master

    现在只打印只出现在两个文件中的行。 comm utility可以做到这一点。它记录了期望文件被排序,但在我看到的所有实现中,文件只需要按照相同的顺序排列,所以这不需要预先排序就可以工作:

    comm -12 /tmp/all-tags /tmp/all-master

    缺点:需要两个临时文件(除非您使用特殊的 bash 语法,即 /dev/fd);没有排序可能无法工作;需要 comm

  2. 与之前的想法相同,但使用 uniq -d 生成列表。这确实确实需要排序,但您可以使用管道消除临时文件:

    (git rev-list --tags --no-walk; git rev-list master) | sort | uniq -d

    缺点:需要排序。提交以某种奇怪的顺序出现,而不是您通常在 git log 中看到的顺序。

  3. 编写您自己的实用程序,基本上执行 comm 方法将执行的操作,但会调用 git rev-list 本身(可能是使用创建临时文件的脚本mktemp 以创建唯一的名称)。

    缺点:需要更多的工作。 :-)

在所有情况下,一旦您有了提交 ID 列表,您只需将它们传递给 git log --no-walk,例如:

git log --no-walk $(comm -12 /tmp/all-tags /tmp/all-master)

关于git - 一个 `git log` 标记如何只提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21569406/

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