Git解决cherry-pick冲突后不允许修改修订提交。

14

我挑选了一个提交并解决了冲突,将它们添加后,现在尝试进行git amend时失败了,出现以下消息。

致命错误:您正在进行一个精选 -- 无法修改。

为什么Git会给出这个消息,有没有办法告诉它一切正常?


9
继续执行 git cherry-pick - user4003407
那不会创建一个新的提交吗? - garg10may
1
@garg10may 不,它会完成你对cherry-pick的冲突所做的操作。它需要被提交,而不仅仅是添加。使用--continue,当有冲突时与rebase相同。如果您想要修改带有冲突的提交,请只需添加文件,然后执行--continue,无需修改。 - martin.malek
不强制继续,有一个解决办法,我在答案中进行了说明。 - garg10may
请返回已翻译的文本。如果需要帮助,请参考以下链接:https://dev59.com/WWEh5IYBdhLWcg3wrVLW#58425801 - quintin
4个回答

14

我手动删除了 .git/CHERRY_PICK_HEAD,现在Git不知道我进行了一个cherry-pick操作,所以使用amend命令就像是对一个普通的提交进行修改一样。

cherry-pick --continue会添加一个新的提交信息,需要重新进行变基(rebase),这很麻烦。


1
这个方法可以实现,但最好不要手动操作.git目录中的文件。你可以先使用cherry-pick --continue命令添加新的提交,然后通过"git reset HEAD~"撤销该提交,此时你已经不再处于cherry-pick的过程中了。因此,你可以进行提交修正。 - Sola Yang

8

看起来你之前进行了一次cherry-pick,由于冲突而失败。因此,git认为你仍处于cherry-pick的中间状态,因为它期望你解决冲突、添加有冲突的文件并运行git cherry-pick --continue

你可以选择运行git cherry-pick --abort来中止这个cherry-pick,也就是将有冲突的文件返回到它们之前的状态,可能会失去一些更改;或者运行git cherry-pick --continue来继续进行cherry-pick。如果你不记得你何时以及使用哪个cherry-pick,那么后者可能是更好的选择,但在--continue命令之前和之后要密切关注你的存储库。

这两个命令都可以使你退出cherry-pick状态,从而允许你执行修改操作。


1
行为定义在文档中。
你需要的是:

--continue
使用.git/sequencer中的信息继续进行操作。可用于在失败的cherry-pick或revert后继续。


我不想创建一个新的提交,而是要修改上一次的提交。这将会创建一个新的提交,需要进行变基操作。 - garg10may
@garg10may 你尝试过在cherrypick命令中使用--no-commit参数吗? - Minzkraut

0

当运行像 cherry-pickrebasemerge 这样的操作时,git 会跟踪基础提交的几个信息。

这似乎是一个合理的安全措施,以防止基础提交被修改。


我建议你先以某种方式完成你的cherry-pick,然后使用rebase -i来修改你想要提交的顺序。

如果我们使用以下名称:

--*--*-- ... --A--B <- HEAD
      \
       *-- ... X <- cherry-picked commit

# you are currently on B, you run :
git cherry-pick X

如果您希望联系:

--*--*-- ... --A--B'--X' <- cherry-picked version of X
      \           ^
       \          a modified version of B
        *-- ... X

你可以:

# add the modifications intended for B' :
git add -p [files]
# create a regular commit, using "git commit" :
git commit

--*--*-- ... --A--B--C

# complete the cherry-pick process :
git add [files with solved conflicts]
git cherry-pick --continue

--*--*-- ... --A--B--C--X'

# use 'rebase -i A' to squash B and C into one commit
git rebase -i A
# set the rebase actions to "squash C into B"

# the result should be what you expect :
--*--*-- ... --A--B'--X'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接