Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git cherry picking commit-commit是快照还是修补程序?_Git_Cherry Pick - Fatal编程技术网

Git cherry picking commit-commit是快照还是修补程序?

Git cherry picking commit-commit是快照还是修补程序?,git,cherry-pick,Git,Cherry Pick,我有一个问题是关于责任和冲突的 提交的“Pro-Git”书籍是一种快照,而不是补丁/差异 但樱桃树可能会表现得像一块补丁 简言之,示例如下: 创建3次提交,每次编辑文件的第一行(和一行) 将分支重置为首次提交 测试1:尝试选择第三次提交(冲突) 测试2:尝试选择第二次提交(OK) 测试1 #reset the branch to 9d5dd4d ('A' version) git reset --hard HEAD~2 HEAD is now at 9d5dd4d A git log --

我有一个问题是关于责任和冲突的

提交的“Pro-Git”书籍是一种快照,而不是补丁/差异

但樱桃树可能会表现得像一块补丁


简言之,示例如下:

  • 创建3次提交,每次编辑文件的第一行(和一行)

  • 将分支重置为首次提交

  • 测试1:尝试选择第三次提交(冲突)

  • 测试2:尝试选择第二次提交(OK)


  • 测试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
    

    请解释测试1失败的原因(如果提交是补丁,而不是快照,我可以想象答案是什么?

    专业Git书籍是正确的:提交就是快照

    不过,您也是正确的:
    git cherry pick
    应用补丁

    这怎么可能?答案是,当你选择一个提交时,你还指定了哪一个父提交要考虑,使用<代码> -M父编号< /> >参数。然后,cherry pick命令针对该父级生成一个diff,以便现在可以应用生成的diff


    如果您选择cherry pick非合并提交,则只有一个父级,因此您实际上不会传递
    -m
    ,并且该命令使用(单个)父级来生成差异。但是提交本身仍然是一个快照,是
    cherry pick
    命令查找
    提交^1
    的差异(第一个也是唯一的父级)vs
    commit
    并应用它。

    在第一次测试中存在合并冲突。因为你在第二次重置,所以成功了。Polywhill,谢谢你的回答,但是:1)不确定为什么你破坏了原始帖子的格式2)在检测到代码块时,testsStack溢出可能有点敏感之前,有一个硬重置@Polywhill先生实际上并没有试图改变任何东西,只是通过点击并排标记将其列为一个编号列表,正如您在修订历史中看到的那样。虽然可以在编辑预览中发现格式问题,但根据经验,我知道这很容易被忽略。对不起,我还是不明白。从您的解释的最后一段开始-在我的test1和test2中,
    commit^1
    &
    commit
    是什么?Git有丰富的语法来处理提交图。您可以通过提交的原始SHA-1(
    c18b86734113…
    etc)来命名提交,但也可以通过跟踪提交图中的路径来命名提交。每个提交记录其父提交,并且
    ^
    语法选择特定的父提交。您将在第3章中看到更多关于提交图的信息,例如,在第7章中看到关于修订选择器的信息:Torek,我的问题表述错误,我知道SHA-1,^和~。让我们回到我的三个提交A、B和C。在最后一句话中,您谈到了提交和其父级之间的差异,这是由C-p应用的。所以,我的问题是:在测试1中,这些提交是9d5dd4d(A)和c90c5c8(C),对吗?所以他们的区别是“A\n”和“C\n”,这是我不明白的一点。为什么这个樱桃拣选失败,而差异为“A\n”和“B\n”的test2成功了?啊。不,当您要求cherry pick
    c90c5c8
    git找到它的父对象,即
    28ad28f
    。试试看:
    git rev parse c90c5c8^
    ,和
    git diff c90c5c8^c90c5c8
    。一旦提交存在,它就永远不会更改
    git reset
    不会更改任何现有的提交,它只会更改当前分支名称解析为哪个提交(再次使用
    git rev parse
    演示:
    git rev parse master
    将显示其当前原始SHA-1)。Cherry pick将提交与其父级进行比较,因为它是这样定义的。您给git一个或多个提交ID,git会找到每个命名提交的父项(如果合并,则为
    -m
    )并执行一个diff,然后尝试应用该diff。在这种情况下,diff是“将B更改为C”,没有B,因此您会得到您观察到的补丁应用程序错误。(如果要执行其他操作,则不需要cherry pick命令。例如,如果只需要某个文件的特定快照版本,请使用
    git checkout--
    ,或
    git show:
    #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
    
    #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(-)