问题描述
现在有两个分支,分别为分支A、分支B。每个分支上都有若干次提交;分支A的提交commits有 a1, a2, a3, a4, a5,一共有五次提交;分支B的提交commits有 b1, b2, b3, b4, b5,一共有五次提交;当前位于分支A。
注:以上10次提交的hash值不一样。
请问:怎么只拉取分支B的 b2, b3, b4 提交节点到 分支A?
要求,在拉取到分支A后,必须保留原来分支B上的提交信息。
求破 ╮( ̄▽  ̄)╭ ~
@junnplus 说的cherry-pick方法,是对的,而且我也会;但是有没有更好的回答呢?
问题解答
回答1:在分支A上,执行
git cherry-pick <commit_id>回答2:
如果不要求自动化的话,最方便的办法是这样的:
$ git rebase -i HEAD $name_of_branch_b
编辑器里会显示b1到b5的五行,删掉b1和b5的两行,存盘退出。
回答3:可能很难有更好的回答了吧?按照git-flow的原则,dev-feature一般不会有只合并中间几次提交到dev分之的情况,可能题主的这个需要就是建立在不合理的版本管理策略或很特殊的场景。
回答4:应该只有 chrry pick
回答5:大家都说的对,没有什么好办法;但我实际工作过程中还是有这个特殊需求的。今天晚上我用我蹩脚的shell编程能力写了一段程序可以实现我的需求,还是通过cherry-pick实现。
该小程序,只要如下这么执行就可以完成我的需求:
# b5省略时取到最新的节点cherry-picks B b2 b5
接下来是我的处女秀:github链接
#!/usr/bin/env bash# 初始化targetBranch=$1start=$2end=$3 #如果没有这读到最新currentBranch=$(git symbolic-ref HEAD 2>/dev/null | cut -d'/' -f 3)# 切换到目标分支git checkout $targetBranchecho start proccess commit message...rawList=$(git log | grep ’^commit’ | sed ’1,$s/commit//’)startIndex=$(echo '$rawList' | sed -n '/$start/=' )# 如果end不为空,取得结束的偏移量,否则默认为1,也就是最新if [ -n '$end' ]; then endIndex=$(echo '$rawList' | sed -n '/$end/=')else endIndex=1fi# 取得需要cherry-pick的区间list=$(echo '$rawList' | head -$startIndex | tail +$endIndex)## 倒序list=$(echo '$list' |sed ’1!G;h;$!d’)echo ’待cherry-pick的有:’echo list:echo '$list'echo# 切换回当前分支git checkout $currentBranchfor i in '$list'; do git cherry-pick $idoneecho ’完成’exit 0