ChatGPT解决这个技术问题 Extra ChatGPT

如何仅列出在两次提交之间更改的文件的名称

我在存储库中有一堆提交。我想查看两次提交之间更改的文件列表 - 从 SHA1 到 SHA2。

我应该使用什么命令?

对于提交及其父项:stackoverflow.com/questions/424071/…
您应该更改问题标题...您不想列出更改的文件名...您想列出更改的文件名。请注意,可以更改文件的名称而不更改其内容。

P
Peter Mortensen
git diff --name-only SHA1 SHA2

您只需要包含足够的 SHA 哈希来识别提交。你也可以这样做,例如

git diff --name-only HEAD~10 HEAD~5

查看第十次最新提交和第五次最新提交(左右)之间的差异。


这也适用于 git show。 git show --name-only SHA1
git diff --name-status [TAG|SHA1] 也显示了对文件进行了哪些操作
您也可以执行以下操作: git diff --name-only HEAD@{3} HEAD@{0} 以获得您想要比较的确切提交。
@AugustLilleaas 实际使用 show 只会显示 2 个特定提交,如果您在这 2 个提交之间有提交,它们将被排除在外
如下所述,git diff --name-status 似乎不想显示添加的文件。 @sschuberth 指出 git show,这对我来说似乎工作正常:git show --pretty=format: --name-status。只是做 git show --name-status 会提供更多信息,但仍然很好而且很密集......这将是我的新 goto 命令;)
m
muru
git diff --name-status [SHA1 [SHA2]]

就像--name-only,除了你得到一个简单的前缀告诉你文件发生了什么(修改,删除,添加......)

git log --name-status --oneline [SHA1..SHA2]

类似,但提交在提交消息之后列出,因此您可以看到文件何时更改。

如果您对某些文件/文件夹发生的事情感兴趣,您可以将 -- [...] 附加到 git 日志版本。

如果您想查看单个提交发生了什么,请将其称为 SHA1,然后执行 git log --name-status --oneline [SHA1^..SHA1]

文件状态标志:

Flag 名称 含义 M modified 文件已修改 C copy-edit 文件已复制并修改 R rename-edit 文件已重命名和修改 A 添加的文件已添加 D 已删除 文件已删除 U unmerged 文件合并后有冲突


我碰巧说 git diff --name-status 它确实给出了“添加的文件”。
对于 git log,它需要在 SHA 之间有两个点,例如 SHA1..SHA2,并且第二个 SHA 不是可选的,所以它应该如下所示: git log --name-status --oneline [SHA1.. SHA2]
--relative[=<path>] 选项可能对您有所帮助,我不确定。否则总是有 | erep -v '(.tmp|.foo|.dontwant)$' ...
@artfulrobot 你是说egrep吗?
@DavidMoles 是的,我做到了,但我现在无法编辑评论!
l
leeyuiwah

似乎没有人提到开关 --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(-)

接受的答案是正确的,但这非常有用,并为您提供了一些额外的信息。谢谢!
同意这是一个更有用的答案,因为它包含差异统计信息。
T
Tim James

但是要查看您的分支与其共同祖先与另一个分支(例如 origin/master)之间的文件更改:

git diff --name-only `git merge-base origin/master HEAD`

这真的很有用!我希望我可以简单地说 git diffstatus master 或类似的,触发上述。
git show --pretty=format: --name-only origin/master..
您可能无法将其设为 git 别名,但您绝对可以将其放入 .bashrc 中。
或者更简单:git diff --name-only HEAD...master(注意三个点)。有关详细说明,请参阅 here
看起来大部分是正确的答案!简单的 git diff --name-only master..branch 不对应 github PR 列表。这种方式更精确。但无论如何,我有 173 个 chaned 文件,而 github PR 中有 171 个。 (没有 merge-base 我有 228 对 171)
h
halfer

为了补充@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"
P
Peter Mortensen

另请注意,如果您只想查看上次提交和之前的提交之间的更改文件,则可以正常工作:

git show --name-only

简单易记。它应该得到更多的支持。
P
Peter Mortensen

将以下别名添加到您的 ~/.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
B
BanksySan

每个先前答案的最大问题是,如果您想使用您试图从存储库中取出的信息,您会被输入一个寻呼机,这非常烦人。特别是如果您是一名开发人员,他们宁愿学习您应该开发的应用程序的业务逻辑,而不是学习 vim 命令。

使用 --no-pager 可以解决该问题。

git --no-pager  diff --name-only sha1 sha2

J
Julio Marins

这将显示文件中的更改:

git diff --word-diff SHA1 SHA2

K
K. Symbol

对于只需要关注 Java 文件的人来说,这是我的解决方案:

 git diff --name-status SHA1 SHA2 | grep '\.java$'

P
Peter Mortensen

以下对我很有效:

git show --name-only --format=tformat: SHA1..SHA2

它也可以与单个提交一起使用:

git show --name-only --format=tformat: SHA1

这对于在 Jenkins 中使用非常方便,其中为您提供了变更集 SHA 哈希值的列表,并希望遍历它们以查看哪些文件已更改。

这类似于前面的几个答案,但使用 tformat: 而不是 format: 删除了提交之间的分隔符空间。


P
Peter Mortensen

利用

git log --pretty=oneline > C:\filename.log

这将只记录一个单行 (--pretty=oneline),它是已更改文件的名称。它还将所有详细信息记录到您的输出文件中。


git log --pretty=oneline 只给我 SHA 和使用 git 2.10.1 的提交消息
在 Windows 上?在什么情况下?
P
Peter Mortensen

如果有人正在查找已更改文件的列表,包括暂存文件

git diff HEAD --name-only --relative --diff-filter=AMCR

git diff HEAD --name-only --relative --diff-filter=AMCR sha-1 sha-2

如果您需要绝对路径,请删除 --relative


J
Jaime Montoya

正如 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

P
Peter Mortensen

基于 git diff --name-status,我编写了 git-diffview Git 扩展,它呈现了两个路径之间发生变化的分层树视图。