小编典典

如何挑选一系列提交并将它们合并到另一个分支中?

all

我有以下存储库布局:

  • 主分支(生产)
  • 一体化
  • 在职的

我想要实现的是从工作分支中挑选一系列提交并将其合并到集成分支中。我对 git
很陌生,我无法弄清楚如何在不弄乱存储库的情况下准确地做到这一点(在一个操作中挑选提交范围,而不是合并)。对此有任何指示或想法吗?谢谢!


阅读 192

收藏
2022-03-02

共1个答案

小编典典

当涉及到一系列提交时,挑选樱桃 实用。

正如下面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]”。

damian评论并警告我们:

在 ” cherry-pick A..B” 形式中, A 应该比B.
如果它们的顺序错误,命令将静默失败

如果您想 通过 (包括 选择 范围B``D``B B^..D (而不是B..D)。

正如Jubobs在评论中提到的:

这假设这B不是根提交;否则你会得到一个“ unknown revision”错误。

注意:从 Git 2.9.x/2.10(2016 年第三季度)开始,您可以直接在孤立分支(空头)上挑选一系列提交


原始答案(2010 年 1 月)

Arebase --onto会更好,您可以在集成分支上重放给定的提交范围,正如Charles Bailey所描述的那样。(另外,在git rebase 手册页 中查找“这是如何将基于一个分支的主题分支移植到另一个分支的方法” ,以查看实际示例)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指向之前指向的位置)

如果在重放其中一个提交时存在任何冲突:

  • 要么解决它并运行“ git rebase --continue”。
  • 或者跳过这个补丁,而是运行“ git rebase --skip
  • 或用“ git rebase --abort”取消所有东西(并将分支放回integration分支上tmp

之后rebase --ontointegration将回到集成分支的最后一次提交(即“ tmp”分支+所有重放的提交)

使用cherry-picking or rebase--onto,不要忘记它会对后续合并产生影响


这里讨论了一个纯粹的“ cherry- pick”解决方案,并且将涉及以下内容:

如果你想使用补丁方法,那么“git format-patch|git am”和“git cherry”是你的选择。
目前,git cherry-pick只接受一个提交,但如果你想选择 git lingo 中的范围,B所以D``B^..D

git rev-list --reverse --topo-order B^..D | while read rev 
do 
  git cherry-pick $rev || break 
done

但无论如何,当你需要“重播”一系列提交时,“重播”这个词应该会促使你使用rebaseGit 的“”特性。

2022-03-02