NB:这是我之前的帖子(现已删除)的重写。重新措辞旨在使该职位有所不同。
运行git cherry-pick
后,git
报告发生了冲突。我解决了冲突,然后运行git cherry-pick --continue
。此时,$GIT_EDITOR
弹出了一个COMMIT_EDITMSG
缓冲区,其中预先填充了樱桃选择的提交的原始邮件以及一些其他信息,其中包含警告:
# It looks like you may be committing a cherry-pick.
# If this is not correct, please remove the file
# .git/CHERRY_PICK_HEAD
# and try again.
我查看了如果我删除" (实际上,只是暂时重命名).git/CHERRY_PICK_HEAD
文件。立即产生的外在影响是从我的|CHERRY-PICKING
感知提示中移除git
指示。
除了我的提示中的这个更改,以及COMMIT_EDITMSG
缓冲区中预先填充的信息可能存在一些差异之外,使用或不使用.git/CHERRY_PICK_HEAD
文件执行提交会有什么不同放置?
更确切地说,我在这里尝试比较两种情况。
在第一个场景中,我运行
% git cherry-pick --continue
...和(忽略前面引用的警告)我像往常一样继续提交。
在第二个场景中,我运行
% rm .git/CHERRY_PICK_HEAD
% git commit
...并像往常一样继续提交。
(假设我在两种情况下都使用相同的提交消息。)
这两种情况的结果会有何不同?
答案 0 :(得分:2)
答案取决于你在做什么。使用--continue
完成序列 - 但如果序列只是一个樱桃选择,那么无论如何都没有真正的序列。
git cherry-pick
和git revert
- 内部实际上是相同的命令;只是"向后工作" - 使用Git称之为音序器。也就是说,您可以一次选择多个提交:
git cherry-pick notthis..that thistoo
樱桃挑选所有提交""" notthis
,直至并包括that
,以及一个特定的提交thistoo
。例如,您可能决定挑选feature/X
上从develop
增长的每个提交,以及一个错误修复提交fix-1234
,用于测试目的:
git checkout master
git checkout -b testbranch
git cherry-pick develop..feature/X fix-1234
无论如何,这里的要点是,这可能会挑选十几个或更多提交,并且在某个地方可能存在合并冲突,这需要git cherry-pick
停止并获得帮助。
除此之外:这里的模型 - Unix / Linux命令行 - 是在命令解释器中输入命令,称为 shell 。 shell将人机界面的控制权传递给新命令,该命令会保留该命令直到命令完成并退出。命令退出后,命令本身不会留下任何痕迹:任何 permanent 必须保存在文件中。
所以:如果樱桃选择必须停止,它将如何知道恢复的位置?答案是将信息保存在文件中。如果你挑选一个提交,Git只保存CHERRY_PICK_HEAD
文件,该文件记录了被挑选的提交的ID。但是,如果您正在挑选多个提交,Git会保存与单个提交相冲突的提交,和会将剩余信息保存在排序目录中(其中随着时间的推移,位置已经移动了一些。)
运行git cherry-pick --continue
指示(新的,单独的实例)cherry pick命令来拾取上一个停止的位置。 Git将首先为您运行git commit
,然后找到排序信息并完成尽可能多的序列,在下一次冲突中再次停止,或完成所有樱桃选择。
改为运行git commit
,Git会注意到CHERRY_PICK_HEAD
文件,并按照您的看法使用它。提交完成后,该命令退出并对序列发生器不执行任何操作。如果 序列发生器数据遗留下来,你现在可以git cherry-pick --continue
:Git会注意到提交已经完成,只需继续/完成定序器操作。
请注意,您可以使用git cherry-pick --abort
而不是完成操作。这将终止操作并使事情恢复到开始之前的状态。从Git 2.19开始,您可以使用git cherry-pick --quit
停止(la --abort
),但不将事情恢复到开始前的状态。也就是说,它会阻止任何未来的挑选操作,而不会撤消到目前为止所做的那些操作。 (此操作在2.19之前丢失。)
git status
命令现在会注意到是否有正在进行的序列,并且报告您正在处理它正在进行的任何事情。 (与Git 1.7时代相比,这是一个很大的改进,当它没有。)
答案 1 :(得分:0)
正如我所评论的,git cherry-pick --quit
也会删除.git/CHERRY_PICK_HEAD
,但是,此外,消息“如果不正确,请删除文件.git/CHERRY_PICK_HEAD
”将在Git 2.29中更改( 2020年第4季度):对两个伪引用的访问已更新,可以正确使用引用API。
请参见commit b8825ef的commit b6d2558,commit c8e4159,commit 3f9f1ac,Han-Wen Nienhuys (hanwen
)(2020年8月21日)。
(由Junio C Hamano -- gitster
--在commit e699684中合并,2020年8月31日)
builtin/commit
:建议使用update-ref删除伪引用签名人:Han-Wen Nienhuys
当伪引用移动到不同引用存储机制时,伪引用不再可以通过'
rm
'删除。
而是建议一个“update-ref -d
”命令,该命令将与引用存储后端无关。
新消息将提示:git update-ref -d CHERRY_PICK_HEAD