当目录已经移动到不同的目录时,如何合并git中的文件

时间:2016-04-22 10:29:52

标签: git merge

我正在从主分公司工作的分支上工作一段时间。现在我需要合并我的更改。更改位于特定文件夹中,例如admin这是我项目中的子目录。

当我从主分支机构获取最新信息时,此目录将移至另一个位置,例如主/管理员。所以,现在当我尝试合并时,它会将所有与管理员相关的文件显示为新文件。

我想避免任何手动合并并想要一种方式,以便我可以让git知道这不是新文件夹,而是已移动的现有文件夹。

3 个答案:

答案 0 :(得分:3)

  

所以,现在当我尝试合并时,它会将所有与管理员相关的文件显示为新文件。

Restore the old branch并使用git mv移动文件,而不是简单的mv命令。

<强> Why do i have to use git mv and not just mv?

Git不跟踪文件名。它将内容存储在.pack文件中,文件名(元数据)存储在.idx文件中,而不是内容本身的一部分。

要更好地了解它,请阅读git存储文件名如何 https://git-scm.com/book/en/v2/Git-Internals-Git-Objects#Tree-Objects

除非您使用git mv移动文件,否则Git无法跟踪移动的文件。 如果您只是移动或重命名它们,git会将它们作为新文件进行跟踪,并删除旧文件。

<强> How to track changes of the moved files?

# you have to use the --follow flag
git log --follow ./path/to/file

答案 1 :(得分:2)

Git 2.18(2018年第二季度)应该促进这种合并。

重命名检测逻辑&#34; diff&#34;在&#34; merge&#34;中使用的家庭具有 学会猜测:

  • 当所有x/ax/bx/c都移至z/a时, z/bz/c
  • =&GT;同时添加x/d也可能 想转移到z/d
    通过提示整个目录 &#39; x&#39;移至&#39; z&#39;

请参阅commit 1de70dbcommit 05cf21ecommit 277292dcommit a35edc8commit c04ba51commit 2f682e2commit bd42380,{{3} },commit fd53b7fcommit 6e7e027commit bc71c4ecommit 18797a3commit 64b1abecommit 79c4759commit 9c0743fcommit 5b047accommit f6f7755commit e95ab70commit 96e7ffbcommit 7fe40b8(2018年4月19日)commit ffc16c4
(由Elijah Newren (newren)合并于Junio C Hamano -- gitster --,2018年5月23日)

您可以在commit c67de74中看到与移动文件夹合并的新测试。

详细介绍了以下情况:

###########################################################################
# SECTION 1: Basic cases we should be able to handle
###########################################################################

# Testcase 1a, Basic directory rename.
#   Commit O: z/{b,c}
#   Commit A: y/{b,c}
#   Commit B: z/{b,c,d,e/f}
#   Expected: y/{b,c,d,e/f}

预期结果是将分支B合并到A

这包括更复杂的用例:

# Testcase 1f, Split a directory into two other directories
# 
#   Commit O: z/{b,c,d,e,f}
#   Commit A: z/{b,c,d,e,f,g}
#   Commit B: y/{b,c}, x/{d,e,f}
#   Expected: y/{b,c}, x/{d,e,f,g}

底线是:

  

所以,现在当我尝试合并时,它会将所有与管理员相关的文件显示为新文件

Git 2.18不再是这种情况。

答案 2 :(得分:0)

@CodeWizard的答案看起来很不错,但如果这不起作用,那么简单地添加整个新文件夹会有什么问题吗?

使用此功能:

$ cd master
$ git add admin