Cherry-picking正在将从任意提交复制的一系列差异应用于存储库的当前状态。如果其中一些差异与存储库的当前状态不一致,会发生什么情况?例如,如果其中一个差异修改了文件 f,但该文件不再存在于当前存储库中怎么办?
在这种情况下,会发生冲突。Git 暂停樱桃采摘并等待您解决冲突或中止樱桃采摘。从概念上讲,这与可能由于git merge
或git rebase
引起的冲突相同。
如果其中一个差异修改了文件 f,但该文件不再存在于当前存储库中怎么办
Git 会让你选择保留你正在挑选的文件,保持文件删除或手动更新文件。
很容易亲眼看到它是如何工作的。
-
在文件系统中的某个位置(在现有 Git 存储库之外),创建一个新目录并输入它。
mkdir cherry cd cherry
-
初始化空的 Git 存储库
git init
-
创建一个文件并向其中添加一些内容
echo "Some changes" > README.md
-
将文件添加到索引并提交更改
git add README.md git commit -m "Added some content to the readme"
-
创建并签出新分支
git checkout -b feature/readme-update
-
再次更改
README.md
文件echo "New content of README" > README.md
-
暂存并提交更改
git add README.md git commit -m "Added more to readme"
保存上次提交的哈希值。
-
返回到
master
并删除文件,提交更改git checkout master git rm README.md git commit -m "Removed the readme"
-
从更改
README.md
文件内容的feature/readme-update
中挑选提交git cherry-pick <commit-hash>
-
你手上有冲突
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
中止它