Git:将旧提交合并到当前头版本中

时间:2012-01-16 08:18:03

标签: git merge

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版本的冲突合并?

4 个答案:

答案 0 :(得分:17)

如果git的合并没有达到你想要的效果,你可以改为:

  1. 确保文件foo中没有未提交的更改,例如确保git status干净。
  2. 使用foo使用AA
  3. 覆盖git show AA:foo > foo版本foo
  4. 选择性地仅展示您想要的git add -p foo所做的更改:foo
  5. 使用git checkout -- foo
  6. 放弃对git commit的所有其他更改
  7. 提交分阶段更改:meld
  8. 或者,如果您更喜欢使用图形差异工具(例如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),并从后者中创建了合并请求。

以上都不对我有用:-(