有没有从点或分支起源"git diff"的快速方法?

use*_*686 44 git git-diff

我已经查看了有关使用git diff和git修订(HEAD,ORIG_HEAD,FETCH_HEAD等)的各种SO答案,我仍然没有找到一种简单的方法来列出自本地分支开始以来所做的更改,或者自上次以来变基.

通过简单的我的意思是,无需查找并粘贴提交SHA也不必指望我想多少提交回头.

git diff origin/master 是接近,但它指的是遥控器,因为我检查了它的新分支.

我希望有类似的东西git diff BASE_HEAD可供选择.

......除非已经有办法做到这一点.有人有答案吗?

fra*_*ale 40

你可以找到分支点使用git merge-base.考虑您感兴趣master的主线和dev分支.要找到dev分支的点master,运行:

git merge-base --fork-point master dev
Run Code Online (Sandbox Code Playgroud)

我们现在可以dev反对这个基础:

git diff $(git merge-base --fork-point master dev)..dev
Run Code Online (Sandbox Code Playgroud)

如果dev当前分支,则简化为:

git diff $(git merge-base --fork-point master)
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅git-merge-base文档.

  • 如果你的基础不是“master”,这将不起作用。如果您不记得哪个分支是基础,那么怎么办? (4认同)
  • 请注意,一旦“dev”分支合并到“master”,“git merge-base”就不会返回任何输出。为此,请参阅:/sf/ask/2139217951/ (2认同)

o11*_*11c 28

使用git diff @{u}...HEAD,有三个点.

有两个点,或者HEAD省略,它将显示两侧变化的差异.

有三个点,它只会显示你身边变化的差异.

编辑:对于需求略有不同的人,您可能会感兴趣git merge-base(请注意,它有比其他答案更多的选项).

  • 我认为使用上游可能会令人困惑.为什么不只是`git diff master ... HEAD`? (8认同)
  • 如果你使用较新的 git 版本,你可以简单地使用 `git diff --merge-base <target_branch>` (3认同)
  • @ {u}是上游。但是我并不总是定义上游... (2认同)
  • `@{u}` 中的 `u` 是什么意思? (2认同)
  • @TorKlingberg它是`@ {upstream}'的缩写,这些都记录在`git rev-parse --help`中 (2认同)
  • @TaylorEdmiston 我尝试过这个,但我没有看到这个问题。`git diff` 手册页还表明,由于 `merge-base`,您不应该看到在分支点之后所做的来自 `master` 的更改:_"git diff A...B" 相当于“git diff $(git-merge-base AB) B”_. 你确定你用的是3点吗? (2认同)

cri*_*mbo 7

您可以使用以下方法从分支起始点区分当前分支:

git diff (start point)...
Run Code Online (Sandbox Code Playgroud)

其中(起始点)是分支名称,commit-id或标记.

例如,如果您正在处理分支的功能分支develop,则可以使用:

git diff develop...
Run Code Online (Sandbox Code Playgroud)

对于自分支点以来当前分支的所有更改.

这已在评论中提及,但我认为它应该得到回答.我不知道自从上次变种以来它会做什么.


Law*_*oot 5

对于差异,您需要三点符号。如果您的分支被调用dev并且它从master以下分支:

% git diff master...dev
Run Code Online (Sandbox Code Playgroud)

对于日志,您需要两点表示法:

% git log master..dev
Run Code Online (Sandbox Code Playgroud)

修订语法r1..r2(带两个点)的意思是“从r2(包含)可到达的所有东西,但从(包含的)不可到达的r1”。使用它的正常方法是考虑r1r2指定一系列提交(r1独占、r2包含)中的范围,因此如果您有 10 个修订,3..7将显示更改 4、5、6 和 7。它是{1, 2, 3, 4, 5, 6, 7}减号{1, 2, 3}。但r1不一定必须是r2. 把它想象成一个集合操作,r1r1后面开始代表整个祖先,从后面r2代表整个祖先r2,你从第二个集合中减去第一个集合。

那么:

git log master..dev
Run Code Online (Sandbox Code Playgroud)

是分支的整个历史减去 master 的整个历史。换句话说,只是分支。