1-N次Rebase

1-1-說明

1-1-1-rebase 多個 branch

嗨!現在我們有很多 branch 了啦!讓我們做一下 rebase,將這些分支接到 master branch 上吧。
但是你的主管找了點麻煩,他們希望得到有序的 commit history,也就是我們最終的結果是 C7' 在最下面, C6' 在它上面,以此類推。
假如你搞砸了,沒有關係啦!你用 reset 就可以重新開始!記得看看我們提供的答案,看你是否能夠使用更少的指令完成這一關!

1-2-解題

Git 練習遊戲_learngitbranching-5-進階主題-1-N次Rebase-1

1-2-1-解法一

1-2-2-官方解法

Git 練習遊戲_learngitbranching-5-進階主題-1-N次Rebase-2


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。)
Git 練習遊戲_learngitbranching-5-進階主題-2-多個 parent commit-1

Git 練習遊戲_learngitbranching-5-進階主題-2-多個 parent commit-2

HEAD 指向最新的 master 分支後在退一個 commit。

現在來試試選擇第二個 parent commit…
Git 練習遊戲_learngitbranching-5-進階主題-2-多個 parent commit-3

看到了嗎?我們回到了第二個 parent commit。
Git 練習遊戲_learngitbranching-5-進階主題-2-多個 parent commit-4

使用 ^ 和 ~ 可以自由在 commit tree 中移動:
Git 練習遊戲_learngitbranching-5-進階主題-2-多個 parent commit-5

– 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 。

簡直就像是電光石火!
Git 練習遊戲_learngitbranching-5-進階主題-2-多個 parent commit-6

再瘋狂點,這些符號可以被連在一起!試一下這個:
Git 練習遊戲_learngitbranching-5-進階主題-2-多個 parent commit-7

和前面的結果一樣,但只用了一條指令。
Git 練習遊戲_learngitbranching-5-進階主題-2-多個 parent commit-8

2-2-解題

練習一下
要完成這一關,在指定的目標位置上面建立一個新的 branch。
很明顯可以直接使用 commit 的 hash 值(比如 C6),但我要求你使用剛剛講到的相對引用的符號!
Git 練習遊戲_learngitbranching-5-進階主題-2-多個 parent commit-9

– 指令的大意為開一支新的分支,依 master 分支為基準點退後, ^ 先退一個 commit 點到 C6, ^2 選較後開的分支 C5 在退一個 commit , ~ 在退一個 commit 就會到 C2 的 commit 開新分支 bugWork。
– 一開始的 HADE 就會在 master 的分支上,使用多個 parent commit 退 commit 點的方式,可以不用切換分支或是切換 HADE 來處理,只要算退的 commit 點與切換的父層分支號,就可以快速切換或是開分支。

Git 練習遊戲_learngitbranching-5-進階主題-2-多個 parent commit-10


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-解題

Git 練習遊戲_learngitbranching-5-進階主題-3-branch 漿糊-1

3-2-1-解法一

3-2-2-官方解法

指令 git branch -f three C2 指的是將分支 three 強制 C2 上建立, -f 就是 force 有強制的意思,用來指定分支前進到指定的 commit 編號上,但需要在同一線上。

資料來源:
建立 / 刪除分支

Git 練習遊戲_learngitbranching-5-進階主題-3-branch 漿糊-2