如何获取两个 git 分支之间的不同提交列表?
How to get a list of different commits between two git branches?
我想查看两个分支之间仅非公共提交的列表。
我怎样才能得到这样的输出?
基本上是两个分支之间的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 但是,根据 ,你可以得到 mostly 有 git rev-list
:
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
解决方案:因为、git log main..new-feature
和git cherry -v main
都这样做:
git cherry -v main
+ 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 地图来玩,这会成为一个很好的故事。嗯...
我认为 运行 git cherry -v master
在你的 new-feature
分支上应该适用于右侧。然后在列表左侧的 master 上执行相反的操作
这是一个没有花哨格式的基本变体:
git log master..new-feature
交换分支顺序可以获得"left side"或"right side"数据:
git log left-side-branch..right-side-branch
这也适用于其他引用(提交哈希、远程分支、标签)。
要获得您想要的完整日期格式:
git log master..new-feature --format="%h - %ad - %s" --date=format:'%b %d %Y'
这不支持序号日期(Mar 1st 2018
是 Mar 01 2018
),因为 strftime 不支持。如果这是一个硬性要求,我建议编写一个批处理脚本。
I want to see a list of only non-common commits between two branches.
在集合论中,这是可从分支 X 和 Y 到达的提交集合的 symmetric difference。
这个特定的集合分组非常有用,它被内置到 Git 修订解析器中,使用 the gitrevisions documentation 中描述的语法,使用三个点:X...Y
.
How can I get them [formatted in some particular way]
从 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
但不存在于 [=18] =].
(cherry-mark
和 --left-only
等选项修改或替换标记以指示哪些提交是补丁等效的(如果有),或者省略左侧或右侧,或两者。对于这种情况,您不需要这些。)
从 git rev-list
获得列表后,您可以根据需要重新设置格式。您可以对 git log
使用这些相同的选项,但通常最好先收集哈希 ID,然后再处理格式,除非 git log
的 --pretty=format:...
指令恰好与您的匹配需要(要找出答案,请参阅 the PRETTY FORMATS section of the git log
documentation)。
我想查看两个分支之间仅非公共提交的列表。
我怎样才能得到这样的输出?
基本上是两个分支之间的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 但是,根据 git rev-list
:
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
解决方案:因为git log main..new-feature
和git cherry -v main
都这样做:
git cherry -v main
+ 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 地图来玩,这会成为一个很好的故事。嗯...
我认为 运行 git cherry -v master
在你的 new-feature
分支上应该适用于右侧。然后在列表左侧的 master 上执行相反的操作
这是一个没有花哨格式的基本变体:
git log master..new-feature
交换分支顺序可以获得"left side"或"right side"数据:
git log left-side-branch..right-side-branch
这也适用于其他引用(提交哈希、远程分支、标签)。
要获得您想要的完整日期格式:
git log master..new-feature --format="%h - %ad - %s" --date=format:'%b %d %Y'
这不支持序号日期(Mar 1st 2018
是 Mar 01 2018
),因为 strftime 不支持。如果这是一个硬性要求,我建议编写一个批处理脚本。
I want to see a list of only non-common commits between two branches.
在集合论中,这是可从分支 X 和 Y 到达的提交集合的 symmetric difference。
这个特定的集合分组非常有用,它被内置到 Git 修订解析器中,使用 the gitrevisions documentation 中描述的语法,使用三个点:X...Y
.
How can I get them [formatted in some particular way]
从 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
但不存在于 [=18] =].
(cherry-mark
和 --left-only
等选项修改或替换标记以指示哪些提交是补丁等效的(如果有),或者省略左侧或右侧,或两者。对于这种情况,您不需要这些。)
从 git rev-list
获得列表后,您可以根据需要重新设置格式。您可以对 git log
使用这些相同的选项,但通常最好先收集哈希 ID,然后再处理格式,除非 git log
的 --pretty=format:...
指令恰好与您的匹配需要(要找出答案,请参阅 the PRETTY FORMATS section of the git log
documentation)。