【发布时间】:2010-12-05 20:35:42
【问题描述】:
我在存储库中有一堆提交。我想查看两次提交之间更改的文件列表 - 从 SHA1 到 SHA2。
我应该使用什么命令?
【问题讨论】:
-
您应该更改问题标题...您不想列出更改的文件名...您想列出更改的文件名。请注意,可以更改文件名而不更改其内容。
我在存储库中有一堆提交。我想查看两次提交之间更改的文件列表 - 从 SHA1 到 SHA2。
我应该使用什么命令?
【问题讨论】:
git diff --name-only SHA1 SHA2
您只需要包含足够的 SHA 哈希来识别提交。例如,您也可以这样做
git diff --name-only HEAD~10 HEAD~5
查看第十次最新提交和第五次最新提交(左右)之间的差异。
【讨论】:
git show --name-only SHA1.
git diff --name-status [TAG|SHA1] 也显示了对文件进行了哪些操作
git diff --name-status 似乎不想显示添加的文件。 @sschuberth 指出 git show,这对我来说似乎工作正常:git show --pretty=format: --name-status。只是做git show --name-status 提供了更多信息,但仍然很好而且密集......这将是我的新 goto 命令;)
git diff --name-status [SHA1 [SHA2]]
就像--name-only,除了你得到一个简单的前缀告诉你文件发生了什么(修改、删除、添加......)
git log --name-status --oneline [SHA1..SHA2]
类似,但提交信息列在提交消息之后,因此您可以看到文件何时更改。
如果您对某些文件/文件夹发生的情况感兴趣,可以将 -- <filename> [<filename>...] 附加到git log 版本。
如果您想查看单个提交发生了什么,请将其命名为 SHA1,然后执行git log --name-status --oneline [SHA1^..SHA1]
文件状态标志:
| Flag | Name | Meaning |
|---|---|---|
M |
modified | File has been modified |
C |
copy-edit | File has been copied and modified |
R |
rename-edit | File has been renamed and modified |
A |
added | File has been added |
D |
deleted | File has been deleted |
U |
unmerged | File has conflicts after a merge |
【讨论】:
--relative[=<path>] 选项可能对您有所帮助,我不确定。否则总是有| erep -v '(.tmp|.foo|.dontwant)$' ...
egrep?
但要查看您的分支与其共同祖先与另一个分支(例如 origin/master)之间的文件更改:
git diff --name-only `git merge-base origin/master HEAD`
【讨论】:
git diffstatus master 或类似的,这会触发上述情况。
git show --pretty=format: --name-only origin/master..。
git diff --name-only HEAD...master(注意三个点)。详细解释见here。
git diff --name-only master..branch 不对应 github PR 列表。这种方式更精确。但无论如何,我有 173 个 chaned 文件,而 github PR 中有 171 个。 (没有 merge-base 我有 228 对 171)
补充@artfulrobot 的答案,如果你想在两个分支之间显示更改的文件:
git diff --name-status mybranch..myotherbranch
注意优先级。如果您先放置较新的分支,那么它会将文件显示为已删除而不是已添加。
添加grep 可以进一步完善:
git diff --name-status mybranch..myotherbranch | grep "A\t"
这将只显示在myotherbranch 中添加的文件。
【讨论】:
--diff-filter 本身提供了此功能,这意味着错误结果的可能性较小(例如误报)
"A\t",这将不起作用。你需要grep "^A\t"
使用
git log --pretty=oneline > C:\filename.log
这将只记录一个单行 (--pretty=oneline),它是已更改文件的名称。它还会将所有详细信息记录到您的输出文件中。
【讨论】:
git log --pretty=oneline 只给我 SHA 和使用 git 2.10.1 的提交消息
这将显示文件中的更改:
git diff --word-diff SHA1 SHA2
【讨论】:
将以下别名添加到您的~/.bash_profile 文件中,然后运行source ~/.bash_profile;现在任何时候你需要在你的 git 存储库中查看上次提交、运行 showfiles 中的更新文件。
alias showfiles='git show --pretty="format:" --name-only'
【讨论】:
git config --global alias.showfiles 'show --pretty="format:" --name-only' 变成git showfiles。
另外请注意,如果您只想查看上次提交和之前的提交之间更改的文件,这可以正常工作:
git show --name-only
【讨论】:
基于git diff --name-status,我编写了git-diffview Git 扩展,它呈现了两个路径之间变化的分层树视图。
【讨论】:
好像没有人提到开关--stat:
$ git diff --stat HEAD~5 HEAD
.../java/org/apache/calcite/rex/RexSimplify.java | 50 +++++++++++++++++-----
.../apache/calcite/sql/fun/SqlTrimFunction.java | 2 +-
.../apache/calcite/sql2rel/SqlToRelConverter.java | 16 +++++++
.../org/apache/calcite/util/SaffronProperties.java | 19 ++++----
.../org/apache/calcite/test/RexProgramTest.java | 24 +++++++++++
.../apache/calcite/test/SqlToRelConverterTest.java | 8 ++++
.../apache/calcite/test/SqlToRelConverterTest.xml | 15 +++++++
pom.xml | 2 +-
.../apache/calcite/adapter/spark/SparkRules.java | 7 +--
9 files changed, 117 insertions(+), 26 deletions(-)
还有--numstat
$ git diff --numstat HEAD~5 HEAD
40 10 core/src/main/java/org/apache/calcite/rex/RexSimplify.java
1 1 core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java
16 0 core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
8 11 core/src/main/java/org/apache/calcite/util/SaffronProperties.java
24 0 core/src/test/java/org/apache/calcite/test/RexProgramTest.java
8 0 core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
15 0 core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
1 1 pom.xml
4 3 spark/src/main/java/org/apache/calcite/adapter/spark/SparkRules.java
和--shortstat
$ git diff --shortstat HEAD~5 HEAD
9 files changed, 117 insertions(+), 26 deletions(-)
【讨论】:
正如 artfulrobot 在他的回答中所说:
git diff --name-status [SHA1 [SHA2]]
我的例子:
git diff --name-status 78a09k12067c24d8f117886c4723ccf111af4997
4b95d595812211553070046bf2ebd807c0862cca
M views/layouts/default.ctp
M webroot/css/theme.css
A webroot/img/theme/logo.png
【讨论】:
以下内容对我很有效:
git show --name-only --format=tformat: SHA1..SHA2
它也可以与单个提交一起使用:
git show --name-only --format=tformat: SHA1
这对于在Jenkins 中使用非常方便,您可以在其中获得变更集 SHA 哈希值的列表,并希望对其进行迭代以查看哪些文件已被更改。
这与之前的几个答案相似,但使用 tformat: 而不是 format: 会删除提交之间的分隔空间。
【讨论】:
对于只需要关注 Java 文件的人来说,这是我的解决方案:
git diff --name-status SHA1 SHA2 | grep '\.java$'
【讨论】:
如果有人正在查找已更改文件的列表,包括暂存文件
git diff HEAD --name-only --relative --diff-filter=AMCR
git diff HEAD --name-only --relative --diff-filter=AMCR sha-1 sha-2
如果需要绝对路径,请删除 --relative。
【讨论】:
以前每个答案的最大问题是,如果您想使用您试图从存储库中取出的信息,您会被输入一个寻呼机,这非常烦人。 特别是如果您是一名开发人员,他们宁愿学习您应该开发的应用程序的业务逻辑,而不是学习 vim 命令。
使用 --no-pager 解决了这个问题。
git --no-pager diff --name-only sha1 sha2
【讨论】: