git merge : apply changes to code that moved to a different file

标签 git

我现在正在尝试一个非常强大的 git merge 操作。我遇到的一个问题是我对我分支中的一些代码做了一些更改,但我的同事将该代码移到了他分支中的一个新文件中。所以当我执行 git merge my_branch his_branch 时,git 没有注意到新文件中的代码与旧文件中的代码相同,因此我的更改都没有出现。

将我的更改再次应用到新文件中的代码的最简单方法是什么。找出需要重新应用的提交不会有太多问题(我可以只使用 git log --stat)。但据我所知,没有办法让 git 将更改重新应用到新文件中。我现在看到的最简单的事情是手动重新应用更改,这看起来不是一个好主意。

我知道 git 识别的是 blob,而不是文件,所以肯定有一种方法可以告诉它,“从这次提交应用这个确切的代码更改,除了它现在在这个新文件中的位置之外”。

最佳答案

我有一个类似的问题,我通过重新调整我的工作以匹配目标文件组织来解决它。这是可行的,因为 git 会跟踪文件内容,因此通过在重命名之上进行 rebase ,可以根据需要应用更改。

更准确地说,假设您在分支(local 分支)上修改了 original.txt,但在 master 分支上修改了 original.txt 已被复制到另一个,比如 copy.txt。 此副本已在我们命名为 CP 的提交中完成。

您想应用所有本地更改,提交 AB,它们是在 original.txt 上进行的,到新的文件 copy.txt

 ---- X -----CP------ (master)
       \ 
        `--A---B--- (local)
 

使用 git branch move X 在更改的起点创建一次性分支 move。也就是说,将 move 分支放在提交 X 上,即要 merge 的提交之前;最有可能的是,这是您从中分支出来以实现更改的提交。正如用户 @digory doo 在下面写道,您可以执行 git merge-base master local 来查找 X

 ---- X (move)-----CP----- (master)
       \ 
        `--A---B--- (local)
 

在此分支上,发出以下重命名命令:

git mv original.txt copy.txt

这将重命名文件。请注意,此时 copy.txt 还不存在于您的树中。
提交您的更改(我们将此提交命名为 MV)。

        ,--MV (move)
       /
 ---- X -----CP----- (master)
       \ 
        `--A---B--- (local)
 

您现在可以在 move 的基础上重新设置您的工作:

git rebase move local

这应该没有问题,并且您的更改已应用到本地分支中的 copy.txt

        ,--MV (move)---A'---B'--- (local)
       /
 ---- X -----CP----- (master)
 

现在,您不一定希望或不需要在主分支的历史记录中提交 MV,因为移动操作可能会导致与提交时的复制操作发生冲突 CP 在主分支中。

你只需要再次 rebase 你的工作,丢弃移动操作,如下:

git rebase move local --onto CP

... 其中 CP 是在另一个分支中引入 copy.txt 的提交。 这将在 CP 提交之上对 copy.txt 上的所有更改进行 rebase。 现在,您的 local 分支就像您总是修改 copy.txt 而不是 original.txt 一样,您可以继续与其他分支 merge 。

                ,--A''---B''-- (local)
               /
 -----X-------CP----- (master)
 

将更改应用于 CP 很重要,否则 copy.txt 将不存在并且更改将应用​​回 original.txt.

希望这是清楚的。 这个答案来晚了,但这可能对其他人有用。

关于git merge : apply changes to code that moved to a different file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3491270/

相关文章:

git-svn:分支在 svn 存储库中重命名,我如何告诉 git-svn?

git - 如何在 Git 存储库中查找和恢复已删除的文件?

git - 检查 git 中的嫁接提交?

Git:获取一个分支的所有笔记

linux - GIT 推送为我提交的文件创建一个临时(?) "file.html~"文件?为什么?

git - Azure DevOps 中的服务器端 .gitattributes 是否有等价物?

html - 我的 Gitlab 存储库中的 Web 访问 HTML 文件

git - 将二进制文件附加到 Git 标记

git - 黑白 'git diff HEAD' 和 'git diff HEAD HEAD~1' 有什么区别?

Git:将旧提交 merge 到当前头版本