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

Posted

技术标签:

【中文标题】如何查看 git 中分支之间的提交差异?【英文标题】:How do I see the commit differences between branches in git? 【发布时间】:2012-12-07 13:45:02 【问题描述】:

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

git checkout master
git log

然后是一个

git checkout branch-X
git log

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

【问题讨论】:

可能相关:Using Git, show all commits that are in one branch, but not the other(s). 关于本页答案的陈述是否正确? (大多数使用 git log。)即使两个分支都包含相同的更改,提交也可能会被列为一个分支中不存在而存在于另一个分支中的提交。为什么? Git 日志依赖于 shas,它是使用在正常操作(树、时间戳等)中易变的信息来计算的。示例:选择提交将创建一个新的 sha,即使提交中的更改没有改变。虽然 OP 特别询问“提交”,但大多数人关心“更改”,这是一个有意义的区别。 Git 日志可能会提供误导性信息。 【参考方案1】:

您可以轻松做到这一点

git log master..branch-X

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

【讨论】:

如果两个分支都包含另一个不包含的提交,是否有一个选项?现在,您必须翻转参数并以两种方式运行它以查看另一个分支不包含的提交。 如果你已经切换到branch-X,你可以使用git log master.. @ElliottSlaughter:如果您想查找 master 或 branch-X 中的提交,但不能同时找到两者,您可以使用 git log master...branch-X(三个点而不是两个点)。请参阅man gitrevisions了解更多信息。 这真的只是答案的一半。 master 中导致分支分歧的任何提交都不会显示 如果提交是从 branch-X 中挑选出来的,这不会过滤掉它们。即使它们实际上在两者中,它们仍将在“在分支 X 中但不在 master 上”的提交列表中..【参考方案2】:

您可以获得非常漂亮的可视化输出,说明您的分支与此有何不同

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

【讨论】:

这不会显示分支之间的差异,尽管这是所要求的。 git log --oneline --graph --all --decorate --abbrev-commit 将以更短/更易读的命令为您提供类似的输出 我喜欢这个:git log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset' 极其复杂。 git log --oneline --graph --all --decorate就够了,--abbrev-commit不是必须的,--oneline--pretty=oneline --abbrev-commit的缩写【参考方案3】:

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

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

git log --oneline --decorate

为了使git log 默认更好,我通常设置这些全局首选项:

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

【讨论】:

【参考方案4】:

如果你想使用 gitk:

gitk master..branch-X

它有一个不错的老式 GUI

【讨论】:

gitk可以在暗模式下打开吗?【参考方案5】:

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

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

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

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

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

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

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

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

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

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

【讨论】:

如果您比较可能有合并的发布分支。您可能喜欢在参数--no-merges 的帮助下删除合并提交(不添加任何值),例如:git log origin/master..HEAD --oneline --no-merges【参考方案6】:

我建议以下内容来查看“提交”中的差异。对于对称差异,请使用反向 args 重复该命令:

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

【讨论】:

这和 git master..branch-X 有区别吗? 当然,“git cherry”很聪明:它将“提交”转换为“补丁/差异”,并且可以避免报告两个分支上但以不同顺序应用的“补丁”。跨度> 输出每个提交的 SHA1,前缀为 - 表示在 master 中具有等价的提交,+ 表示没有的提交。 这特别适用于基于补丁的工作流程,其中提交通常被精心挑选并应用于其他分支。【参考方案7】:
#! /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 命令替换为启动可视差异工具的命令。

【讨论】:

【参考方案8】:

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

转到你的仓库:Insights -> Network

【讨论】:

另外,创建拉取请求也会显示分支差异。 这仅适用于公共回购。如果我有私人回购并且管理员没有为我提供所有访问权限来回答问题怎么办?因为这个当前的答案是无效的。【参考方案9】:

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

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

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 可以确保您使用的是更新的信息。

通过这种方式,每个提交都将在一行中,您可以将其复制/粘贴到文本编辑器中,然后开始将任务与将要合并的提交进行比较。

【讨论】:

这个!!!谢谢!否则我会得到“未知的修订或路径不在工作树中。”【参考方案10】:

如果要根据提交消息进行比较,可以执行以下操作:

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)

【讨论】:

你可以使用git log --format='%s',而不是使用--oneline和管道到cut

以上是关于如何查看 git 中分支之间的提交差异?的主要内容,如果未能解决你的问题,请参考以下文章

Git-实验报告

git 对比两个分支差异

gitlab查看当前分支和master对比

如何查看新的 git 分支将推送哪些 git 提交?

git更新代码

git 对比两个分支差异