在 Git 中,如何获取从一个修订版到另一个修订版的文件更改的详细列表?

Posted

技术标签:

【中文标题】在 Git 中,如何获取从一个修订版到另一个修订版的文件更改的详细列表?【英文标题】:In Git, how do I get a detailed list of file changes from one revision to another? 【发布时间】:2011-08-28 19:45:23 【问题描述】:

我使用服务器上的 Git 存储库对发送到服务器的用户数据文件进行版本控制。我有兴趣获取任意两个修订版之间的更改文件列表。

我知道git diff --name-only <rev1> <rev2>,但这只是给我一个文件名列表。我也对重命名和复制特别感兴趣。理想情况下,输出应该是这样的:

updated:  userData.txt
renamed:  picture.jpg -> background.jpg
copied:   song.mp3 -> song.mp3.bkp

有可能吗? --name-status 似乎也不表示重命名和复制。

【问题讨论】:

【参考方案1】:
git diff --name-status -C <rev1> <rev2>

应该更接近您正在寻找的东西。

--name-status 将显示文件名及其各自的状态:

(A|C|D|M|R|T|U|X|B)

添加 (A)、复制 (C)、删除 (D)、修改 (M)、重命名 (R)、 类型(即常规文件、符号链接、子模块……)已更改 (T), 未合并 (U)、未知 (X) 或配对损坏 (B)

(OP Jean Philippe Pellet 添加:

状态字母RC“后面总是跟着一个分数,表示移动或复制的源和目标之间的相似百分比,并且是唯一的分数”。 )

关于复制或移动的文件:

-C[<n>]
--find-copies[=<n>]

检测副本以及重命名。如果指定了n,则与-M&lt;n&gt;的含义相同。

--find-copies-harder

出于性能原因,默认情况下,-C 选项仅在副本的原始文件在同一变更集中进行了修改时才查找副本。 此标志使命令检查未修改的文件作为副本源的候选者。 对于大型项目,这是一项非常昂贵的操作,因此请谨慎使用。提供多个-C 选项具有相同的效果。


brauliobo推荐in the comments:

git diff --stat -C
git show --stat -C
git log --stat -C

【讨论】:

太好了,这正是我需要的。为了完整起见,我将添加状态字母RC“后面总是有一个分数,表示移动或复制的源和目标之间的相似百分比,并且是唯一的分数” (source)。 @Jean-Philippe:好点。我已将其包含在答案中。 谢谢!剩下的唯一部分是如何解释类​​型为XB 的条目... @Jean-Philippe:是的,希望您不必经常解析那种条目;) 我问了一个关于XB 的后续问题there。【参考方案2】:

我相信``会显示这些信息

git diff -M -C --stat

【讨论】:

谢谢!看起来-M 是多余的,因为-C 检测到“复制和重命名”,而--stat 似乎在指定-C 时无效。 好多了,也适用于showlog。谢谢!

以上是关于在 Git 中,如何获取从一个修订版到另一个修订版的文件更改的详细列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何从特定修订版更改 GIT 中提交的作者 [重复]

如何从谷歌驱动器获取修订内容

Perforce:如何从分支操作之前获取“截至”日期或修订版本的文件?

如何获取包含 Mercurial 中特定修订的所有分支的列表?

如何下载以前保存的Google Apps脚本修订版?

从 jenkins 构建一个 git 项目时,它显示一个错误,例如找不到要构建的任何修订