如何列出特定分支中的所有已更改文件?

时间:2016-09-26 07:46:07

标签: git

我已经从master创建了一个分支xyz。我做了大约1000次提交,可能修改了xyz分支中的20个文件。现在我想列出我在xyz分支中修改过的所有文件。

以下命令列出在两个分支中修改的文件。

git diff --name-only master...xyz

2 个答案:

答案 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之间TF适用于X,因此我将X更改为xyz,以便T之后。一般的想法是,我们对Z专门提交的大多数提交都不感兴趣,除了名称X选择的提示最多的提交。

4 如果master - 到 - master链中的任何提交都是合并提交,则F获胜除非你添加一些额外的选项,否则根本不需要去区分它。也就是说,X跳过合并时,除非你要求合并差异(git loggit 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