【问题标题】:How to show all commits between HEAD and origin/master (or latest mutual ancestor)如何显示 HEAD 和 origin/master(或最新的共同祖先)之间的所有提交
【发布时间】:2021-03-05 09:01:07
【问题描述】:

我期望的是一个 git 命令,它会显示所有以 HEAD 开头并返回到 origin/master 到最新共同祖先的提交。

有时这很有效:

git log --oneline origin/master^..HEAD

如果HEAD 不直接返回到origin/master,它甚至会在最后一个共同祖先处停止。

但很多时候它随机无法按预期工作,并且在origin/master 之后的行数甚至更多(行为通常在git fetch 之后发生变化)。

我的解决方法是:

git log --pretty=format:'%C(auto)%h %C(magenta)%cd %C(blue)%an%C(auto)%d %C(reset)%s' origin/master^..HEAD | grep --color=always -B 1000 'origin/master'

但我不喜欢它有两个原因:

  1. 它迫使我不使用--oneline,我真的想继续使用它的颜色(grep 不适用于--oneline,grep 与--oneline 的结果根本没有输出,也许因为--oneline 的颜色,不确定)。
  2. 使用 grep 会使我失去所有颜色,尽管使用 --colors=always 它根本没有任何效果,所以我最终得到一个无色的输出。
  3. 虽然我可以想象没有有用的流程需要1000 以外的值,但我在其中放置了一个常量让我感到困扰,命令行不应该使用常量来实现我想要的。

(我的grep版本是3.4,我的git版本是2.25.1

【问题讨论】:

  • 使用 origin/master..HEAD 应该显示作为 HEAD 历史的一部分的修订版属于 origin/master。
  • 哦,我明白你在说什么,所以我的错误是在origin/master 之后添加了^。但是如果我想在输出中只包含origin/master 的一个提交,而不是下面的更多提交呢?
  • 我可以使用这个:git log --oneline origin/master.. ; git log --oneline origin/master -1 但它只会在HEAD 重新基于origin/master 的基础上给我正确的输出,如果只有一个共同的祖先存在,这将添加origin/master 行是不必要的,我不想为那个简单的单行添加复杂的逻辑来避免这种情况。另外,我真的很想了解为什么 ^ 会导致包含多个提交。
  • 也许你想看看git ref-listgit ref-list HEAD ^origin/master。它有一些你可能想探索的时髦选项:git help ref-list
  • @eftshift0 你在想git rev-list吗?

标签: bash git colors grep master


【解决方案1】:

试试:

git log --graph --oneline --ancestry-path origin/master^..HEAD

--ancestry-path 将只选择既是HEAD 的父级的提交 origin/master^ 的后代,所以来自合并在origin/master 的分支的提交,例如,将被忽略.

您也可以尝试跳过origin/master之后的^,并添加--boundary

git log --graph --oneline --ancestry-path --boundary origin/master..HEAD

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 2014-05-24
    • 2017-05-19
    • 2021-01-17
    • 2013-05-05
    相关资源
    最近更新 更多