我有以下存储库布局:
主分支(生产)集成工作
我想实现的是从工作分支中挑选一系列提交,并将其合并到集成分支中。我对git很陌生,我无法弄清楚如何在不破坏存储库的情况下准确地做到这一点(在一次操作中挑选提交范围,而不是合并)。对此有什么建议或想法吗?谢谢
我有以下存储库布局:
主分支(生产)集成工作
我想实现的是从工作分支中挑选一系列提交,并将其合并到集成分支中。我对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功能强大且简单,但它会创建重复的提交当我想合并时,我必须解决初始提交和重复提交之间的冲突,所以对于一个或两个樱桃选择,“樱桃选择”是可以的,但对于更多的,它太冗长,分支将变得太复杂
其他回答
先摘樱桃。。LAST仅适用于简单场景。
为了实现一个体面的“将其合并到集成分支中”,同时对自动跳过已集成的拾取、移植钻石合并、交互控制等事情感到舒适……)最好使用重基。这里的一个答案指出了这一点,然而协议包括一个危险的git分支-f和一个临时分支。这里有一个简单的稳健方法:
git rebase -i FIRST LAST~0 --onto integration
git rebase @ integration
-i允许交互控制。如果LAST是分支名称,~0可确保分离的重基(不移动/另一个分支)。否则可以省略。第二个rebase命令只是以安全的方式将集成分支ref向前移动到中间分离的头部-它不会引入新的提交。要使用合并菱形等对复杂结构进行重基化,请考虑第一个重基中的--rebase merges或--rebase convers=rebase cousins。
我将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在这种情况下很有用,因为我在同一个存储库中有两棵树,但没有共享的祖先。
合并有时会很困难,只需创建一个补丁并手动应用更改即可。
创建从start_commit到end_commit的修补程序文件。git diff<start_commit><end_commit>>patch.diff签出分支并手动应用修补程序中的更改。
几天前,在阅读了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功能强大且简单,但它会创建重复的提交当我想合并时,我必须解决初始提交和重复提交之间的冲突,所以对于一个或两个樱桃选择,“樱桃选择”是可以的,但对于更多的,它太冗长,分支将变得太复杂
假设您有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
继续樱桃采摘过程。