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數值 的建立大小時間為主, C5HEAD^2C2HEAD^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 twothree 這三個 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