提交时`.git / CHERRY_PICK_HEAD`会有什么不同?

时间:2017-02-07 12:35:47

标签: git cherry-pick git-cherry-pick

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

...并像往常一样继续提交。

(假设我在两种情况下都使用相同的提交消息。)

这两种情况的结果会有何不同?

2 个答案:

答案 0 :(得分:2)

答案取决于你在做什么。使用--continue完成序列 - 但如果序列只是一个樱桃选择,那么无论如何都没有真正的序列。

音序器

git cherry-pickgit 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 b8825efcommit b6d2558commit c8e4159commit 3f9f1acHan-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