gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 14:21:36 24 4
gpt4 key购买 nike

问题

我在将父存储库 pull 入复刻并正确解决冲突时遇到问题。看起来,如果一个文件在 fork 中被重命名并且被父级和 fork 修改,git 只会将其视为 被我们删除

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

我如何使用 git 来提示我解决重命名文件的冲突,而不是让 git 假设文件是​​被我们删除

设置

这是一个演示我遇到的问题的设置。这可以在本地或在线托管系统中完成(我在 Azure DevOps/VSTS 中体验过)。

我在 GitHub 中用这两个 repos 复制了下面的大部分步骤:

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

手动步骤:

  1. 创建一个小项目,其中包含名为 A.txtB.txtC.txt 的任意文本文件 repo 路径 /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 diff --name-status HEAD~1 并注意 'R' 指示检测到重命名来验证 git 识别重命名。
$ 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. 通过从 fork 路径运行 git pull/path/to/parent master 将父仓库“pull ”到 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。 txt (B.txt) 没有正确显示为冲突,而是显示为仅被我们删除

最佳答案

It appears that if a file is renamed in the fork and is modified by both the parent and the fork, git only treats it as being deleted by us.

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

How can I use git such that I am prompted to resolve the conflict on the renamed file instead of having git assume the file was deleted by us?

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

关于Git - 从父仓库中提取时如何处理本地重命名文件的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56348599/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com