我有以下存储库布局:

主分支(生产)集成工作

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


当前回答

几天前,在阅读了Vonc的非常清晰的解释后,我已经测试了这一点。

我的脚步

开始

分支机构名称:A B C D E F G H I J分支目标:A B C D我不想要E和H

复制分支dev_feature_wo_E_H中没有步骤E和H的要素的步骤

git结帐设备git checkout-b dev_feature_wo_E_Hgit rebase--交互式--rebase合并--没有ff D,我在rebase编辑器中将E和H放在前面解决冲突,继续并提交

在目标上复制分支dev_feature_wo_E_H的步骤。

git结帐目标git merge--无ff--无提交dev_feature_wo_E_H解决冲突,继续并提交

一些备注

我这么做是因为前几天摘了太多樱桃git cherry pick功能强大且简单,但它会创建重复的提交当我想合并时,我必须解决初始提交和重复提交之间的冲突,所以对于一个或两个樱桃选择,“樱桃选择”是可以的,但对于更多的,它太冗长,分支将变得太复杂

其他回答

我将VonC的代码打包成一个简短的bash脚本gitmulticherry-pick,以便于运行:

#!/bin/bash

if [ -z $1 ]; then
    echo "Equivalent to running git-cherry-pick on each of the commits in the range specified.";
    echo "";
    echo "Usage:  $0 start^..end";
    echo "";
    exit 1;
fi

git rev-list --reverse --topo-order $1 | while read rev 
do 
  git cherry-pick $rev || break 
done 

我目前正在使用这个方法来重建一个项目的历史,该项目在同一个svn主干中混合了第三方代码和定制。我现在正在将核心第三方代码、第三方模块和定制拆分到各自的git分支上,以便更好地理解未来的定制。gitcherry-pick在这种情况下很有用,因为我在同一个存储库中有两棵树,但没有共享的祖先。

几天前,在阅读了Vonc的非常清晰的解释后,我已经测试了这一点。

我的脚步

开始

分支机构名称:A B C D E F G H I J分支目标:A B C D我不想要E和H

复制分支dev_feature_wo_E_H中没有步骤E和H的要素的步骤

git结帐设备git checkout-b dev_feature_wo_E_Hgit rebase--交互式--rebase合并--没有ff D,我在rebase编辑器中将E和H放在前面解决冲突,继续并提交

在目标上复制分支dev_feature_wo_E_H的步骤。

git结帐目标git merge--无ff--无提交dev_feature_wo_E_H解决冲突,继续并提交

一些备注

我这么做是因为前几天摘了太多樱桃git cherry pick功能强大且简单,但它会创建重复的提交当我想合并时,我必须解决初始提交和重复提交之间的冲突,所以对于一个或两个樱桃选择,“樱桃选择”是可以的,但对于更多的,它太冗长,分支将变得太复杂

git cherry pick start_commit_sha_id ^。。结束委托sha_id

例如git cherry pick 3a7322ac。。7d7c123c型

假设您在branchA上,希望从branchB选择提交(给定范围的开始和结束提交SHA,左侧提交SHA较旧)。整个提交范围(包括两个)将在branchA中进行精心挑选。

官方文件中给出的示例非常有用。

从git v1.7.2起,cherry-pick可以接受一系列提交:

git cherry-pick学会了选择一系列提交(例如cherry-pick a..B和cherry--pick-stdin),git revert也学会了选择;然而,这些并不支持rebase[-i]所具有的更好的测序控制。

正如Gabe Moothart所指出的,cherry pick A..B不会得到commit A(你需要A~1..B),如果有任何冲突,git不会像rebase那样自动继续(至少在1.7.3.1)。

假设您有2个分支,

“branchA”:包括要复制的提交(从“commitA”到“commitB”

“branchB”:要从“branchA”转移提交的分支

1)

 git checkout <branchA>

2) 获取“commitA”和“commitB”的ID

3)

git checkout <branchB>

4)

git cherry-pick <commitA>^..<commitB>

5) 如果您有冲突,请解决并键入

git cherry-pick --continue

继续樱桃采摘过程。