簡體   English   中英

GIT:分支功能分支,而不是開發分支

[英]GIT: Branched off feature branch instead of development branch

因此,通常當我們有feature1,feature2和Feature3時,它們會脫離devel。 我不小心只是繼續分支而不是切換回devel,盡管如此,Feature2從Feature1分支出來,Feature3從Feature 2分支出來。

我怎樣才能解決這個問題?

編輯圖片:

I would like this:
---------------
  \
    A - B - C - D - E

to become this:
---------------
  \   \     \
   A   B-C   D-E

由於每個分支只有一兩次提交,因此使用cherry-pick就足夠了(無需為一兩次提交重新設置基准)。

首先備份您的本地存儲庫(不信任互聯網!)

寫下A,B,C,D和E的哈希。然后:

做就是了:

# Switch to devel
git checkout devel
# Rename branches into temporary branch names
git branch -m feature1 tmp1 && git branch -m feature2 tmp2
                            && git branch -m feature3 tmp3
# Create feature1 branch and cherry-pick the required commit
git checkout -b feature1 && git cherry-pick A
# Switch to devel
git checkout devel
# Create feature2 branch and cherry-pick the required commits
git checkout -b feature2 && git cherry-pick B C
# Switch to devel
git checkout devel
# Create feature3 branch and cherry-pick the required commits
git checkout -b feature3 && git cherry-pick D E
# Switch to devel
git checkout devel
# Delete temporary branches
git branch -D tmp1 tmp2 tmp3

為了完整--onto ,這是使用git rebase (帶有可選的--onto )移動這些提交的方法。 首先,讓我們更新“當前”圖形以添加一些特定的標簽和提交。 為了便於重新feature1並保持通用性,我將假設feature1連接在devel尖端的后面,並且您想將新分支移動到尖端(用*標記的提交)。

如果沒有多余的提交(因此*直接連接到A ,等等),那么所有這些仍然有效。

如果有額外的提交,但你要保持feature從尖端的背部,在--onto目的地應為devel~2在這個例子。

現在:

...-o--o--*         <-- devel
     \
      A             <-- feature1
       \
        B--C        <-- feature2
            \
             D--E   <-- feature3

第1步, feature3交互方式將feature3 devel 這樣做是使用一堆pick命令創建一個文本文件,每個命令都會執行git cherry-pick 您要選擇提交DE 告訴rebase“上游”(名字不好)是devel ,並且您希望它通過執行git checkout feature3來啟動整個操作:

$ git rebase -i devel feature3

在這里,變基會發現所有提交選定devel..feature3 (這是A通過E包容性,而不是兩個額外提交已經在任devel ),並且將選擇作為其--onto目標, devel 然后,您進入編輯器,在其中可以刪除除最后兩個提交( DE )以外的所有提交。 重新設定基准將:

  • 在新的未命名分支上移動到分支devel的尖端(分離的HEAD模式)
  • 櫻桃選擇提交D ,將其添加到未命名分支
  • cherry-pick commit E ,將其添加到未命名分支
  • 最后,使用相當於git reset的管道等效功能,使feature3指向最新提交。

現在樹看起來像這樣:

            D'-E'   <-- feature3
           /
...-o--o--*         <-- devel
     \
      A             <-- feature1
       \
        B--C        <-- feature2
            \
             D--E   [abandoned, except for reflogs]

(如果您添加--onto devel~2到原來的git rebase -i ,它會生長的D'-E'從提交鏈devel~2 ,這是最左邊o節點。您仍然需要指定上游,您可以將其列為develdevel~2 :在這種情況下無關緊要。)

現在您可以git rebase -i devel feature2 這的工作方式相同:檢出分支feature2 ,在devel..feature2查找提交(這次是AC ),然后打開一個編輯器會話,讓您修改git將運行的cherry-pick命令集。 這次您只需要刪除一行(對於提交A )。 然后,Git在commit *再次啟動一個新的HEAD匿名分離分支,並使用BC挑選出它,然后移動feature2分支:

            D'-E'   <-- feature3
           /
...-o--o--*         <-- devel
    |      \
     \      B'-C'   <-- feature2
      |
      A             <-- feature1
       \
        B--C        [abandoned]

最后,您可以為feature1 在這里,您無需打擾,因為提交A是您要復制的唯一提交,並且將選擇唯一的git rebase

結果與git cherry-pick 您需要的git命令要少一些,但是對於交互式“選擇”序列需要更多的編輯。

哪種方法更好? 兩者都不是。 重命名舊分支然后刪除它們將刷新其reflog,這可能是一個功能,因為它使原始的AE提交能夠更快地被垃圾回收,或者如果您想再次查看它們,則可能是一個缺點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM