如何获取两个 git 分支之间不同提交的列表?

Coo*_*J86 7 git diff git-diff git-log

我想查看两个分支之间仅包含非常见提交的列表。

我怎样才能得到这样的输出?

基本上是git diff -y master new-feature两个分支之间的摘要:

              master                               new-feature
-------------------------------------|--------------------------------------
xxx - Jan 1st 2018 - initial commit  | xxx - Jan 1st 2018 - initial commit
xxx - Feb 1st 2018 - fix a bug       | xxx - Feb 1st 2018 - fix a bug
                                     > xxx - Mar 1st 2018 - WIP almost done
xxx - Apr 1st 2018 - fix another bug | xxx - Apr 1st 2018 - fix another bug
xxx - May 1st 2018 - fix more bugs   | xxx - May 1st 2018 - fix more bugs
                                     > xxx - Jun 1st 2018 - Ready to merge!
xxx - Jul 1st 2018 - latest patches  < 
Run Code Online (Sandbox Code Playgroud)


解决方案:我不知道如何使它的正面或反面,但我认为 git log --graph实现了这一点,只是具有非常混乱的视觉风格:

git log --left-right --graph --cherry-pick --oneline master
Run Code Online (Sandbox Code Playgroud)






或这个?

更好的是,这git diff -y --suppress-common-lines master new-feature是我真正想要的:

              master                               new-feature
-------------------------------------|--------------------------------------
                                     > xxx - Mar 1st 2018 - WIP almost done
                                     > xxx - Jun 1st 2018 - Ready to merge!
xxx - Jul 1st 2018 - latest patches  <
Run Code Online (Sandbox Code Playgroud)


解决方案:你可能无法使用Git单独但是,按照@托雷克的答案,你可以得到大多那里git rev-list

git rev-list --left-right master...new-feature

>eb57618eed654685a7999da847628dc5eb27313f
>0da0196ab24542a1a1697b1c0c5efeef6d09e027
>9452f57d97e5fc86e773e7a9fca488b7a0d44a0c
<4fc12fe25a127f8f0dfddf7625c22656c7b2c7c1
<9c0058dcabacfc6560f4fbaf73ea55dd70d27036
>5117fcd041793898683f9469aac00337e9fadd8b
Run Code Online (Sandbox Code Playgroud)






或者甚至只是这个?

更重要的是,git diff --right-only master new-feature样式视图可以完成工作:

     commits only in new-feature
-------------------------------------
xxx - Mar 1st 2018 - WIP almost done
xxx - Jun 1st 2018 - Ready to merge!
Run Code Online (Sandbox Code Playgroud)

当然,可以颠倒过来以获得相反的观点 git diff --right-only new-feature master

       commits only in master               
-------------------------------------
xxx - Jul 1st 2018 - latest patches 
Run Code Online (Sandbox Code Playgroud)


解决方案:由于@brentjanderson指出git log master..new-featuregit cherry -v master两个这样做:

git cherry -v master..new-feature

+ c00335cd93898683f9469aafad8a8476227b117f WIP do things
+ f5c86e777d97e5f3e7a9fca488b79a0d44ac9452 WIP do more
+ 0ef6ddda576180196ab7b1c0c57eefe009e027dc Finished!
Run Code Online (Sandbox Code Playgroud)

git log master..new-feature --format="%h - %ad - %s" --date=format:'%b %d %Y'

c00335cd - Jan 01 2018 - WIP do things
f5c86e77 - Feb 01 2018 - WIP do more
0ef6ddda - Mar 01 2018 - Finished!
Run Code Online (Sandbox Code Playgroud)



PS 我以前试过git checkout new-feature; git log --left-right --graph --cherry-pick --oneline master,但我无法对输出做出正面或故事(或反面)。实际上,再想一想,我敢打赌,将输出转向侧面,然后将其作为 excitebike 地图进行播放,这将是一个很好的故事。唔...

小智 13

这是一个没有花哨格式的基本变体:

git log master..new-feature

您可以通过交换分支的顺序来获得“左侧”或“右侧”数据:

git log left-side-branch..right-side-branch

这也适用于其他引用(提交哈希、远程分支、标签)。

要获得所需的完整日期格式:

git log master..new-feature --format="%h - %ad - %s" --date=format:'%b %d %Y'

这不会执行序数日期 ( Mar 1st 2018is Mar 01 2018),因为strftime不支持。如果这是一个硬性要求,我建议编写一个批处理脚本。


tor*_*rek 5

我想查看两个分支之间仅非常见提交的列表。

在集合论中,这是从分支 X 和 Y 可到达的提交集合的对称差异。

这个特定的集合分组非常有用,以至于它被内置到 Git 修订解析器中,使用gitrevisions 文档中描述的语法,使用三个点:X...Y

我怎样才能得到它们[以某种特定方式格式化]

从...开始git rev-list --left-right master...new-feature。当使用对称差异表示法并添加 时--left-right,Git 将列出提交以及标记:<如果可以从左侧的名称访问提交,但不能从右侧的名称访问提交,或者>如果可以从 的名称访问提交右边但不是来自左边的名字。因此:

git rev-list --left-right master...new-feature
Run Code Online (Sandbox Code Playgroud)

会给你:

<aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd
>eeeeeeeeeeffffffffff00000000001111111111
Run Code Online (Sandbox Code Playgroud)

例如,如果提交aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd存在于master但不存在new-feature,而提交eeeeeeeeeeffffffffff00000000001111111111存在于new-feature但不存在master

(诸如cherry-mark等选项--left-only修改或替换标记以指示哪些提交是补丁等效的(如果有的话),或者省略左侧或右侧,或两者。对于这种情况,您不需要这些。)

从 获取列表后git rev-list,您可以根据需要重新格式化它。您可以使用这些相同的选项,git log但通常最好先收集哈希 ID,然后处理格式,除非git log--pretty=format:...指令恰好与您需要的相匹配(要找到答案,请参阅文档“漂亮格式”部分git log) 。