在 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 添加:
状态字母
R
和C
“后面总是跟着一个分数,表示移动或复制的源和目标之间的相似百分比,并且是唯一的分数”。 )
关于复制或移动的文件:
-C[<n>]
--find-copies[=<n>]
检测副本以及重命名。如果指定了
n
,则与-M<n>
的含义相同。
--find-copies-harder
出于性能原因,默认情况下,
-C
选项仅在副本的原始文件在同一变更集中进行了修改时才查找副本。 此标志使命令检查未修改的文件作为副本源的候选者。 对于大型项目,这是一项非常昂贵的操作,因此请谨慎使用。提供多个-C
选项具有相同的效果。
brauliobo推荐in the comments:
git diff --stat -C
git show --stat -C
git log --stat -C
【讨论】:
太好了,这正是我需要的。为了完整起见,我将添加状态字母R
和C
“后面总是有一个分数,表示移动或复制的源和目标之间的相似百分比,并且是唯一的分数” (source)。
@Jean-Philippe:好点。我已将其包含在答案中。
谢谢!剩下的唯一部分是如何解释类型为X
或B
的条目...
@Jean-Philippe:是的,希望您不必经常解析那种条目;)
我问了一个关于X
和B
的后续问题there。【参考方案2】:
我相信``会显示这些信息
git diff -M -C --stat
【讨论】:
谢谢!看起来-M
是多余的,因为-C
检测到“复制和重命名”,而--stat
似乎在指定-C
时无效。
好多了,也适用于show
和log
。谢谢!以上是关于在 Git 中,如何获取从一个修订版到另一个修订版的文件更改的详细列表?的主要内容,如果未能解决你的问题,请参考以下文章
Perforce:如何从分支操作之前获取“截至”日期或修订版本的文件?