[英]Git: Merge old commit into current head version
有一个文件有两个感兴趣的提交,都在Master
分支上,都只修改单个文件foo
:先前的提交AA
,以及HEAD
的当前版本。 我想合并文件的两个版本,保留两者的位,进入Master
HEAD
。
我做了一件我觉得最简单的事情:
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
这只是用AA
版本覆盖当前HEAD
版本的foo
。 尝试了更详细的git checkout -m
,同样的结果:一个愚蠢的覆盖。
我如何强制git将AA
版本的foo
视为与当前HEAD
版本的冲突合并?
如果git的合并没有做你想要的,你可以改为:
foo
中没有未提交的更改,例如确保git status
是干净的。 AA
的版本覆盖foo
: git show AA:foo > foo
foo
进行更改: git add -p foo
git checkout -- foo
-foo丢弃foo
所有其他更改 git commit
或者,如果您更喜欢使用图形差异工具(例如meld
),您可以这样做:
git show AA:foo > old-foo
meld old-foo foo
以前的答案不会保留更改的故事,因此您使用先前的提交来生成新的提交。 以下程序将保留这个故事。
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 merge --no-commit merge-purgatory
至少会给你机会审查:在提交之前更改合并。
另请参阅“ 如何使用git-merge合并选择性文件? ”中提出的技术,基于挑选或结帐。
关于强制手动合并,您可以在.gitatributes
文件中声明该特定文件的合并策略设置为取消设置 。
执行三向合并
合并
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 -f b855a13754fabf5cef6ff93ab00558608a839377 -- .
这会强制将commit id更改为当前分支(master),然后我从这些应用的更改中创建了一个新分支( checkout -b
),并从后者创建了一个合并请求。
以上都不适合我:-(
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.