搜尋

首頁  >  問答  >  主體

Git如何拉取某一分支的某段提交

現在有兩個分支,分別為分支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方法,是對的,而且我也會;但是有沒有更好的答案呢?

大家讲道理大家讲道理2813 天前996

全部回覆(5)我來回復

  • 迷茫

    迷茫2017-05-02 09:34:03

    在分支A上,執行

    git cherry-pick <commit_id>

    回覆
    0
  • 黄舟

    黄舟2017-05-02 09:34:03

    如果不要求自動化的話,最方便的辦法是這樣的:

    $ git rebase -i HEAD $name_of_branch_b

    編輯器裡會顯示b1到b5的五行,刪除b1和b5的兩行,記憶體退出。

    回覆
    0
  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-02 09:34:03

    可能很難有更好的回答了吧?依照git-flow的原则,dev-feature一般不会有只合并中间几次提交到dev分之的情況,可能題主的這個需求就是建立在不合理的版本管理策略很特殊的場景

    回覆
    0
  • 怪我咯

    怪我咯2017-05-02 09:34:03

    應該只有 chrry pick

    回覆
    0
  • 淡淡烟草味

    淡淡烟草味2017-05-02 09:34:03

    大家都說的對,沒有什麼好辦法;但我實際工作過程中還是有這個特殊需求的。
    今天晚上我用我蹩腳的shell程式設計能力寫了一段程式可以實現我的需求,還是透過cherry-pick實現。

    該小程序,只要如下這樣執行就可以完成我的需求:

    # b5省略时取到最新的节点
    cherry-picks B b2 b5

    接下來是我的處女秀:github連結

    #!/usr/bin/env bash
    
    # 初始化
    targetBranch=
    start=
    end= #如果没有这读到最新
    currentBranch=$(git symbolic-ref HEAD 2>/dev/null | cut -d"/" -f 3)
    
    # 切换到目标分支
    git checkout $targetBranch
    
    echo 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=1
    fi
    
    # 取得需要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 $currentBranch
    
    for i in "$list"; do
        git cherry-pick $i
    done
    
    echo '完成'
    exit 0

    回覆
    0
  • 取消回覆