从特定提交获取更改而不更改父项

时间:2014-08-13 21:30:16

标签: git

假设我有一个包含内容的文本文件

A

我提交文件(commit febcdb0)。然后我做了另一个更改,现在该文件包含:

A
B

它已提交(提交0d03344)。然后我做了另一个改变:

A
B
C

它也承诺(4077fb8)。有没有办法删除第二次提交,所以我最终得到:

A
C

没有像这样的冲突结束:

A
<<<<<<< HEAD
B
C
======
>>>>>>> parent of 0d03344... B

那是 - 我特别想要上次提交时引入的更改,但我想放弃上一次提交的更改?

我尝试过互动式单挑和樱桃采摘,但似乎没什么用。

所以,如果我这样做:

git checkout fedcbd0
git checkout -b test
git cherry-pick 4077fb8

我得到了回复:

Automatic cherry-pick failed.  After resolving the conflicts,
mark the corrected paths with 'git add <paths>' or 'git rm <paths>'
and commit the result with:

    git commit -c 4077fb8

文件内容与上述冲突有关。

2 个答案:

答案 0 :(得分:1)

使用git cherry-pick,您可以应用某些现有提交所引入的更改。在你的情况下,你可以回到第一个提交并创建一个新的分支,然后使用cherry-pick在那里应用最后的提交,以便最后你将删除第二个提交

git checkout -b new_branch febcdb0

git cherry-pick 4077fb8

答案 1 :(得分:1)

在不造成合并冲突的情况下,这样做并不是一个好方法。在提交4077fb8中,行C在行B之后和文件结尾之前添加。如果您尝试直接将该更改应用于febcdb0,Git将无法在C和文件结尾之间准确插入新行B,因为没有行B 。因为这个更改距离之前的提交0d03344还不够远,所以Git在此处谨慎行事,并生成必须解决的合并冲突。