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

时间:2018-11-01 18:13:25

标签: 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  < 


解决方案:我不知道该怎么做,但我认为 git log --graph做到了,只是视觉上非常混乱风格:

git log --left-right --graph --cherry-pick --oneline master






还是这个?

更好的是,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  <


解决方案::您可能不能单独使用git,但是根据@torek's answer,您可以使用git rev-list主要:< / p>

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

>eb57618eed654685a7999da847628dc5eb27313f
>0da0196ab24542a1a1697b1c0c5efeef6d09e027
>9452f57d97e5fc86e773e7a9fca488b7a0d44a0c
<4fc12fe25a127f8f0dfddf7625c22656c7b2c7c1
<9c0058dcabacfc6560f4fbaf73ea55dd70d27036
>5117fcd041793898683f9469aac00337e9fadd8b






或者仅仅是这个?

更重要的是,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!

当然可以将其反转以获得相反的视图git diff --right-only new-feature master

       commits only in master               
-------------------------------------
xxx - Jul 1st 2018 - latest patches 


解决方案:正如@brentjanderson points outgit log master..new-featuregit cherry -v master一样:

git cherry -v master..new-feature

+ c00335cd93898683f9469aafad8a8476227b117f WIP do things
+ f5c86e777d97e5f3e7a9fca488b79a0d44ac9452 WIP do more
+ 0ef6ddda576180196ab7b1c0c57eefe009e027dc Finished!

以及

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!



P.S。我之前曾尝试过git checkout new-feature; git log --left-right --graph --cherry-pick --oneline master,但无法在输出中显示标题或故事(或结尾)。实际上,经过深思熟虑,我敢打赌要拿出输出,将其侧向旋转,然后将其作为excitebike地图播放就可以了。嗯...

3 个答案:

答案 0 :(得分:2)

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

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 2018Mar 01 2018),因为strftime不支持该日期。如果这是一个困难的要求,我建议编写一个批处理脚本。

答案 1 :(得分:1)

我认为在git cherry -v master分支上运行new-feature应该可以在右侧运行。然后在列表左侧对母版进行相反操作

答案 2 :(得分:1)

  

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

按照集合论,这是可从分支X和Y到达的提交集合的symmetric difference

这个特殊的集合分组非常有用,可以使用the gitrevisions documentation中描述的语法,并使用三个点: X...Y 将其内置到Git版本解析器中。 >

  

如何获取它们[以某种特定方式格式化]

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

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

会给您:

<aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd
>eeeeeeeeeeffffffffff00000000001111111111

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

(诸如cherry-mark--left-only之类的选项等会修改或替换标记,以指示哪些提交与补丁等效(如果有的话),或者省略左侧或右侧,或者两者都省略。)如果您不想要这些。)

已经从git rev-list获得了列表,您可以根据自己的意愿重新设置格式。您可以对git log使用这些相同的选项,但是通常最好先收集哈希ID,然后再处理格式,除非git log的{​​{1}}指令与您的匹配需要(要查找,请参阅the PRETTY FORMATS section of the git log documentation)。