让Git关注重命名和编辑的文件

Rob*_*low 15 git version-control file-rename git-merge

大约在Git中重命名文件的问题 过,但我不能制定出一个解决方案,我的具体问题.

我已经移动并编辑了多个文件(我没有使用git mv- 不幸的是现在已经太晚了).现在我想要它,所以当我的同事从我的存储库中取出时,对这些相同的文件进行了自己的编辑(没有移动它们),它成功地将我的更改与他在文件的新位置中合并.为了成功合并,Git显然需要知道这些文件是相同的.

Git是否足够聪明地独自完成这项工作?似乎很难相信.如果是这样,我怎么能确定Git会拾取特定的文件移动 - 即使内容已经改变了?

Edw*_*son 18

Git实际上并不跟踪存储库中的重命名,它使用diff启发式来确定是否将文件重命名为另一个文件.也就是说,如果git mv一个文件,然后替换内容完全,所以考虑改名,你就不会需要用git mv它来检测重命名.

例如:

% mv d.txt e.txt
% git rm d.txt
rm 'd.txt'
% git add e.txt
% git commit -m"rename without git mv"
[master f70ae76] rename without git mv
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename d.txt => e.txt (100%)
% git diff --summary --find-renames HEAD~1 HEAD
 rename d.txt => e.txt (100%)
Run Code Online (Sandbox Code Playgroud)

同样,git mv并不意味着文件将被重命名,它仍将使用diff算法:

% git mv e.txt f.txt
% echo "Completely replacing f.txt" > f.txt
% git add f.txt
% git commit -m"git mv doesn't help here"
[master 068d19c] git mv doesn't help here
 2 files changed, 1 insertion(+), 14 deletions(-)
 delete mode 100644 e.txt
 create mode 100644 f.txt
% git diff --summary --find-renames HEAD~1 HEAD
 delete mode 100644 e.txt
 create mode 100644 f.txt
Run Code Online (Sandbox Code Playgroud)


And*_*ett 8

默认情况下,只要在提交之间删除文件,git就会检查重命名 - 无需手动告诉它.如果您确实移动了一个文件(使用git mv,而不是手动删除它并再次添加它),它会忽略该提示.出于性能原因,启发式算法不会一直运行 - 如果您移动文件然后添加一个具有原始名称的新文件,则可能无法检测到移动.

请注意,从逻辑上讲,git只存储每个修订版本中存在的树:它不存储有关修订版之间所做更改的任何跟踪信息.

如果要查看检测到的内容,可以使用-M(--find-renames)开关git diff显示重命名.此开关还会启用启发式扫描,如果您有一个不会触发它们的提交,这将非常有用.

这种基于启发式的方法是一个很好的理由(如果你需要另一个)来保持小而自包含的提交,因为这使得git的工作更容易.