【发布时间】:2022-01-21 15:00:21
【问题描述】:
假设我有 2 个分支:A 和 B(假设 B 是 A 的一个分支)
在分支A,我更改了一个文件root/blabla/ariel1.txt的内容
在B分支中,我把路径改成了ariel1.txt并重命名,所以现在叫ariel2.txt,路径是:root/yadayada/ariel2.txt
现在,我决定将分支 A 合并到分支 B。
git 如何知道将更改 ariel1.txt(在分支 A)合并到 ariel2.txt(在分支 B)?
我遇到过这种情况,git不知道如何正确处理。任何想法如何克服这种情况?
【问题讨论】:
-
Git 不跟踪重命名或移动。它具有尝试确定添加 + 删除是否真的是重命名或移动的启发式方法,但取决于在同一次提交中对文件所做的更改量,它可能会成功也可能不会成功。执行此类操作时,您最好的选择是移动和重命名文件在单独的提交中。不要更改此提交中文件的内容,只需移动和/或重命名它。这样,git 应该能够很容易地找出它被移动/重命名并采取相应的行动。
-
@LasseV.Karlsen 如果只有一个合并操作,那么在单独的提交中进行移动和重命名将无济于事。如果提前单独合并移动和重命名的提交,这确实会有所帮助。
-
添加到 Lasse 的解释中,如果您先重新设置分支,则合并是一个简单的快进合并,不会发生冲突。如果你想要单独的合并提交,你可以添加
--no-ff。 -
除非单个合并操作压缩提交,否则它应该会有所帮助。以我的经验,它确实有助于将移动和重命名分离到他们自己的提交中。例如,在 .NET 项目中,如果我想将一个类移动到不同的命名空间,我会在一次提交中根据命名空间结构将文件移动到正确的文件夹中,然后在另一个提交中修复文件中的命名空间声明犯罪。这使我能够跟踪文件的历史记录。唯一一次失败并让我感到困惑的是两个分支都这样做。