[英]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
。 您要選擇提交D
和E
告訴rebase“上游”(名字不好)是devel
,並且您希望它通過執行git checkout feature3
來啟動整個操作:
$ git rebase -i devel feature3
在這里,變基會發現所有提交選定devel..feature3
(這是A
通過E
包容性,而不是兩個額外提交已經在任devel
),並且將選擇作為其--onto
目標, devel
。 然后,您進入編輯器,在其中可以刪除除最后兩個提交( D
和E
)以外的所有提交。 重新設定基准將:
devel
的尖端(分離的HEAD模式) D
,將其添加到未命名分支 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
節點。您仍然需要指定上游,您可以將其列為devel
或devel~2
:在這種情況下無關緊要。)
現在您可以git rebase -i devel feature2
。 這的工作方式相同:檢出分支feature2
,在devel..feature2
查找提交(這次是A
到C
),然后打開一個編輯器會話,讓您修改git將運行的cherry-pick
命令集。 這次您只需要刪除一行(對於提交A
)。 然后,Git在commit *
再次啟動一個新的HEAD匿名分離分支,並使用B
和C
挑選出它,然后移動feature2
分支:
D'-E' <-- feature3
/
...-o--o--* <-- devel
| \
\ B'-C' <-- feature2
|
A <-- feature1
\
B--C [abandoned]
最后,您可以為feature1
。 在這里,您無需打擾,因為提交A
是您要復制的唯一提交,並且將選擇唯一的git rebase
。
結果與git cherry-pick
。 您需要的git命令要少一些,但是對於交互式“選擇”序列需要更多的編輯。
哪種方法更好? 兩者都不是。 重命名舊分支然后刪除它們將刷新其reflog,這可能是一個功能,因為它使原始的A
到E
提交能夠更快地被垃圾回收,或者如果您想再次查看它們,則可能是一個缺點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.