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



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

在这种情况下,会发生冲突。Git 暂停樱桃采摘并等待您解决冲突或中止樱桃采摘。从概念上讲,这与可能由于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. 从更改README.md文件内容的feature/readme-update中挑选提交

    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中止它

相关内容

  • 没有找到相关文章

最新更新