ChatGPT解决这个技术问题 Extra ChatGPT

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

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

git checkout master
git log

然后一个

git checkout branch-X
git log

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

关于此页面上的答案,此陈述是否正确? (大多数使用 git log。)即使两个分支都包含相同的更改,提交也可能会被列为一个分支中不存在而存在于另一个分支中的提交。为什么? Git 日志依赖于 shas,它是使用在正常操作(树、时间戳等)中易变的信息来计算的。示例:选择提交将创建一个新的 sha,即使提交中的更改未更改。虽然 OP 专门询问“提交”,但大多数人关心“更改”,这是一个有意义的区别。 Git 日志可能会提供误导性信息。

P
Pablo Fernandez heelhook

你可以很容易地做到这一点

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 上”的提交列表中。
M
Matthieu

您可以获得一个非常好的视觉输出,说明您的分支与此有何不同

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 的缩写
z
zainengineer

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

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
m
mmaruska

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

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

这与 git master..branch-X 有什么不同?
当然,“git cherry”很聪明:它将“提交”转换为“补丁/差异”,并且可以避免报告两个分支上但以不同顺序应用的“补丁”。
输出每个提交的 SHA1,前缀为 - 表示在 master 中具有等价的提交,+ 表示没有的提交。
这特别适用于基于补丁的工作流程,其中提交通常被精心挑选并应用于其他分支。
m
mvp

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

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

git log --oneline --decorate

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

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

s
snowcamel

如果你想使用 gitk:

gitk master..branch-X

它有一个不错的老式 GUI


gitk可以在暗模式下打开吗?
只是反转窗口的颜色
C
Community

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

https://i.stack.imgur.com/eCxXC.png

转到您的存储库:Insights -> Network


此外,创建拉取请求也会显示分支差异。
这仅适用于公共回购。如果我有私人回购并且管理员没有为我提供所有访问权限来回答问题怎么办?对于此当前答案无效。
c
claudiu.f.marginean

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

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

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

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


这个!!!谢谢!否则我会得到“未知的修订或路径不在工作树中”。
M
Maroun

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

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
K
Kim Briggs
#! /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 命令替换为启动可视差异工具的命令。