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

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

201529 次浏览

你所要做的就是:

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

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

@Marco Ponti的另一个答案,避免结帐:

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

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

git show --stat origin/branch_name

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

如果真能这么简单呢?

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。您的shell很可能支持这一点

扩展@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

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

真不敢相信有这么多方法可以做到。我使用之前有人发布的whatchanged,只是带有以下参数:

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

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

下面的批处理文件是基于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(它的位置在path环境中)。我实际上需要使用配置的diff工具(kdiff3)来显示实际的差异,因此替换了上面的以下bash命令:

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

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

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

令人惊讶的是,到目前为止还没有人这么说!

git diff main...branch

所以只能在branch上看到变化

检查当前分支的使用情况

git diff main...

感谢jqr

这是简称

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

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

此外,使用origin/main而不仅仅是master将有助于防止本地main过期

我使用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
git diff --name-only master...branch-name

我们要与之进行比较。

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

我不得不使用这个命令:

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

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

考虑到你在一个特性分支上,你想要检查哪些文件与master…就在这个:

git diff --name-only master

2020年11月更新:

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

git diff --name-only master...


  • 如果你当地的“大师”;分支已经过时(在远程的后面),添加一个远程名称(假设它是"origin"):

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

  • 如果你想包含未提交的更改,删除...:

    git diff --name-only master

  • 如果你使用不同的主分支名称(例如:"main"),替换它:

    git diff --name-only main...

  • 如果你想输出到stdout(所以它是可复制的):

    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/

是什么

git diff --name-only HEAD~1