我现在正在尝试一个非常强大的 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
的提交中完成。
您想应用所有本地更改,提交 A
和 B
,它们是在 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/