获取在git分支中被修改过的所有文件

361
有没有一种方法可以查看分支中哪些文件发生了更改?

6
可能是重复问题:如何找出分支中已修改的文件? - Matt Ball
2
他们不是我的员工,而是我的同事,重点并不在于他们个人,而是普遍的人。但是,重新阅读这篇文章,它似乎有点过于激动了。 :) - Raif
4
你可以使用GitHub、Bitbucket或GitLab等工具来管理这种情况。开发者会创建一个拉取请求,你将得到该请求并可以访问一个很好的界面,此界面将展示每个文件所做出的所有更改的差异。你甚至可以进行评论、要求更改等操作。当更改确认无误后,你可以接受该请求,这将将更改合并到请求的分支(通常为develop)。这是处理这种情况的最佳实践方式。 - Scott Wright
这个回答解决了你的问题吗?如何找出分支中已修改的文件? - mahen3d
17个回答

255

避免检出并且与 @Marco Ponti 的答案不同的另一种选择:

git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)

如果你的特定shell不理解$()结构,请使用反引号替代。


2
啊!这真是有趣,那如果我想让<notMainDev>成为我当前所在的分支呢?也就是不需要指定它? - Raif
50
git diff --name-only <some-other-branch>这个命令会显示出你当前所在分支和<some-other-branch>之间不同的文件。这基本上是相同的命令,但请注意,你可以使用它来查找任意两个分支之间的不同文件,即使它们彼此无关。这种比较是否有用取决于你的分支拓扑结构...另外,请注意<some-other-branch>可以是任何提交,或任何可解析为提交的东西(标签等)。 - twalberg
1
好的!我明白了。这是我的同事,他叫什么名字。git merge-base <notMainDev> git branch | grep '\*' | awk '{print $2}' 这将获取<notMainDev>和我的当前分支之间的分支提交。然后我可以执行 git diff --name-only <notMainDev> $(git merge-base <notMainDev> git branch | grep '\*' | awk '{print $2}')。 - Raif
1
对于像我这样的初学者,一个提示... git diff --name-only origin/branchX $(git merge-base origin/branchX origin/master)git diff --name-only branchX $(git merge-base branchX master) 的区别在于前者可以正确执行,而后者会出现 fatal: Not a valid object name branchX. fatal: ambiguous argument 'branchX': unknown revision or path not in the working tree. 的错误提示。 - jxramos
2
使用 Git 2.30 或更新版本,上述代码可以被替换为 git diff --merge-base <notMainDev> --name-only <mainDev> - nachtjasmin
显示剩余9条评论

230

你只需要执行以下操作:

git checkout <notMainDev>
git diff --name-only <mainDev>

这将仅显示两个分支之间不同的文件名。


哇,简洁明了。谢谢。顺便说一下,我喜欢 Git。它总是快速而且简洁。 - Raif
30
我相信这也会显示出在分支分叉后<mainDev>上发生的更改。你可能想使用git diff --name-only <sha-of-branch-point>代替,或者查看我发布的避免检出的备选答案。 - twalberg
是的,@twalberg说得对,如果分支已经分叉,它会显示这些更改。我假设notMainDev将与mainDev提交保持最新状态...不过,我通常也发现查看这些差异很有用。 - Marco Ponti
1
你能不能只指定--right-only来仅显示右侧更改的文件? - TheZenker
2
你可以使用 git rev-parse <branch-name> 命令获取 <branch-name> 分支点的 SHA 值。 - fc9.30

118

惊讶到目前为止还没有人说过这个!

git diff main...branch

只在 分支 上查看更改

使用以下命令检查当前分支

git diff main...

感谢 jqr

这是简写形式,意思是

git diff $(git merge-base main branch) branch

因此,合并基础(分支之间最近的公共提交)和分支尖端

另外,使用origin/main而不仅仅是master可以帮助你解决本地主分支过时的问题


8
这显示了发生了哪些变化,但它展示的是所有更改,而不是更改文件的摘要……这正是我最初来到此页面的原因 :) - Chris Rutledge
2
然后添加--name-only标志或--short-stat标志。 - exussum
9
如果您只想要两个分支之间不同的文件名称,可以使用命令 git diff --name-only master.. - Adam
4
如果您在创建分支后,主分支有新的提交,那么这种方法将无法正常工作。 - simplylizz
4
是的,它确实可以解决这个问题。 - exussum
显示剩余7条评论

76

我简直不敢相信有这么多方法可以做到这一点。像之前某人发布的那样,我使用whatchanged,只是使用以下参数:

git whatchanged --name-only --pretty="" origin..HEAD

这仅列出文件名,仅限于当前分支上更改的文件。


