让Git跟踪重命名和编辑的文件

13 浏览
0 Comments

让Git跟踪重命名和编辑的文件

关于在Git中重命名文件的问题之前已经有人提出过,但我无法解决我特定问题的解决方案。我已经移动和编辑了多个文件(我没有使用`git mv`- 不幸的是现在为时已晚)。现在,当我的同事从我的存储库中拉取时,他对这些相同文件进行了自己的编辑(没有移动它们),我希望它能够成功地将我的更改与他的更改合并到文件的新位置。为了成功合并,Git显然需要知道这些是相同的文件。Git能否自己聪明地解决这个问题呢?这似乎很难相信。如果可以,我如何确保Git能够捕捉到特定文件的移动-即使内容已经改变?

0
0 Comments

问题的原因是git默认会在每次提交时检查文件的重命名,无需手动告知。但是,如果使用git mv命令移动文件,git会忽略这个提示。为了性能考虑,git的启发式算法并不会一直运行,如果将文件移动到其他位置,然后再添加一个同名的新文件,移动操作可能就无法被检测到。需要注意的是,从逻辑上讲,git只存储每个版本中树的状态,不会存储关于版本之间更改的跟踪信息。

解决方法是,如果想要查看检测到的重命名,可以在git diff命令中使用-M (--find-renames)选项来显示重命名。这个选项也会启用启发式算法,对于无法触发启发式算法的提交非常有用。基于启发式算法的方法也是保持提交小而自包含的一个很好的理由。

所以,为了让git能够正确地跟踪重命名和编辑的文件,我们可以使用git mv命令来移动文件,而不是手动删除和添加。另外,在提交时保持小而自包含的提交也能够帮助git更容易地进行跟踪。

0
0 Comments

问题的出现原因是git diff命令无法识别出我重命名了文件并修改了它们的内容。我的情况是,我有文件A、B、C,并插入了一个新的B,所以旧的B现在是C,旧的C现在是D。但git diff告诉我B和C现在完全不同了!

我使用的解决方法虽然繁琐且需要手动操作,但确实完成了任务。

  1. 尽量将文件重新命名回去。即B改为Bnew,C改为B,D改为C。
  2. 进行diff操作,检查是否有错误。
  3. 提交更改。
  4. 使用git mv命令将文件重新命名回它们的新名称。B改为C,C改为D。
  5. 提交更改。
  6. 进行其他重命名操作,并将它们作为新文件提交。即Bnew改为B。
0
0 Comments

问题的原因是Git在存储库中实际上并不跟踪重命名,而是使用差异启发式算法来确定是否将文件重命名为另一个文件。也就是说,如果您使用git mv命令重命名文件,然后完全更改其内容,Git不会将其视为重命名,并且您不需要使用git mv命令来检测重命名。

解决方法是使用git diff命令的--find-renames选项来找到重命名的文件。以下是示例:

首先,执行以下命令将文件d.txt重命名为e.txt

% 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选项来查看重命名:

% git diff --summary --find-renames HEAD~1 HEAD
 rename d.txt => e.txt (100%)

类似地,使用git mv命令重命名文件e.txtf.txt

% 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选项来查看重命名:

% git diff --summary --find-renames HEAD~1 HEAD
 delete mode 100644 e.txt
 create mode 100644 f.txt

通过使用git diff命令的--find-renames选项,可以在Git中检测到重命名和编辑的文件。

0