混帐:合并老提交到当前的头型
问题描述:
明白了对Master
分支的兴趣两次提交,既是一个文件,都只有修改一个文件foo
:以前提交AA
,而当前版本中HEAD
。我想合并文件的两个版本,将这两个版本的位合并到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
版本的冲突合并?
答
如果Git的合并是不是做你想要什么,你可以做,而不是执行以下操作:
- 确保有文件
foo
,例如在未提交的更改通过确保git status
是干净的。 - 使用与版本覆盖
foo
从AA
:git add -p foo
- 放弃所有与
git checkout -- foo
- 提交阶段性变化的其他变化
foo
:git show AA:foo > foo
- 选择性阶段仅适用于从
foo
要与变化git commit
或者,如果您宁愿使用图形比较工具(如meld
),你可以这样做:
git show AA:foo > old-foo
meld old-foo foo
答
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
采取从当前分支作为暂定合并结果的版本,并宣布合并有冲突。这适用于没有明确定义的合并语义的二进制文件。
答
以前的答案没有保留更改的故事,所以事实上你使用了前一个提交来产生新的提交。 以下过程将保留此故事。
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
这样的合并会失败,那么所有你需要做的是解决冲突。这对我有效。
所以基本上,只是绕过git的前一个提交的知识,并使用手动合并/ mergetool。希望从git中获得更加强烈的行为,但这很简单,我成功地使用了它,并在之后做了一些清理。谢谢! – Noel 2012-01-17 18:52:22