如何查看两个提交之间的更改而不提交中间的提交?

605 git diff

你如何git diff只显示两次提交之间的区别,排除其他提交?

One*_*One 570

你可以简单地将2个提交传递给git diff:

-> git diff 0da94be  59ff30c > my.patch
-> git apply my.patch
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.`git diff old_commit_hash new_commit_hash`有效! (45认同)
  • 这个答案完全没有解决这个问题,所以我不知道它为什么会有这么多的赞成.OP特别询问如何获得你给出的第一个命令,第二个命令与任何事情无关. (45认同)
  • patch -p1 <my.patch (3认同)
  • 这个答案并非完全没有回答任何问题。它完美地工作。如果您将两个有问题的提交中的较晚分支分支,然后将此差异应用于该新分支,您将看到两次提交之间的更改,而不会因间歇性提交而头疼。 (3认同)
  • @ynn 所以如果我只是在这里添加所有 git 命令那也会有帮助吗?!答案应该对上下文有帮助。 (3认同)
  • @ nacho4d:git checkout other-branch && git apply my.patch && git add.&& git commit -am"消息" (2认同)
  • @Mr.Hyde 我不确定我是否完全理解,使用它将包括 2 次提交之间的所有更改。 (2认同)

bdo*_*lan 136

要求两个提交之间的差异/两个提交而不包括中间的提交没有多大意义.提交只是存储库内容的快照; 要求两者之间的差异必然包括它们.那么问题是,你到底在寻找什么?

正如威廉所建议的那样,采摘樱桃可以让你在另一个之上重新定位一个单一的提交.那是:

$ git checkout 012345
$ git cherry-pick -n abcdef
$ git diff --cached
Run Code Online (Sandbox Code Playgroud)

这需要提交'abcdef',将其与其直接祖先进行比较,然后将该差异应用于'012345'之上.然后显示出这种新的差异 - 唯一的变化是来自'012345'而不是'abcdef的直接祖先.当然,您可能会遇到冲突等,因此在大多数情况下这不是一个非常有用的过程.

如果你只对abcdef本身感兴趣,你可以这样做:

$ git log -u -1 abcdef
Run Code Online (Sandbox Code Playgroud)

这将abcdef与其直接祖先进行单独比较,通常是您想要的.

而且当然

$ git diff 012345..abcdef
Run Code Online (Sandbox Code Playgroud)

给出了这两个提交之间的所有差异.

这将有助于更好地了解您正在尝试实现的目标 - 正如我所提到的,要求两次提交之间的区别而没有介于两者之间实际上没有意义.

  • 我同意,一般来说,比较两个提交没有多大意义.但是git非常擅长不告诉你应该如何思考.假设您有两个分支,每个分支都有不同的提交,看起来它们对同一组文件进行相同的更改.我希望能够使用git告诉我这两个补丁是否相同而不必相信我的眼睛.我认为这有效用. (35认同)
  • 两个提交之间的差异排除了各自分支上的其他提交是完全合理的:一个提交是从另一个提取,但可能有一些微妙的差异.你想要看到它们是什么而不会被两个分支之间不同的所有其他无关的垃圾混杂在一起. (10认同)
  • @ChrisCleeland,interdiff实用程序在这种情况下可以派上用场.使用git diff来获取每个提交对其直接父对象的差异,然后使用interdiff来比较差异. (8认同)
  • @ChrisCleeland,git不存储补丁.它存储文件内容.它确实有一个使用增量的压缩方案,但增量源不一定与文件的实际历史相关. (3认同)
  • 或者说你将master重新绑定到功能分支上,并且必须解决冲突.然后将`origin/featurebranch #HEAD`与`local/featurebranch#HEAD`进行比较可以帮助您确保在解决冲突期间没有任何问题. (2认同)

ple*_*oos 77

要将两个git提交12345和abcdef作为补丁进行比较,可以使用diff命令作为

diff <(git show 123456) <(git show abcdef)
Run Code Online (Sandbox Code Playgroud)

  • @OneOfOne那不做同样的事情.你建议你比较每个提交的**树**,显示一个_single补丁_.我(和@plexoos)正在做的是比较_two patches_,每个都是由单独的提交引入的 - 换句话说,`diff`输出来自两个`diff`s.这涉及读取和比较两个输入流.`diff`(GNU,或Unix,`diff`)可以做到这一点,而`git diff`则不能.有些人可能想知道为什么会这样做.我现在正在做这件事,清理一个糟糕的合并. (12认同)
  • 你为什么要用git使用GNU diff? (7认同)
  • @OneOfOne`git diff <(git show 123456)<(git show abcdef)`不起作用; `diff <(...)<(...)`的确如此.(我刚刚尝试过). (7认同)
  • 这不会包括 git diff 中所有元数据的 gnu diff 吗? (2认同)
  • 这应该是OP问题的公认答案! (2认同)

roa*_*dev 61

git diff <a-commit> <another-commit> path
Run Code Online (Sandbox Code Playgroud)

例:

git diff commit1 commit2 config/routes.rb
Run Code Online (Sandbox Code Playgroud)

它显示了这些提交之间该文件的差异.


Jua*_*npa 18

假设你有这个

A
|
B    A0
|    |
C    D
\   /
  |
 ...
Run Code Online (Sandbox Code Playgroud)

而且你想确保它A是一样的A0.

这样就可以了:

$ git diff B A > B-A.diff
$ git diff D A0 > D-A0.diff
$ diff B-A.diff D-A0.diff
Run Code Online (Sandbox Code Playgroud)

  • 也可以缩短为单线,就像[@plexoos](/sf/answers/1646934201/)的回答一样:```diff <(git diff BA)<(git diff D A0) )```(与git show相同的结果) (3认同)
  • 那么你想要的是`git range-diff B..A D..A0` (3认同)

bit*_*007 16

要检查完整的更改:

  git diff <commit_Id_1> <commit_Id_2>
Run Code Online (Sandbox Code Playgroud)

仅检查更改/添加/删除的文件:

  git diff <commit_Id_1> <commit_Id_2> --name-only
Run Code Online (Sandbox Code Playgroud)

注意:要检查diff而没有提交,则不需要放置提交ID。


Wil*_*ell 14

假设您想要查看提交012345和abcdef之间的区别.以下应该做你想要的:

$ git checkout 012345
$ git cherry-pick -n abcdef
$ git diff --cached


小智 11

从 Git 2.19 开始,您可以简单地使用:

git range-diff rev1...rev2 - 比较两个提交树,从它们的共同祖先开始

git range-diff rev1~..rev1 rev2~..rev2 - 比较由 2 个给定提交引入的更改


小智 10

那这个呢:

git diff abcdef 123456 | less
Run Code Online (Sandbox Code Playgroud)

如果你想在飞行中比较许多不同的差异,只需将它管道减少就可以了.


Aka*_*ash 10

直接在GitHub上检查差异;你可以 -https://github.com/<username>/<reponame>/compare/<commit1>..<commit2>

和可以是commit1分支名称提交哈希commit2

例如:

阅读比较提交中的更多内容