在Master
分支上有两个感兴趣的提交文件,两者都只修改单个文件foo
:先前的提交AA
,以及HEAD
中的当前版本{1}}。我想将文件的两个版本合并为HEAD
Master
上的两个版本。
我做了一件我觉得最简单的事情:
git checkout -b merge-purgatory AA
git commit -m "pulled foo back from previous commit for merging into HEAD."
git checkout master
git merge merge-purgatory
其中仅使用HEAD
版本覆盖foo
版本的AA
。
尝试了更详细的git checkout -m
,同样的结果:愚蠢的覆盖。
如何强制git将AA
版本的foo
视为与当前HEAD
版本的冲突合并?
答案 0 :(得分:17)
如果git的合并没有达到你想要的效果,你可以改为:
foo
中没有未提交的更改,例如确保git status
干净。foo
使用AA
git show AA:foo > foo
版本foo
git add -p foo
所做的更改:foo
git checkout -- foo
git commit
的所有其他更改
meld
或者,如果您更喜欢使用图形差异工具(例如git show AA:foo > old-foo
meld old-foo foo
),您可以这样做:
{{1}}
答案 1 :(得分:3)
之前的答案并未记录更改的故事,因此您使用先前的提交来生成新提交。 以下程序将保留这个故事。
git checkout -b merge-purgatory AA
这里你需要稍微修改你的文件,例如你可以添加一个空行。然后
git commit "pulled foo back from previous commit for merging into HEAD."
git checkout master
git merge --no-commit merge-purgatory
通过这种方式,合并将失败,然后您需要做的就是解决冲突。这对我有用。
答案 2 :(得分:1)
git merge --no-commit merge-purgatory
至少会给你机会审查:在提交之前更改合并。
另请参阅“How do you merge selective files with git-merge?”中提出的技术,基于挑选或结帐。
关于强制手动合并,您可以在.gitatributes
file中为该特定文件声明合并策略设置为取消设置。
执行三向合并
合并
The attribute merge affects how three versions of a file is merged when a file-level merge is necessary during git merge, and other commands such as git revert and git cherry-pick.
Unset
将当前分支中的版本作为暂定合并结果,并声明合并存在冲突。这适用于没有明确定义的合并语义的二进制文件。
答案 3 :(得分:0)
我使用以下方法摆脱它:
git checkout -f b855a13754fabf5cef6ff93ab00558608a839377 -- .
这会迫使提交ID的更改进入我当前的分支(主节点),然后我根据这些应用的更改创建了一个新分支(checkout -b
),并从后者中创建了合并请求。
以上都不对我有用:-(