我正在尝试一个非常强大的git合并策略.我遇到的一个问题是我对我的分支中的某些代码进行了一些更改,但我的同事将该代码移动到其分支中的新文件中.所以当我这样做时git merge my_branch his_branch,git没有注意到新文件中的代码与旧文件中的代码相同,因此我没有任何更改.
将更改再次应用于新文件中的代码的最简单方法是什么.我不会有太多问题找出需要重新应用的提交(我可以使用git log --stat).但据我所知,没有办法让git将更改重新应用到新文件中.我现在看到的最简单的事情是手动重新应用更改,这看起来不是一个好主意.
我知道git可以识别blob,而不是文件,所以肯定必须有一种方法可以告诉它,"从这个提交应用这个确切的代码更改,除了它不是它现在在这个新文件中的位置".
假设我有一个文件
当我尝试从master合并到功能分支时,合并失败
CONFLICT(修改/删除):在HEAD中删除X并在origin/master中修改.X的版本原点/主人在树中留下.
我知道存在冲突,但为什么不尝试合并更改并将冲突标记放在文件中?以前的答案似乎暗示它应该.我得到的是该文件的两个不同版本,我必须手动找出差异,并从主版本到我的版本逐行更改端口.
重现步骤:
git init
touch a
git add a
git commit -m 'initial import'
git checkout -b feature1
echo feature1 > a
git add a
git commit -m feature1
git mv a b
git commit -m feature1
git checkout master
echo bugfix > a
git add a
git commit -m bugfix
git checkout feature1
git merge master
Run Code Online (Sandbox Code Playgroud) foo.txtgit mv foo.txt bar.txt其次git add -A则git commit -m "renamed foo.txt"git checkout mastergit merge branch_A有了这个,我得到一个合并冲突(重命名/删除).
CONFLICT (rename/delete): Rename foo.txt->bar.txt in branch_A and deleted in HEAD
Run Code Online (Sandbox Code Playgroud)
这是有道理的,也是我所期待的.但是,我想知道git merge是否有办法不检测重命名,而是将它们视为添加/删除.在这种情况下,我希望git能够检测到foo.txt已被删除,只需添加bar.txt即可.没有冲突.
我尝试过使用-X rename-threshold,但它对我没用.我已经尝试过阈值0和120(高于100的数字).我错过了什么?
谢谢!
PS我也遇到了error: refusing to lose untracked file at...错误.这是什么意思?
读完这个问题后,我想到了这个问题:Git真的可以跟踪单个功能从一个文件到另一个文件的移动吗?如果是这样,怎么办?
这是worfklow:
“很久以前”,我们将一个大文件拆分为folder/file.py许多文件:folder1/file.py,folder2/file.py依此类推。
git blame -C当我们查看时folder2/file.py,正确显示了该代码的历史记录,我们看到一些提交是在拆分之前进行的。
问题是我们继续维护仍然具有的旧版本代码,folder/file.py当我们将修补程序合并回“当前”版本时,git继续重新创建该文件夹folder,并且看不到folder/file.py应将所做的修补程序合并到其中folder1/file.py或folder2/file.py取决于此代码块现在位于何处。
我快速看了一下,git help merge但没有发现任何东西。