我怎样才能告诉樱桃挑选选择提交范围并压制它?
或者换句话说,将两个提交之间的差异应用于存储库的当前状态?
以下内容不起作用(樱桃采摘没有 --squash 选项(:
git cherry-pick --squash e064480..eab48b59c
注意:我的用例是在子树场景中 - 在任何人开始争论我不应该压制之前。
以下工作,但随后我有一系列单独的提交。之后,我可以通过交互式变基手动挤压它们。
git cherry-pick -X subtree=vendor/package e064480..eab48b59c
有没有办法把挤压作为樱桃采摘的一部分?
将-n
传递给git cherry-pick
。这将应用所有提交,但不会提交它们。然后只需执行git commit
即可在单个提交中提交所有更改。
对于某些用例,有用的替代方案与git cherry-pick -n
可能git merge --squash
- 例如,当您想在集成分支之上测试功能分支的更改而不变基时。
来源:git merge --squash 和 git cherry-pick 有什么区别?
从主→跟随从另一个分支中挑选两个提交
git checkout master
git cherry-pick :1
git cherry-pick :2
git reset --soft HEAD~2 (number of cherry pick commits, i.e 2 )
git add .
git commit
- 使用
git cherry-pick --no-commit <commit>…
. - 解决任何冲突。
- 犯。
- 继续
git cherry-pick --continue
。 - 解决任何冲突。
- 现在修改对上一次提交的更改。
- 虽然
git status
显示了步骤 4 中的Cherry-pick currently in progress.
循环。
从 2022 年的讨论中,还有其他方法:
-
git diff A...B | git apply --3wa
但- 它不显示提交消息,
- 您将无法使用显示整个源文件的图形合并工具。
当使用"git cherry-pick
"并且存在冲突时,您可以在整个文件的上下文中看到更改。
-
Johannes Sixt 建议进行交互式变基
例如,要将历史记录的范围
A..B
移植到 HEAD 之上,我会从(注意^0
之后B
开始,因为我不信任自己,所以我会保留真正的分支B
不变,因为我可能会在运行 rebase 时犯错误(:$ git checkout --detach HEAD ;# this is only to use @{-1} later $ git rebase -i --onto HEAD A B^0
然后,如果我的目标是将所有内容压缩到一个提交中,那么将所有"pick"(除了第一个(替换为"squash".
这将使我有一次机会编辑单个提交消息,但编辑器缓冲区从所有原始消息的日志消息开始,因此我可以在编写新内容时从中挑选好部分。我会在分离的 HEAD.
上得到结果如果我喜欢结果,我可能会更新我最初使用它的分支。$ git checkout -B @{-1}
或者,如果我不这样做,也许是因为我犯了错误,那么我可以丢弃它并回到原来的分支。
$ git checkout @{-1}
然而,Noam Yorav-Raphael反对:
我使用"
rebase -i
"的主要问题是它需要我逐个修复合并冲突,在它们出现的每个提交中,而不是一次修复所有冲突,而是将更改从A
处理B
为一体.
它还需要手动编辑A
和B
之间的每次提交。
诺姆提议:
我认为使用现有命令执行我想要的操作的最佳方法是:
git checkout A git merge --squash B git commit --no-edit git checkout @{2} # Go back to where we were at the beginning. # This is not exact, as you're in detached HEAD state. git cherry-pick --edit @{1} # cherry-pick the squashed commit A..B
这允许您一次性修复合并冲突,显示导致冲突的整个文件,并允许您编辑提交消息,从所有压缩提交的描述开始。
我认为这也很好地解释了"
cherry-pick --squash
"将做什么:它确实是"merge --squash
"的类比,但用于樱桃挑选。