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


208

有没有办法查看分支中哪些文件已更改?



2
他们不是我的员工,而是我的同事,与一般人相比,他们不是特别重要。但是,是的,重新阅读这篇文章似乎有点生气。:)
Raif 2015年

3
可以使用github或bitbucket,gitlab吗?有一些工具可以管理这种情况。开发人员发出拉动请求。收到请求后,您将可以访问一个非常好的界面,该界面将向您显示对每个文件所做的所有更改的差异。您甚至可以发表评论,请求更改等。当更改良好时,您可以接受将更改合并到请求的分支(通常是开发)中的请求。这是处理这种情况的最佳实践方法。
斯科特·赖特

Answers:


166

@Marco Ponti的答案的替代方法,避免了结帐:

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

如果您的特定外壳不了解$()构造,请改用反引号。


1
啊!这很好玩,现在如果我想说<notMainDev>成为我当前所在的分支,该怎么办。那不是必须指定吗?
拉夫

29
git diff --name-only <some-other-branch>会向您显示当前分支和之间的文件不同<some-other-branch>。因此,它本质上是相同的命令,但是请注意,即使它们之间没有远程关联,您也可以使用它来查找任何两个分支之间不同的文件。该比较是否有用取决于分支的拓扑结构。此外,请注意,<some-other-branch>实际上可能是任何提交,也可能是解析为一个的任何内容(标签等)。
twalberg 2012年

嗯,嗯,我想我的意思是我想做git diff --name-only <notMainDev> $(git merge-base <notMainDev> <MY_CURRENT_CO_BRANCH>),其中MY_CURRENT_CO_BRANCH当然是我当前签出的分支
拉夫

您也可以这样做。这将找到在哪里点<notMainDev><MY_CURRENT_CO_BRANCH>最近有一个共同的祖先,和比较<notMainDev>该祖先。不过,您必须提供您当前的分支名称,正如git merge-base预期的那样,有两个参数-至少在当前版本中没有捷径。
twalberg 2012年

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

147

您所要做的只是以下几点:

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

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


哇,太重要了。谢谢。顺便说一句,我爱git。它总是很快速而且很关键
Raif 2012年

23
我相信,这也将显示<mainDev>自分支机构分歧以来发生的变化。您可能想使用它git diff --name-only <sha-of-branch-point>,或者查看我发布的避免结帐的替代答案。
twalberg 2012年

是的,@ twalberg是正确的,如果分支分开,它将显示那些更改。我notMainDev以为可以与mainDev提交保持同步...我通常发现也可以很好地看到这些差异。
Marco Ponti 2012年

您不能仅指定--right-only仅显示右侧已更改的文件吗?
TheZenker '17

您可以<sha-of-branch-point>使用git rev-parse <branch-name>
fc9.30

69

惊讶的是到目前为止还没有说!

git diff master...branch

所以只看到更改 branch

检查当前分支使用

git diff master...

感谢jqr

这是短手

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

因此合并基础(分支之间的最新公共提交)和分支提示

如果您的本地管理员过时,也可以使用Origin / master而不是master来帮助


4
虽然这表明发生了更改,但是它显示了所有更改,而不是已更改文件的摘要...这就是导致我首先进入此页面的原因:)
Chris Rutledge

1
然后将--name-only标志添加到此。或--short-stat
exussum

2
git diff --name-only master..如果您只想两个分支之间的文件名不同。
亚当

1
如果在创建分支后您的母版进行了提交,则此方法将无法正常工作。
Simplylizz

2
@simplylizz是的。多数民众赞成在这正是要解决的问题
exussum,

45

我不敢相信有太多方法可以做到这一点。我使用whatchanged作为以前发布的人,只是带有以下参数:

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

这仅列出文件名,并且仅列出在当前分支上更改的文件名。


3
这似乎是最简单的答案,因为它不需要其他信息。输出看起来正确,并且比接受的答案更容易记住!
RickMeasham '16

1
谢谢,这很有趣,比较罗word。它以相反的顺序提供每个提交的输出。 git-whatchanged-显示具有差异的日志,每次提交都会引入 git-scm.com/docs/git-whatchanged
nealmcb

来自git docsNew users are encouraged to use git-log instead. The whatchanged command is essentially the same as git-log but defaults to show the raw format diff output and to skip merges.
Derek S

21

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

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

1
您的解决方案对我有用,我得到了我希望看到的文件列表。我是Git新手,曾经git diff master... --name-only在目标分支上运行时得到过相同的结果。您是否愿意在您的答案和我提供的命令之间就好与坏之间提供任何反馈?
hungerstar

如果master自分支创建以来没有任何新提交,则您的命令将完全相同。我认为我的命令将等效于git diff master.. --name-only(请注意,只有2个点而不是3个点)。要了解点的含义,请参见此答案
Yep_It's_Me

太棒了!感谢您的快速答复和见解。非常感激。
hungerstar

12

git whatchanged 似乎是一个不错的选择。


1
我到底在寻找什么。
2013年

来自git docsNew users are encouraged to use git-log instead. The whatchanged command is essentially the same as git-log but defaults to show the raw format diff output and to skip merges.
Derek S


8

如果可以这么简单怎么办?

git changed

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

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

这些假设适用于大多数情况下的大多数人,但是您必须意识到自己正在做出这些假设。

另外,您必须使用支持的外壳$()您的shell很可能支持this


3
git show --stat origin/branch_name

这将为您提供在此分支下已添加或修改的文件的列表。


2
这是错误的,它仅显示在该分支的起始提交中更改的文件,而不是整个分支。
davidtbernal '16

2

出于某种原因,没有人提及git-tree。参见https://stackoverflow.com/a/424142/1657819

git-tree首选,因为它是管道命令;意味着程序化的(并且可能更快)

(假设基本分支为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等)


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

1

可接受的答案-- git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)非常接近,但我注意到删除状态错误。我在分支中添加了一个文件,但是此命令(使用--name-status)使我删除了“ A”状态的文件和添加了“ D”状态的文件。

我不得不使用以下命令:

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

0

扩展@twalberg和@iconoclast的内容,如果出于任何原因使用cmd,则可以使用:

FOR /F "usebackq" %x IN (`"git branch | grep '*' | cut -f2 -d' '"`) DO FOR /F "usebackq" %y IN (`"git merge-base %x master"`) DO git diff --name-only %x %y

0

以下批处理文件基于twalberg的答案,但将在Windows中运行:

@ECHO OFF
C:                               :: <== OR USE A DIFFERENT DRIVE
CD \path\to\where\git\files\are  :: <== CHANGE TO THE ACTUAL PATH
SET /p b="Enter full path of an ALREADY MERGED branch to compare with origin/master: "
bash --login -i -c "git diff --name-only %b% $(git merge-base %b1% origin/drop2/master)"
PAUSE

上面假设主分支是origin / master,并且在安装Git时(其中它的位置在路径环境中)包括了git bash。我实际上需要使用配置的差异工具(kdiff3)显示实际差异,因此替换了上面的以下bash命令:

bash --login -i -c "git difftool --dir-diff %b% $(git merge-base %b1% origin/drop2/master)"

0

我使用grep,所以我只得到diff --git行是文件路径:

git diff branchA branchB | grep 'diff --git'
// OUTPUTS ALL FILES WITH CHANGES, SIMPLE HA :)
diff --git a/package-lock.json b/package-lock.json
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.