有没有办法查看分支中的哪些文件发生了变化?
16 回答
@Marco Ponti 的答案的替代方案,并避免结帐:
git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)
如果您的特定 shell 不理解 $() 构造,请改用反引号。
您所要做的就是:
git checkout <notMainDev>
git diff --name-only <mainDev>
这将只显示两个分支之间不同的文件名。
很惊讶到目前为止还没有说过!
git diff main...branch
所以只能看到变化branch
检查当前分支使用
git diff main...
感谢 jqr
这是简写
git diff $(git merge-base main branch) branch
所以合并基础(分支之间最近的共同提交)和分支提示
origin/main
如果您的本地主要日期已过时,也使用而不是仅使用 master 将有所帮助
我不敢相信有这么多方法可以做到这一点。我使用 whatchanged 作为某人之前发布的内容,只是带有以下论点:
git whatchanged --name-only --pretty="" origin..HEAD
这仅列出文件名,并且仅列出在当前分支上更改的文件名。
我真的很喜欢@twalberg 的回答,但我不想一直输入当前的分支名称。所以我用这个:
git diff --name-only $(git merge-base master HEAD)
git diff --name-only master...branch-name
我们要与之比较的。
2020 年 11 月更新:
要获取当前分支中修改(和提交!)的文件列表,您可以使用标准git使用最短的控制台命令:
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/
git whatchanged
似乎是一个不错的选择。
如果它可以像这样简单呢?
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。
git show --stat origin/branch_name
这将为您提供已在此分支下添加或修改的文件的列表。
由于某种原因没有人提到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
接受的答案 - git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)
- 非常接近,但我注意到它的删除状态错误。我在分支中添加了一个文件,但是这个命令(使用--name-status
)给了我删除“A”状态的文件和我添加“D”状态的文件。
我不得不改用这个命令:
git diff --name-only $(git merge-base <notMainDev> <mainDev>)
我使用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
扩展 @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
以下批处理文件基于 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)"