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

时间:2012-05-17 18:22:59

标签: git branch

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

16 个答案:

答案 0 :(得分:125)

@Marco Ponti的答案的另一种选择,并避免结帐:

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

如果您的特定shell不理解$()构造,请改用back-ticks。

答案 1 :(得分:113)

您需要做的就是:

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

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

答案 2 :(得分:49)

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

git diff master...branch

因此,请仅在branch

上查看更改

检查当前分支使用

git diff master...

感谢jqr

这是

的简写
git diff $(git merge-base master branch) branch

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

如果您的本地主人约会

,也可以使用origin / master而不是master

答案 3 :(得分:36)

我无法相信有很多方法可以做到这一点。我使用之前发布的内容,只需使用以下参数:

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

这只列出了文件名,只列出了当前分支上的文件名。

答案 4 :(得分:17)

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

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

答案 5 :(得分:11)

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

答案 6 :(得分:8)

如果这么简单怎么办?

git changed

如果您愿意假设主分支被调用&#34; master&#34;,并且您从master创建了其他分支,那么您可以将此别名添加到~/.gitconfig文件使这很容易:

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

这些假设在大多数情况下适用于大多数人,但您必须意识到自己正在制作它们。

此外,您必须使用支持$()的shell。 It's very likely that your shell supports this

答案 7 :(得分:4)

git show --stat origin/branch_name

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

答案 8 :(得分:1)

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

我们想要比较。

答案 9 :(得分:1)

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

我不得不改用以下命令:

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

答案 10 :(得分:1)

考虑到您位于功能分支上,并且想要检查与主文件相比哪些文件已发生更改……仅此:

git diff --name-only master

答案 11 :(得分:1)

2020年11月更新:

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

git diff --name-only master...


  • 如果您本地的“ master”分支已经过时(在远程后面),请添加一个远程名称(假设其“来源”) git diff --name-only origin/master...

  • 如果还要包含未提交的更改,请删除...

    git diff --name-only master

  • 如果您使用其他主分支名称(例如:“ main”),请用它代替:

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

  • 如果要输出到stdout(因此可复制)

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


对不同选项https://blog.jpalardy.com/posts/git-how-to-find-modified-files-on-a-branch/

的详细解释非常好

答案 12 :(得分: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

答案 13 :(得分: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)"

答案 14 :(得分: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

答案 15 :(得分:0)

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

首选

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等)