混帐:合并老提交到当前的头型

问题描述:

明白了对Master分支的兴趣两次提交,既是一个文件,都只有修改一个文件foo:以前提交AA,而当前版本中HEAD。我想合并文件的两个版本,将这两个版本的位合并到HEADMaster混帐:合并老提交到当前的头型

我这样做,我认为会工作的最简单的事情:

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 

它只是覆盖当前版本HEADfooAA版本。 也尝试了更详细的git checkout -m,结果相同:哑覆盖。

如何强制git将AA版本foo作为与当前HEAD版本的冲突合并?

如果Git的合并是不是做你想要什么,你可以做,而不是执行以下操作:

  1. 确保有文件foo,例如在未提交的更改通过确保git status是干净的。
  2. 使用与版本覆盖fooAAgit add -p foo
  3. 放弃所有与git checkout -- foo
  4. 提交阶段性变化的其他变化foogit show AA:foo > foo
  5. 选择性阶段仅适用于从foo要与变化git commit

或者,如果您宁愿使用图形比较工具(如meld ),你可以这样做:

git show AA:foo > old-foo 
meld old-foo foo 
+2

所以基本上,只是绕过git的前一个提交的知识,并使用手动合并/ mergetool。希望从git中获得更加强烈的行为,但这很简单,我成功地使用了它,并在之后做了一些清理。谢谢! – Noel 2012-01-17 18:52:22

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 

采取从当前分支作为暂定合并结果的版本,并宣布合并有冲突。这适用于没有明确定义的合并语义的二进制文件。

+0

是“review:change”命令还是选项开关? – Noel 2012-01-16 08:27:56

+0

而且,在任何情况下,“自动合并进行得顺利;在提交请求前停止”并不完全回答我的问题:如何防止“自动合并”发生,而是将两个版本视为冲突(它们是,覆盖彼此的线)并需要手动合并? – Noel 2012-01-16 08:31:05

+0

@Noel:对不起,我删除了手动合并部分。我编辑了我的答案。 – VonC 2012-01-16 08:35:16

以前的答案没有保留更改的故事,所以事实上你使用了前一个提交来产生新的提交。 以下过程将保留此故事。

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 

这样的合并会失败,那么所有你需要做的是解决冲突。这对我有效。