小编典典

部分使用 Git 挑选提交

all

我正在研究 2 个不同的分支: 发布开发

我注意到我仍然需要将提交给 发布 分支的一些更改集成回 开发 分支。

问题是我不需要所有的提交,只需要某些文件中的一些大块,所以一个简单的

git cherry-pick bc66559

不成功。

当我做一个

git show bc66559

我可以看到差异,但真的不知道将其部分应用于我当前的工作树的好方法。


阅读 111

收藏
2022-03-09

共1个答案

小编典典

您在这里想要的核心是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 那些文件。)

add -p如有必要,您可以提供特定路径。如果你从一个补丁开始,你可以cherry-pickapply.


如果您真的想要git cherry-pick -p <commit>(该选项不存在),您可以使用

git checkout -p <commit>

这会将当前提交与您指定的提交进行比较,并允许您单独从该差异中应用大块。如果您拉入的提交在您不感兴趣的部分提交中存在合并冲突,则此选项可能更有用。(但是,请注意,这checkoutcherry- pick:checkout尝试<commit>完全应用的内容不同,而cherry- pick应用差异来自它的父级的指定提交。这意味着checkout可以应用的不仅仅是那个提交,这可能比你想要的更多。)

2022-03-09