我有以下存储库布局:
主分支(生产)集成工作
我想实现的是从工作分支中挑选一系列提交,并将其合并到集成分支中。我对git很陌生,我无法弄清楚如何在不破坏存储库的情况下准确地做到这一点(在一次操作中挑选提交范围,而不是合并)。对此有什么建议或想法吗?谢谢
我有以下存储库布局:
主分支(生产)集成工作
我想实现的是从工作分支中挑选一系列提交,并将其合并到集成分支中。我对git很陌生,我无法弄清楚如何在不破坏存储库的情况下准确地做到这一点(在一次操作中挑选提交范围,而不是合并)。对此有什么建议或想法吗?谢谢
当前回答
合并有时会很困难,只需创建一个补丁并手动应用更改即可。
创建从start_commit到end_commit的修补程序文件。git diff<start_commit><end_commit>>patch.diff签出分支并手动应用修补程序中的更改。
其他回答
从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)。
我将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在这种情况下很有用,因为我在同一个存储库中有两棵树,但没有共享的祖先。
是否确实不想合并分支?如果工作分支有一些您不需要的最近提交,您可以在您需要的位置创建一个带有HEAD的新分支。
现在,如果出于任何原因,你真的想要挑选一系列提交,那么一个很好的方法就是只需提取一个补丁集并将其应用于新的集成分支:
git format-patch A..B
git checkout integration
git am *.patch
这基本上就是git rebase所做的,但不需要玩游戏。如果需要合并,可以向git-am添加--3way。如果您逐字遵循说明,请确保执行此操作的目录中没有其他*.patch文件。。。
如果你只有两次提交,并且想挑选,你可以
git cherry-pick <commit> -n
然后将它们转换为新的提交。
-n不会自动创建提交,而只是阶段性地进行更改,因此您可以继续对提交中的文件进行cherry pick或更改。
合并有时会很困难,只需创建一个补丁并手动应用更改即可。
创建从start_commit到end_commit的修补程序文件。git diff<start_commit><end_commit>>patch.diff签出分支并手动应用修补程序中的更改。