Git - 如何找到特定分支的第一次提交

use*_*113 81 git

在以下示例树中:

A-B-C-D-E (master branch)
    \
     F-G-H (xxx branch)
Run Code Online (Sandbox Code Playgroud)

我正在寻找F - xxx分支中的第一个提交.我认为有可能:

git log xxx --not master
Run Code Online (Sandbox Code Playgroud)

最后列出的提交应该是F.这是正确的解决方案还是有一些缺点?

我知道stackoverflow上有类似的问题,但没有人提出这样的解决方案,我不确定我是否做得对.

kon*_*yak 92

git log master..branch --oneline | tail -1
Run Code Online (Sandbox Code Playgroud)

"分支"是您的特定分支名称.点点线为您提供了主人没有的分支所有提交.tail -1返回上一个输出的最后一行.

  • 这只有在`branch``存在时才有效.如果分支被删除,你会怎么做? (3认同)
  • 不给我我期待的东西.我的分支(旧分支)已经合并回master,这意味着xxx中的所有提交都已经在master中.仍然 - 我需要知道哪个提交是该分支上的第一个 - 或者实际上 - 我需要单独检查该分支的提交历史 - 我不在乎它们是否在掌握. (3认同)
  • @ Oz123分支可以用任何引用代替,例如HEAD或sha1或标签。但是显然您需要某种参考。 (2认同)
  • @MottiShneor 取决于你如何合并,这可能很棘手。如果您进行快进,就好像分支从未存在过一样。否则,您可能对[这个答案](/sf/answers/349417281/)感兴趣,其中列出了多种查找分支点的方法。一旦你有了分支点,SHA 就可以替换 `master`,只要你的分支没有被删除,`git log <sha>..branch --oneline | tail -1` 应该仍然会给你你正在寻找的结果。 (2认同)

Nel*_*elu 7

git cherry master -v | head -n 1
Run Code Online (Sandbox Code Playgroud)

cherry- 显示当前分支上不存在于上游分支 ( docs )上的提交。的上游(主在这种情况下)是一个点的当前分支从导出。

-v - 显示提交名称(而不仅仅是 SHA) - 详细。

head-n从文本打印行数的Unix 命令


Fab*_*ato 5

您应该使用merge-base旨在解决此问题的功能:

git merge-base remotes/origin/<branch> develop 
Run Code Online (Sandbox Code Playgroud)

  • 如果你想回到原来的分叉点,我认为这不会起作用。如果将开发合并到 &lt;branch&gt; 中,则合并基础将比原始分叉点更新。 (2认同)
  • 同样,这*不是*指向F,而是指向master分支中的提交(尽管很难在OP的图形中看到,似乎是B或C)。 (2认同)

wed*_*ens 0

git rev-list --ancestry-path $(git merge-base master xxx)..xxx | tail -1