Git-从父存储库提取时如何处理本地重命名文件中的更改

时间:2019-05-28 19:04:14

标签: git git-merge git-pull git-merge-conflict

问题

我在将父存储库拉入分叉并正确解决冲突时遇到问题。 看来,如果文件在派生文件中被重命名并且被父对象和派生文件都修改,则git仅将其视为deleted by us

当我使用git pull /path/to/parent mastergit merge upstream/master (with upstream configured)时会发生这种情况。

如何使用git,以便提示我解决重命名文件上的冲突,而不是让git假定文件为deleted by us

设置

这是一个演示我遇到的问题的设置。可以在本地或在线托管系统中完成此操作(我在Azure DevOps / VSTS中正在经历此操作。)

我用以下两个仓库重复了以下GitHub中的大多数步骤:

您可以克隆前叉并执行git pull https://github.com/Daniel-Khodabakhsh/TestForkPull.git master来查看问题。

手动步骤:

  1. 使用回购路径A.txt中名为B.txtC.txt/path/to/parent的任意文本的文件创建一个小型项目。

  2. 通过将此仓库复制到/path/to/fork来创建此仓库的分支,并切换到该路径。

  3. 在此新的fork存储库中,以以下方式重命名文件并提交。我是使用操作系统而不是使用git mv来完成的,但这并不重要,因为git的工作原理。

A.txt → X.txt
B.txt → Y.txt
C.txt → Z.txt
  1. 验证git通过运行git diff --name-status HEAD~1并注意到'R'表示检测到重命名来识别重命名。
$ git diff --name-status HEAD~1
R100    A.txt   X.txt
R100    B.txt   Y.txt
R100    C.txt   Z.txt
  1. 在父仓库中,对文件A.txtB.txt的内容进行修改。

  2. 在fork库中,修改文件Y.txtZ.txt的内容。

到目前为止,两个存储库中都包含以下文件:

A.txt → X.txt - Modified in parent
B.txt → Y.txt - Modified in both
C.txt → Z.txt - Modified in fork
  1. 通过从派生路径运行git pull /path/to/parent master将父存储库“拉”到派生中。您将获得以下输出:
$ git pull /path/to/parent/ master
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 4 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (4/4), done.
From D:/path/to/parent
 * branch            master     -> FETCH_HEAD
CONFLICT (modify/delete): B.txt deleted in HEAD and modified in ba146eba53bd7d51c9977238d9d62b56f7a984f7. Version ba146eba53bd7d51c9977238d9d62b56f7a984f7 of B.txt left in tree.
Automatic merge failed; fix conflicts and then commit the result.
$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Changes to be committed:

        modified:   X.txt

Unmerged paths:
  (use "git add/rm <file>..." as appropriate to mark resolution)

        deleted by us:   B.txt

此处X.txt仅正确显示了来自父存储库的修改,Z.txt被分叉存储库的更改正确地保留了,但是Y.txtB.txt)不正确显示为有冲突,但仅显示为deleted by us

2 个答案:

答案 0 :(得分:0)

  

如果文件在fork中被重命名并且被父级和fork修改,则git只将其视为被我们删除。

请注意,git不会跟踪文件的重命名或移动。这意味着当文件在分支上移动并在另一个分支上修改时,您将看到合并冲突。

  

如何使用git,以便提示我解决重命名文件上的冲突,而不是让git假定文件已被我们删除?

您必须在文件的移动版本中手动进行修改。

答案 1 :(得分:0)

注意:github在B.txt的末尾显示了一些额外的字符(可能是crlf?),这些字符在“修改后的B.txt”和“重命名为Y.txt”中都消失了。这可能会增加检测git重命名时的困惑。