1-N次Rebase
1-1-說明
1-1-1-rebase 多個 branch
嗨!現在我們有很多 branch 了啦!讓我們做一下 rebase,將這些分支接到 master branch 上吧。
但是你的主管找了點麻煩,他們希望得到有序的 commit history,也就是我們最終的結果是 C7' 在最下面, C6' 在它上面,以此類推。
假如你搞砸了,沒有關係啦!你用 reset 就可以重新開始!記得看看我們提供的答案,看你是否能夠使用更少的指令完成這一關!
1-2-解題
1-2-1-解法一
1 2 3 4 5 | git rebase -i master bugFix // C3 接進到 bugFix 分支 git rebase -i bugFix side // 由 bugFix 基點向 side 分支接上,取用 C4 C5 C6 git rebase -i side another // 由 side 基點向 another 分支接上,取用 C7 git checkout master git merge another |
1-2-2-官方解法
1 2 3 4 | git rebase -i master bugFix // C3 接進到 bugFix 分支 git rebase -i bugFix side // 由 bugFix 基點向 side 分支接上,取用 C4 C5 C6 git rebase -i side another // 由 side 基點向 another 分支接上,取用 C7 git rebase another master // master 與 another 同線,以 another 做為基點將所差的 commit 做取用接到 master 上,同步 master 分支 |
2-多個 parent commit
2-1-說明
2-1-選擇 parent commit
和 ~ 符號一樣, ^ 符號的後面也可以接一個(可選的)數字。
這不是用來指定往上回去幾代( ~ 的作用), ^ 後面所跟的數字表示我要選擇哪一個 parent commit。
還記得一個 merge commit 可以有多個 parent commit 吧,所以當我們要選擇走到哪一個 parent commit 的時候就會比較麻煩了。
git 預設會選擇 merge commit 的”第一個” parent commit,使用 ^ 後面接一個數字可以改變這個預設的行為。
廢話不多說,舉一個例子。
這裡有一個 merge commit。如果後面不加數字的話會直接切換到 master^,也就是說會回到第一個 parent commit。
(在我們的圖示中,第一個 parent commit 是指 merge commit 正上方的那一個 parent commit。)
1 | git checkout master^ |
HEAD 指向最新的 master 分支後在退一個 commit。
現在來試試選擇第二個 parent commit…
1 | git checkout master^2 |
看到了嗎?我們回到了第二個 parent commit。
使用 ^ 和 ~ 可以自由在 commit tree 中移動:
1 2 3 | git checkout HEAD~ git checkout HEAD^2 git checkout HEAD~2 |
– git checkout HEAD~ 退一個 commit,此時會到 C6。
– git checkout HEAD^2 選要退的 commit 父層分支線的一個 cimmt 點,依 commit HAS-1數值 的建立大小時間為主, C5 為 HEAD^2 , C2 為 HEAD^1 或是 HEAD^ 。
– git checkout HEAD~2 選到 commit 父層分支線,在依現在的 commit 編號在退二個 commit 。
簡直就像是電光石火!
再瘋狂點,這些符號可以被連在一起!試一下這個:
1 | git checkout HEAD~^2~2 |
和前面的結果一樣,但只用了一條指令。
2-2-解題
練習一下
要完成這一關,在指定的目標位置上面建立一個新的 branch。
很明顯可以直接使用 commit 的 hash 值(比如 C6),但我要求你使用剛剛講到的相對引用的符號!
1 | git branch bugWork master^^2^ |
– 指令的大意為開一支新的分支,依 master 分支為基準點退後, ^ 先退一個 commit 點到 C6, ^2 選較後開的分支 C5 在退一個 commit , ~ 在退一個 commit 就會到 C2 的 commit 開新分支 bugWork。
– 一開始的 HADE 就會在 master 的分支上,使用多個 parent commit 退 commit 點的方式,可以不用切換分支或是切換 HADE 來處理,只要算退的 commit 點與切換的父層分支號,就可以快速切換或是開分支。
3-branch 漿糊
3-1-說明
3-1-1Branch Spaghetti
哇塞大神!這關我們要來點不同的!
現在我們的 master branch 是比 one two 和 three 這三個 branch 多了幾個 commit。由於某種原因,我們需要將 master 所新增的幾個 commit 套用到其它三個 branch 上面。
one branch 需要重新排序和取消 C5 這一個 commit, two 需要完全重排,而 three 只需要再一個 commit。
我們會讓你知道如何解決這個問題,之後請記得用 show solution 看看我們的答案喔。
3-2-解題
3-2-1-解法一
1 2 3 4 5 | git checkout one git cherry-pick C4 C3 C2 git checkout two git cherry-pick C5 C4' C3' C2' git rebase C2 three |
3-2-2-官方解法
1 2 3 4 5 | git checkout one git cherry-pick C4 C3 C2 git checkout two git cherry-pick C5 C4' C3' C2' git branch -f three C2 |
指令 git branch -f three C2 指的是將分支 three 強制 C2 上建立, -f 就是 force 有強制的意思,用來指定分支前進到指定的 commit 編號上,但需要在同一線上。
12 git branch -f <branch name> <commit id>// 在指定的 patch 上建立 branch(若 branch 已經存在,就切過去)資料來源:
建立 / 刪除分支