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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (14)

我遇到了将父存储库拉入fork并正确解决冲突的问题。似乎如果一个文件在fork中被重命名并被父和fork修改,git只会将其视为存在deleted by us

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

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

建立

这是一个展示我遇到的问题的设置。这可以在本地或在线管理系统中完成(我在Azure DevOps / VSTS中遇到这种情况)。

我已经在GitHub中复制了以下大部分步骤:

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

手动步骤:

  1. 创建任意文本文件命名为一个小项目A.txtB.txt以及C.txt在回购路径/path/to/parent
  2. 通过将其复制到/path/to/fork并切换到此路径来创建此repo的分支。
  3. 在这个新的fork repo中,按以下方式重命名文件并提交。我使用操作系统而不是使用它,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. 在父repo中,修改文件的内容A.txtB.txt
  2. 在fork repo中,修改文件的内容Y.txtZ.txt

到此为止,您在两个repos中都有以下文件:

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从fork路径运行,将父repo“拉”到fork中。您将获得以下输出:
$ 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正确地只显示来自父repo的修改,Z.txt正确地改变了来自fork repo的更改,但是Y.txtB.txt)没有正确地显示为冲突,而是显示为仅存在deleted by us

提问于
用户回答回答于

看来如果一个文件在fork中被重命名并被父和fork修改,git只会将其视为被我们删除。

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

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

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

扫码关注云+社区

领取腾讯云代金券