如何记录使用旧路径重命名/移动的文件的整个git历史记录?
如果文件如何记录使用旧路径重命名/移动的文件的整个git历史记录?,git,version-control,Git,Version Control,如果文件a被编辑一次或多次,然后重命名/移动到B并作为B编辑一次或多次,则使用其新名称/路径发出以下git命令 git log --follow -- B 。。。展示了它的整个历史 但是,当我查看同一项目的一个旧的(已发布/维护的)分支时,其中的文件仍然命名为A,我想在master中对其进行后台更改,我可能会认为在master上发布以下命令 git log --follow -- A 。。。将显示所有更改。但事实并非如此。日志中显示的最新提交是与从A重命名为B对应的更改。未显示对B所做的更改
a
被编辑一次或多次,然后重命名/移动到B
并作为B
编辑一次或多次,则使用其新名称/路径发出以下git命令
git log --follow -- B
。。。展示了它的整个历史
但是,当我查看同一项目的一个旧的(已发布/维护的)分支时,其中的文件仍然命名为A
,我想在master
中对其进行后台更改,我可能会认为在master
上发布以下命令
git log --follow -- A
。。。将显示所有更改。但事实并非如此。日志中显示的最新提交是与从A
重命名为B
对应的更改。未显示对B
所做的更改
i、 e.--follow
仅在从较新名称“向后”重命名为较旧名称之后,而不在“向前”重命名之后
此时,我必须首先确定显示的最新提交是一个重命名,找到较新的名称,并发出一个git日志——再次使用新名称跟踪(如果自维护版本以来文件被移动了几次,可能会重复几次)
我怎样才能找到整个历史记录而不必手动发出git log——跟踪几次?不幸的是,git log
本身严格地向后工作,就像git总是这样。git实际上无法向前工作,因为git存储的是向后的:每个提交都会记住其父提交的哈希ID,但是由于所有提交在创建时都被冻结,因此它们无法记住其子代的哈希ID,这些子代将在稍后创建
什么git日志
(及其类似于大姐/主力的管道命令git版本列表
)我们可以做的就是做一次反向遍历,找出哪些提交在其他提交之前,然后反向打印。git log--reverse
命令可以做到这一点。但是遗憾的是,重命名检测只发生在向后(对git来说是向前的)遍历过程中,不能插入到后面的向前(对git来说是向后的)遍历中打印输出
它不是Git内置的,但您可以使用Git rev list
进行反转,保存结果,然后在每个提交对上运行Git diff--name status
时进行自己的向前行走,寻找重命名操作。请注意,这仍然有点棘手,因为现在分支实际上是分支,合并实际上是在Git的中合并三次向后遍历,合并分支,同时合并分支。:-)也就是说,假设我们有:
tag:abc
|
v
...--o--o--*--o--o--o <-- tip1
\
o--*--o----o <-- tip2
现在,从abc
到tip1
的路径包括两个重命名。如果从tip1
开始,则必须给出git log——遵循执行合并的人选择保留的姓名,无论是B
还是C
。由于git log--B
或git log--C
(以正确的名称为准)对历史进行简化,git将只走在M
后面的两条腿中的一条腿,即最上面一行或最下面一行,根据哪个分支具有匹配的文件,并且当您从abc
向前工作时,您必须从两个分支中选择一个进行工作,或者做一些有趣的事情,以便您知道检查A
-沿顶部变为-B
,同时检查A
-沿底部变为-C
。(Git不会做任何花哨的事情。)你不能总是跟踪每一个移动/重命名操作,因为有时候Git搞不清楚。这不是一个答案,但最好的办法是避免在Git中移动/重命名文件,如果你能管理的话。我不认为这是一个很好的解决方案,因为Git并没有像你描述的那样在历史上真正向前发展,但我可以为Git log
(和其他)推荐标志--name status
它显示了每次提交时对每个文件所做的更改(例如,M
=修改,R
=重命名)。@JanKrüger,很好!没有pathspec的git日志--oneline--name状态
非常适合搜索和查找重命名。
tag:abc
|
v
...--o--o--*--o--o--o--M--o <-- tip1
\ /
o--*--o----o <-- tip2