我有以下存储库布局:
我想要实现的是从工作分支中挑选一系列提交并将其合并到集成分支中。我对 git 很陌生,我无法弄清楚如何在不弄乱存储库的情况下准确地做到这一点(在一个操作中挑选提交范围,而不是合并)。对此有任何指示或想法吗?谢谢!
当涉及到一系列提交时,挑选樱桃 是 不 实用。
正如下面KeithKim所提到的,Git 1.7.2+引入了挑选一系列提交的能力(但您仍然需要注意挑选樱桃以备将来合并的后果:
从 git v1.7.2 开始,cherry pick 可以接受一系列提交:
git cherry-pick学会了选择一系列提交(例如cherry-pick A..Band cherry-pick --stdin),所以也学会了git revert;但是,这些不支持更好的排序控制rebase [-i]。 git cherry-pick”学会了选择一系列提交 (例如“ cherry-pick A..B”和“ cherry-pick --stdin”),“ git revert”也是如此;不过,这些不支持更好的排序控制“ rebase [-i]”。
git cherry-pick学会了选择一系列提交(例如cherry-pick A..Band cherry-pick --stdin),所以也学会了git revert;但是,这些不支持更好的排序控制rebase [-i]。
git cherry-pick
cherry-pick A..B
cherry-pick --stdin
git revert
rebase [-i]
git cherry-pick”学会了选择一系列提交 (例如“ cherry-pick A..B”和“ cherry-pick --stdin”),“ git revert”也是如此;不过,这些不支持更好的排序控制“ rebase [-i]”。
damian评论并警告我们:
在 ” cherry-pick A..B” 形式中, A 应该比B. 如果它们的顺序错误,命令将静默失败 。
A
B
如果您想 通过 (包括 ) 选择 范围B``D``B B^..D (而不是B..D)。
B``D``B
B^..D
B..D
正如Jubobs在评论中提到的:
这假设这B不是根提交;否则你会得到一个“ unknown revision”错误。
unknown revision
注意:从 Git 2.9.x/2.10(2016 年第三季度)开始,您可以直接在孤立分支(空头)上挑选一系列提交
原始答案(2010 年 1 月)
Arebase --onto会更好,您可以在集成分支上重放给定的提交范围,正如Charles Bailey所描述的那样。(另外,在git rebase 手册页 中查找“这是如何将基于一个分支的主题分支移植到另一个分支的方法” ,以查看实际示例)git rebase --onto
rebase --onto
git rebase --onto
如果您当前的分支是集成:
# Checkout a new temporary branch at the current location git checkout -b tmp # Move the integration branch to the head of the new patchset git branch -f integration last_SHA-1_of_working_branch_range # Rebase the patchset onto tmp, the old location of integration git rebase --onto tmp first_SHA-1_of_working_branch_range~1 integration
这将重播以下之间的所有内容:
first_SHA-1_of_working_branch_range
~1
integration
working
到“ tmp”(integration指向之前指向的位置)
tmp
如果在重放其中一个提交时存在任何冲突:
git rebase --continue
git rebase --skip
git rebase --abort
之后rebase --onto,integration将回到集成分支的最后一次提交(即“ tmp”分支+所有重放的提交)
使用cherry-picking or rebase--onto,不要忘记它会对后续合并产生影响
rebase--onto
这里讨论了一个纯粹的“ cherry- pick”解决方案,并且将涉及以下内容:
cherry- pick
如果你想使用补丁方法,那么“git format-patch|git am”和“git cherry”是你的选择。 目前,git cherry-pick只接受一个提交,但如果你想选择 git lingo 中的范围,B所以D``B^..D
D``B^..D
git rev-list --reverse --topo-order B^..D | while read rev do git cherry-pick $rev || break done
但无论如何,当你需要“重播”一系列提交时,“重播”这个词应该会促使你使用rebaseGit 的“”特性。
rebase