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

viv*_*una 3 git

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

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

git diff --name-only master...xyz
Run Code Online (Sandbox Code Playgroud)

guc*_*cce 6

正如@torek 所指出的,该git diff命令完全忽略点符号。

因此,以下命令应该会产生预期的结果:

git log --oneline --name-only develop..xyz | sort | uniq
Run Code Online (Sandbox Code Playgroud)

打印出类似这样的内容,修改后的文件在末尾:

0871be6 commit 1
9caad09 commit 2
bb714f0 commit 3
...
path/to/file1
path/to/file2
path/to/file3
path/to/file4
Run Code Online (Sandbox Code Playgroud)

注意,只有两个点。这意味着,要考虑 中xyz但不在 中的所有修订develop

使用三个点使用仅在两个分支之一中但不在两个分支中的所有修订。

参考: https: //git-scm.com/book/tr/v2/Git-Tools-Revision-Selection#Commit-Ranges

  • 谢谢人们!我使用 `--pretty=""` 来代替 `--online` 来仅显示文件: `git log origin..HEAD --name-only --pretty="" | 排序| 独特` (2认同)

tor*_*rek 6

这里的根本问题是git diff比较两个特定的提交.1 无论你给出什么参数,它仍然会选择两个特定的提交,并比较这两个.2

这意味着,为了git diff向您展示您在某个分支中所做的事情,您必须在该分支中选择两个提交:一个称为"起点",另一个称为"终点".如果您选择这样做,通常有助于绘制提交图.您可以手动执行此操作,也可以使用git log --oneline --graph帮助.(git log --oneline --graph --decorate --boundary master...xyz另一种方法是尝试自己绘制图形,这可以让您更紧凑地表示gitk图形,或者使用或绘制其他一些图形查看器图表.

如果提示提交和提示提交之间存在单个合并基础提交,则:masterxyz

git diff --name-only master...xyz
Run Code Online (Sandbox Code Playgroud)

将比较(并列出修改的文件的名称)特定的合并基础,与分支XYZ的最尖端提交.也就是说,如果图形看起来像:

          o--o--o--o--...--o--Z   <-- master
         /
...--o--*
         \
          F--G-...--X             <-- xyz
Run Code Online (Sandbox Code Playgroud)

然后*是合并基础提交,Z是提示提交master,3 X是提示提交xyz,git diff master...xyz并将比较提交*与提交X.(相比之下, - git diff master..xyz注意两个点而不是三个点,这里将比较提交Z与提交X.)

这就是说,因为git diff --name-only master...xyz没有显示你想要的东西,你可能需要git log --name-only master..xyz(也可能有--oneline,我看到gucce添加这是一个评论,以及),向您显示会发生什么每个提交了在xyz那是不是也master.也就是说,给定上面的图表,这将对提交*进行差异提交F,然后F反对G,依此类推,直至进行比较X.请注意,这是使用git log内置的能力来区分每个提交对其父级.4


1它还可以将一个提交与索引进行比较,或者将一个提交与工作树或工作树的索引进行比较.在另一种模式下,它可用于比较两个特定文件,其中一个或两个文件根本不需要存储在存储库中,但这与您希望使用它的方式更加不同.

2这也有点夸大其词:通过提供git diff多对提交,你可以让它产生它所谓的组合差异.这通常用于合并提交,以显示合并内容与所有父提交不同的点,即通过选择除"一个分支中的内容"之外的其他内容来解决合并冲突的位置.但是,与你想要达到的目标相比,这也是错误的方向.

3我曾经把它作为T主人的一点,然后意识到这T是在字母之间F和之间X. X是的xyz,所以我改TZ这里,以便它来了X.一般的想法是我们对大多数提交都不感兴趣master,除了名称master选择的最尖端的提交.

4如果F-through- Xchain 中的任何提交是合并提交,git log除非你添加一些额外的选项,否则根本不会去除它.也就是说git log,除非你要求组合差异(-c--cc)或拆分合并(-m),否则在分辨它们时跳过合并.所有这三个选项都有缺点,所以最好的办法是首先处理不合并的情况.