从与存储库的当前状态不一致的提交中挑选樱桃

时间:2017-04-08 11:44:22

标签: git git-cherry-pick

Cherry-picking正在应用从任意提交中复制的一系列差异到存储库的当前状态。如果其中一些差异与存储库的当前状态不一致会发生什么?例如,如果其中一个差异修改了文件f,但当前存储库中不再存在该文件,该怎么办?

1 个答案:

答案 0 :(得分:2)

在这种情况下,会发生冲突。 Git停下樱桃挑选,等待你解决冲突或中止樱桃挑选。从概念上讲,这与a conflict that might arise due to a git mergegit rebase相同。

  

如果其中一个差异修改了文件f,但该文件在当前存储库中不再存在

Git会向您提供选择保留文件的选择,保留文件删除或手动更新文件。

很容易看出它是如何工作的。

  1. 在您的文件系统中的某个位置(在现有Git存储库之外),创建一个新目录并输入它。

    mkdir cherry
    cd cherry
    
  2. 初始化一个空的Git存储库

    git init
    
  3. 创建文件并向其添加一些内容

    echo "Some changes" > README.md
    
  4. 将文件添加到索引并提交更改

    git add README.md
    git commit -m "Added some content to the readme"
    
  5. 创建并签出新分支

    git checkout -b feature/readme-update
    
  6. 再次更改README.md文件

    echo "New content of README" > README.md
    
  7. 分阶段并提交更改

    git add README.md
    git commit -m "Added more to readme"
    

    保存上次提交的哈希值。

  8. 返回master并删除文件,提交更改

    git checkout master
    git rm README.md
    git commit -m "Removed the readme"
    
  9. Cherry-从feature/readme-update中选择您更改README.md文件内容的提交

    git cherry-pick <commit-hash>
    
  10. 你手上有冲突

    tomek@LAPTOP-SGL6966J MINGW64 /c/repos/cherry (master)
    $ git cherry-pick <commit-hash>
    error: could not apply 4a99ca7... Added more to readme
    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'
    
    tomek@LAPTOP-SGL6966J MINGW64 /c/repos/cherry (master|CHERRY-PICKING)
    

    git status也会告诉你同样的事情

    $ git status
    On branch master
    You are currently cherry-picking commit 4a99ca7.
      (fix conflicts and run "git cherry-pick --continue")
      (use "git cherry-pick --abort" to cancel the cherry-pick operation)
    
    Unmerged paths:
      (use "git add/rm <file>..." as appropriate to mark resolution)
    
        deleted by us:   README.md
    

    在这种情况下,您可以删除文件(接受来自master的更改)或添加文件(接受您挑选的更改)。另一个选择是以您认为合理的方式手动调整文件。

    无论您接受哪些更改,请将其应用于文件,暂存并继续拨打git cherry-pick --continue

    如果您感到困惑并且不想继续使用樱桃选择,请致电git cherry-pick --abort

  11. 将其中止