如何查看git中分支之间的提交差异?


341

我在branch-X上,并在其上添加了更多提交。我想看看MASTER和我所在的分支之间在提交方面的所有差异。我可以做一个

git checkout master
git log

然后一个

git checkout branch-X
git log

并从视觉上区分这些,但是我希望有一种更简单,更不易出错的方法。


Answers:


324

您可以得到一个很好的可视化输出,它与此相关的分支如何不同

git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset' --abbrev-commit --date=relative master..branch-X

13
这不会显示您在分支之间的差异,尽管这是要问的。
巴勃罗·费尔南德斯

47
git log --oneline --graph --all --decorate --abbrev-commit将以更短/更易读的命令为您提供类似的输出
Pablo Fernandez foothook

4
我喜欢这样:git log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset'
艾利(Avery)

6
极其复杂。
肖恩·厄克特

11
git log --oneline --graph --all --decorate足够,--abbrev-commit不是必需的,--oneline它的缩写--pretty=oneline --abbrev-commit
avmohan

719

您可以轻松地做到这一点

git log master..branch-X

这将显示您提交了branch-X但master没有的内容。


9
如果两个分支都包含另一个分支不包含的提交,是否可以选择?现在,您必须翻转参数并以两种方式运行它,以查看其他分支不包含的提交。
Elliott Slaughter

38
如果您已经切换到branch-X您可以使用git log master..
Dave

8
@ElliottSlaughter:如果要查找在master或branch-X中但不是同时在两者中的提交,则可以使用git log master...branch-X(三个点代替两个点)。请参阅man gitrevisions以获取更多信息。
Xavier T.

3
实际上,答案只有一半。master中导致分支偏离的任何提交都不会显示
jterm

9
如果已经从分支X挑选了提交来掌握提交,则不会将其过滤掉。即使它们实际上在两个分支中,它们也仍然会列在“在X分支中而不是在主分支中”的提交列表中
。– Tuffwer

86

我认为这是选择和上下文的问题。我更喜欢使用

git log origin/master..origin/develop --oneline --no-merges

它将显示开发中不在master分支中的提交。

如果要查看实际修改了哪些文件,请使用

git diff --stat origin/master..origin/develop --no-merges

如果不指定参数,它将显示完整的差异。如果要查看视觉差异,请meld在Linux或WinMergeWindows上安装。确保它们是默认的difftools。然后使用类似

git difftool -y origin/master..origin/develop --no-merges

如果您想将其与当前分支进行比较。使用HEAD代替使用分支名称更方便:

git fetch
git log origin/master..HEAD --oneline --no-merges

它将显示所有即将合并的提交


1
如果您比较可能具有合并的发布分支。您可能希望借助以下参数来删除合并提交(不添加任何值)--no-mergesgit log origin/master..HEAD --oneline --no-merges
claudiu.f.marginean

15

如果您使用的是Linux,gitg则是一种非常快速且图形化的方法。

如果您坚持使用命令行,则可以使用:

git log --oneline --decorate

为了使git log默认情况更好,我通常设置以下全局首选项:

git config --global log.decorate true
git config --global log.abbrevCommit true

14

我建议以下内容查看“提交”中的区别。对于对称差,请使用倒数args重复该命令:

git cherry -v master [your branch, or HEAD as default]

这与git master..branch-X不同吗?
ilmirons

2
当然,“ git cherry”很聪明:它将“提交”转换为“补丁/差异”,并且可以避免报告在两个分支上都以不同顺序应用的“补丁”。
mmaruska '19

8

如果要使用gitk:

gitk master..branch-X

它有一个不错的老学校


4

不是一个完美的答案,但对于使用Github的人来说效果更好

在此处输入图片说明

转到您的仓库: Insights -> Network


同样,创建请求请求也将显示分支差异。
pkamb

天哪,我想拥抱你。
艾塞拉

@esseara我也是一个大拥抱者:))不客气:D
AI19年

2

如果要基于提交消息进行比较,则可以执行以下操作:

git fetch
git log --oneline origin/master | cut -d' ' -f2- > master_log
git log --oneline origin/branch-X | cut -d' ' -f2- > branchx_log
diff <(sort master_log) <(sort branchx_log)

1
无需使用--oneline管道,cut您可以使用git log --format='%s'
optcyclic

0
#! /bin/bash
if ((2==$#)); then
  a=$1
  b=$2
  alog=$(echo $a | tr '/' '-').log
  blog=$(echo $b | tr '/' '-').log
  git log --oneline $a > $alog
  git log --oneline $b > $blog
  diff $alog $blog
fi

之所以这样做,是因为如果您有可视化的差异工具,它可以使a和b日志在视觉上并排进行差异化。将diff命令替换为命令以启动可视化diff工具。


0

我使用了一些答案,并找到了适合我的情况的答案(确保所有任务都在release分支中)。

其他方法也可以使用,但是我发现它们可能会添加不需要的行,例如不增加任何值的合并提交。

git fetch
git log origin/master..origin/release-1.1 --oneline --no-merges

或者您可以将您的当前水平与硕士

git fetch
git log origin/master..HEAD --oneline --no-merges

git fetch 确保您使用的是最新信息。

这样,每次提交都会在线上,您可以将其复制/粘贴到文本编辑器中,然后开始比较任务和将要合并的提交。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.