我有一个与挑选提交和冲突相关的问题。
' Pro Git'提交的书explains是一种快照,而不是补丁/差异。
但挑选樱桃的行为可能与补丁一样。
以下示例,简而言之:
创建3次提交,每次编辑文件的第一行(和单行)
将分支重置为首次提交
test1:尝试挑选第三次提交(冲突)
测试2:尝试挑选第二次提交(OK)
mkdir gitlearn
cd gitlearn
touch file
git init
Initialized empty Git repository in /root/gitlearn/.git/
git add file
#fill file by single 'A'
echo A > file && cat file
A
git commit file -m A
[master (root-commit) 9d5dd4d] A
1 file changed, 1 insertion(+)
create mode 100644 file
#fill file by single 'B'
echo B > file && cat file
B
git commit file -m B
[master 28ad28f] B
1 file changed, 1 insertion(+), 1 deletion(-)
#fill file by single 'C'
echo C > file && cat file
C
git commit file -m C
[master c90c5c8] C
1 file changed, 1 insertion(+), 1 deletion(-)
git log --oneline
c90c5c8 C
28ad28f B
9d5dd4d A
测试1
#reset the branch to 9d5dd4d ('A' version)
git reset --hard HEAD~2
HEAD is now at 9d5dd4d A
git log --oneline
9d5dd4d A
#cherry-pick 'C' version over 'A'
git cherry-pick c90c5c8
error: could not apply c90c5c8... C
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
#the conflict:
cat file
<<<<<<< HEAD
A
=======
C
>>>>>>> c90c5c8... C
测试2
#same for 'B' - succeeds
git reset --hard HEAD
HEAD is now at 9d5dd4d A
git cherry-pick 28ad28f
[master eb27a49] B
1 file changed, 1 insertion(+), 1 deletion(-)
请解释为什么测试1失败了(如果提交是修补程序,我可以想象答案,但快照?)
答案 0 :(得分:7)
Pro Git书是正确的:提交是快照。
你也是对的:git cherry-pick
应用补丁。
这怎么可能?答案是,当您挑选提交时,还可以使用-m parent-number
参数指定要考虑的父提交。 cherry-pick命令然后生成针对该父项的diff,以便现在可以应用生成的diff。
如果您选择非合并提交,则只有一个父级,因此您实际上并未传递-m
,并且该命令使用(单个)父级来生成差异。但是提交本身仍然是一个快照,它是cherry-pick
命令,用于查找commit^1
(第一个也是唯一的父级)vs commit
的差异并应用这一点。