3
这似乎是最简单的答案,因为它不需要额外的信息。输出结果看起来正确,并且比被采纳的答案更容易记忆! - RickMeasham
1
谢谢,这很有趣,更加冗长。它提供了每个提交的输出,并以相反的顺序显示。git-whatchanged - 显示每个提交引入差异的日志 https://git-scm.com/docs/git-whatchanged - nealmcb
2
git文档中:鼓励新用户使用git-log。whatchanged命令本质上与git-log相同,但默认显示原始格式的diff输出并跳过合并。 - Derek
3
这似乎是我正在寻找的,只打印分支所做的更改。但它会打印文件两次,所以我将其管道传输到 sort -u - jxramos
1
是的,像@jxramos提到的那样,whatchanged的问题实际上是git log,因此它按提交逐个显示内容。如果您对同一文件进行了多次提交,则会得到这些名称的多个副本(与git diff不同)。 - Jaykul
显示剩余2条评论

34

2020年11月更新:

要获取当前分支中修改的文件列表(已提交!),可以使用标准的命令来获得最短的控制台命令:

git diff --name-only master...


  • 如果您的本地“master”分支已过时(落后于远程),请添加远程名称(假设它是“origin”):

    git diff --name-only origin/master...

  • 如果您也想包含未提交的更改,请删除...

    git diff --name-only master

  • 如果您使用不同的主分支名称(例如:“main”),请替换它:

    git diff --name-only main...

  • 如果您想将输出发送到标准输出(因此可以复制):

    git diff --name-only master... | cat

  • 如果您想在VSCode终端中使文件名可点击,无论您从哪个文件夹运行此命令,请添加--relative

    git diff --name-only --relative master... | cat


有关不同选项的详细说明,请参见https://blog.jpalardy.com/posts/git-how-to-find-modified-files-on-a-branch/


diff有更多的选项,总体而言[tag:git-diff]非常棒;) - c69

33

我真的很喜欢@twalberg的答案,但我不想一直打当前分支的名称。所以我用了这个:

git diff --name-only $(git merge-base master HEAD)

3
您的解决方案对我很有效,我得到了我期望看到的文件列表。我是Git新手,并且在目标分支上运行git diff master... --name-only时得到了相同的结果。您能否提供一些反馈,说明您的答案与我提供的命令之间的优缺点? - hungerstar
2
如果自从你创建分支以来,主分支没有新的提交,那么你的命令将完全相同。我认为我的命令将等同于 git diff master.. --name-only(请注意只有两个点而不是三个)。要了解这些点的含义,请参见此答案 - Yep_It's_Me
1
太棒了!感谢您的快速回复和见解。非常感激。 - hungerstar

20
git diff --name-only master...branch-name

我们想要进行比较的对象。


似乎是现有答案的一部分,https://dev59.com/DWgv5IYBdhLWcg3wYv2i#41486181 - James Skemp
1
这个变量比较主分支的HEAD和当前分支。接受的答案比较在您forked点时master的状态。根据您想要知道的内容,两者都可能有您要找的答案。 - Mark Stosberg

15

git whatchanged 似乎是一个不错的替代品。


2
我究竟在寻找什么。 - Sild
1
git文档中:鼓励新用户使用git-log。whatchanged命令本质上与git-log相同,但默认显示原始格式的diff输出并跳过合并。 - Derek

8
如果能像这样简单,那该多好呀?
git changed

如果您愿意假设主分支称为“master”,并且您从主分支创建其他分支,则可以将以下别名添加到您的~/.gitconfig文件中,以使其变得容易:

cbranch = !"git branch | grep '*' | cut -f2 -d' '"
changed = !"git diff --name-only $(git cbranch) $(git merge-base $(git cbranch) master)"

这些假设对于大多数人和大多数情况都是适用的,但你必须意识到你正在进行它们。

此外,您必须使用支持$()的shell。很可能您的shell支持此功能


4

出于某种原因,没有人提到git-tree。请参阅https://dev59.com/PHRC5IYBdhLWcg3wD8xV#424142

git-tree更受欢迎,因为它是一个plumbing命令;意味着应该以编程方式使用(并且可能更快)

(假设基本分支是master)

git diff-tree --no-commit-id --name-only -r master..branch-name

然而这将显示分支中受影响的所有文件,如果您只想查看明确修改过的文件,则可以使用--diff-filter

git diff-tree --no-commit-id --name-only -r master..branch-name --diff-filter=M

也可以使用--name-status代替--name-only来查看文件的状态(如A/M/D等)


这正是我需要的,可以对更改的文件进行linting,同时排除已删除的文件。 rubocop --fail-level error $(git diff-tree --no-commit-id --name-only -r origin/master..HEAD --diff-filter=M) - HarlemSquirrel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接