我正在研究 2 个不同的分支: 发布 和 开发 。
我注意到我仍然需要将提交给 发布 分支的一些更改集成回 开发 分支。
问题是我不需要所有的提交,只需要某些文件中的一些大块,所以一个简单的
git cherry-pick bc66559
不成功。
当我做一个
git show bc66559
我可以看到差异,但真的不知道将其部分应用于我当前的工作树的好方法。
您在这里想要的核心是git add -p(-p是 的同义词--patch)。这提供了一种添加内容的交互式方式,让您决定是否每个大块都应该进入,甚至在必要时让您手动编辑补丁。
git add -p
-p
--patch
将其与cherry-pick结合使用:
git cherry-pick -n <commit> # get your patch, but don't commit (-n = --no-commit) git reset # unstage the changes from the cherry-picked commit git add -p # make all your choices (add the changes you do want) git commit # make the commit!
(感谢 Tim Henigan 提醒我git-cherry-pick有一个--no-commit选项,感谢 Felix Rabe 指出你需要git reset. 如果你只想在提交中留下一些东西,你可以使用git reset <path>...unstage 那些文件。)
git-cherry-pick
--no-commit
git reset
git reset <path>...
add -p如有必要,您可以提供特定路径。如果你从一个补丁开始,你可以cherry-pick用apply.
add -p
cherry-pick
apply
如果您真的想要git cherry-pick -p <commit>(该选项不存在),您可以使用
git cherry-pick -p <commit>
git checkout -p <commit>
这会将当前提交与您指定的提交进行比较,并允许您单独从该差异中应用大块。如果您拉入的提交在您不感兴趣的部分提交中存在合并冲突,则此选项可能更有用。(但是,请注意,这checkout与cherry- pick:checkout尝试<commit>完全应用的内容不同,而cherry- pick应用差异来自它的父级的指定提交。这意味着checkout可以应用的不仅仅是那个提交,这可能比你想要的更多。)
checkout
cherry- pick
<commit>