我已经从master创建了一个分支xyz。我做了大约1000次提交,可能修改了xyz分支中的20个文件。现在我想列出我在xyz分支中修改过的所有文件。
以下命令列出在两个分支中修改的文件。
git diff --name-only master...xyz
答案 0 :(得分:5)
这里的基本问题是git diff
比较了两个特定的提交。 1 无论你给出什么参数,它的仍然将选择两个特定的提交,并比较这两个。 2
这意味着要让git diff
向您展示您在某个分支中所做的事情,您必须在该分支中选择两个提交:一个用于调用“起始点”,另一个用于调用“结束点”点”。如果您选择这样做,通常有助于绘制提交图。您可以手动执行此操作,也可以使用git log --oneline --graph
提供帮助。 (另一种方法是让你的两个分支相互比较这个图是git log --oneline --graph --decorate --boundary master...xyz
。)另一种方法是尝试自己绘制图形,这可以让你更紧凑地表示它,或者使用{{1或者其他一些将绘制图形的图形查看器。
如果gitk
上的提示提交与master
上的提示提交之间存在单个合并基础提交,则:
xyz
将比较(并列出已修改文件的名称)该特定合并基础与分支XYZ的最尖端提交。也就是说,如果图形看起来像:
git diff --name-only master...xyz
然后 o--o--o--o--...--o--Z <-- master
/
...--o--*
\
F--G-...--X <-- xyz
是合并基础提交,*
是Z
上的提示提交, 3 master
是提示{ {1}},X
将比较提交xyz
与提交git diff master...xyz
。 (相比之下,*
- 请注意两个点而不是三个点,这里将比较提交X
与提交git diff master..xyz
。)
也就是说,鉴于Z
没有向您显示您想要的内容,您可能需要X
(可能还有git diff --name-only master...xyz
;我看gucce added this as a comment as well),以显示您在git log --name-only master..xyz
中的每个提交中发生的事情都发生在--oneline
中。也就是说,如上图所示,这将对提交xyz
提出master
,然后针对*
提交F
,依此类推至F
的比较}。请注意,这是使用G
的内置功能来将每次提交与其父级进行区分。 4
1 它还可以将一个提交与索引进行比较,或者将一个提交与工作树或工作树的索引进行比较。在另一种模式下,它可用于比较两个特定文件,其中一个或两个文件根本不需要存储在存储库中,但这与您希望使用它的方式更加不同。
2 这也有点夸大其词:通过提供X
多个提交,你可以让它产生它所谓的组合DIFF 。这通常用于合并提交,以显示合并内容与所有父提交不同的点,即通过选择除“一个分支中的内容”之外的其他内容来解决合并冲突的位置。但与你想要达到的目标相比,这也是错误的方向。
3 我将此作为git log
,作为主要提示,暂时,但后来意识到git diff
按字母顺序在T
之间T
。 F
适用于X
,因此我将X
更改为xyz
,以便T
之后。一般的想法是,我们对Z
专门提交的大多数提交都不感兴趣,除了名称X
选择的提示最多的提交。
4 如果master
- 到 - master
链中的任何提交都是合并提交,则F
获胜除非你添加一些额外的选项,否则根本不需要去区分它。也就是说,X
跳过合并时,除非你要求合并差异(git log
或git log
)或拆分合并(-c
) 。所有这三个选项都有缺点,所以最好的办法是首先处理不合并的情况。
答案 1 :(得分:2)
正如@torek所指出的,git diff
命令完全忽略了点符号。
因此,以下命令应导致所需的结果:
git log --oneline --name-only develop..xyz | sort | uniq
打印出类似这样的内容,最后修改后的文件:
0871be6 commit 1
9caad09 commit 2
bb714f0 commit 3
...
path/to/file1
path/to/file2
path/to/file3
path/to/file4
注意,只有两个点。这意味着,请考虑xyz
中但develop
中没有的所有修订。
使用三个点使用仅在两个分支之一中的所有修订,但不在两个分支中。
参考:https://git-scm.com/book/tr/v2/Git-Tools-Revision-Selection#Commit-Ranges