297

有没有办法查看分支中的哪些文件发生了变化?

4

16 回答 16

218

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

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

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

于 2012-05-17T18:53:56.150 回答
189

您所要做的就是:

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

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

于 2012-05-17T18:26:35.983 回答
97

很惊讶到目前为止还没有说过!

git diff main...branch

所以只能看到变化branch

检查当前分支使用

git diff main...

感谢 jqr

这是简写

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

所以合并基础(分支之间最近的共同提交)和分支提示

origin/main如果您的本地主要日期已过时,也使用而不是仅使用 master 将有所帮助

于 2017-01-05T13:19:54.383 回答
59

我不敢相信有这么多方法可以做到这一点。我使用 whatchanged 作为某人之前发布的内容,只是带有以下论点:

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

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

于 2016-12-01T10:26:05.803 回答
28

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

git diff --name-only $(git merge-base master HEAD)
于 2017-01-04T06:29:21.033 回答
17
git diff --name-only master...branch-name

我们要与之比较的。

于 2018-05-18T11:07:50.913 回答
16

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/

于 2020-11-17T18:22:32.577 回答
14

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

于 2016-09-15T09:07:18.653 回答
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

于 2016-04-18T22:32:51.573 回答
3
git show --stat origin/branch_name

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

于 2016-01-07T09:26:58.677 回答
3

由于某种原因没有人提到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等等)

于 2019-11-21T10:05:22.697 回答
3

考虑到您在功能分支上,并且您想检查与 master 相比哪些文件发生了更改......只是这样:

git diff --name-only master
于 2020-10-15T20:38:49.010 回答
2

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

我不得不改用这个命令:

git diff --name-only $(git merge-base <notMainDev> <mainDev>)
于 2018-07-10T06:33:17.197 回答
1

我使用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
于 2017-11-10T05:09:02.657 回答
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
于 2016-06-02T13:41:46.343 回答
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)"
于 2016-12-14T10:18:53.507 回答