don*_*ote 53 git git-cherry-pick git-squash
我怎么能告诉樱桃选择一个被压缩的提交范围?
或者换句话说,将两个提交之间的差异应用于存储库的当前状态?
以下就不能正常工作(摘樱桃没有--squash选项):
git cherry-pick --squash e064480..eab48b59c
Run Code Online (Sandbox Code Playgroud)
注意:我的用例是在一个子树场景中 - 在任何人开始争论我不应该压制之前.
以下工作,但后来我有一系列单独的提交.之后,我可以使用交互式rebase手动压缩它们.
git cherry-pick -X subtree=vendor/package e064480..eab48b59c
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以挤压作为樱桃挑选的一部分?
Dav*_*sch 81
传递-n
给git cherry-pick
.这将应用所有提交,但不提交它们.然后只需git commit
在单个提交中提交所有更改.
对于某些用例来说,有用的替代方案git cherry-pick -n
可能是git merge --squash
- 例如,当您想要在集成分支之上测试功能分支的更改而不进行变基时。
来源:git merge --squash 和 gitcherry-pick 之间有什么区别?
小智 8
从 master \xe2\x86\x92 开始,从另一个分支中挑选两个提交
\ngit checkout master\ngit cherry-pick :1 \ngit cherry-pick :2\ngit reset --soft HEAD~2 (number of cherry pick commits, i.e 2 ) \ngit add . \ngit commit\n
Run Code Online (Sandbox Code Playgroud)\n
从2022 年的讨论来看,还有其他方法:
git diff A...B | git apply --3wa
但,
git cherry-pick
”并且存在冲突时,您可以看到整个文件上下文的变化。Johannes Sixt 建议进行交互式变基
例如,要将历史范围移植
A..B
到 HEAD 之上,我会开始(注意^0
之后B
,因为我不相信自己,所以我会保持真正的分支B
不变,因为我在运行 rebase 时可能会犯错误):Run Code Online (Sandbox Code Playgroud)$ git checkout --detach HEAD ;# this is only to use @{-1} later $ git rebase -i --onto HEAD A B^0
然后,如果我的目标是将所有内容压缩为单个提交,则将除第一个之外的所有“pick”替换为“squash”。
这将给我一次编辑单个提交消息的机会,但编辑器缓冲区以所有原始消息中的日志消息开始,因此我可以在编写新内容时从中挑选出好的部分。我将在分离的 HEAD 上得到结果。
如果我喜欢这个结果,我可以用它更新我原来所在的分支。Run Code Online (Sandbox Code Playgroud)$ git checkout -B @{-1}
或者,如果我不这样做,也许是因为我犯了错误,那么我可以放弃它并返回到原来的分支。
Run Code Online (Sandbox Code Playgroud)$ git checkout @{-1}
然而,诺姆·约拉夫-拉斐尔 (Noam Yorav-Raphael) 反对:
我使用“
rebase -i
”的主要问题是,它需要我在出现合并冲突的每次提交上一一修复它们,而不是一次修复所有冲突,将从 到 的更改视为A
一个B
。
它还需要对A
和之间的每次提交进行手动编辑B
。
诺姆建议:
我认为使用现有命令执行我想要的操作的最佳方法是:
Run Code Online (Sandbox Code Playgroud)$ git checkout --detach HEAD ;# this is only to use @{-1} later $ git rebase -i --onto HEAD A B^0
这允许您一次性修复合并冲突,显示导致冲突的整个文件,并允许您编辑提交消息,从所有压缩提交的描述开始。
我认为这也很好地解释了“
cherry-pick --squash
”将做什么:它确实是“”的类似物merge --squash
,但用于樱桃挑选。
归档时间: |
|
查看次数: |
18595 次 |
最近记录: |