Android Studio 與 Git (part 2)
走錯路了不能回頭,Git 卻能回到分岔的時候
上一篇介紹了 Android Studio 中版本管理工具 Git 的功能,而在最後留下了一個問題,就是版本管理還有分支、合併的功能。這又是什麼?傑夫老師就舉個例子來說明
上一篇中的專案做了三個功能,並且都已提交到 Git 中。但是現在狀況來了,功能2要重做,要由 TextView 改為 Button。可是現在已經疊加了功能3的程式,如果能時光倒流回到功能2剛開發完的時候,那個時間點還沒有功能3,程式會單純很多,修改功能2就會容易些了吧?那這樣要怎麼做呢?請多拉A夢拿出時光機嗎?
Step 1: 回到從前、建立分支
首先,先點在記錄"功能 3"上,並看到右下方提交記錄,此時看到兩個標籤:一個綠色的 master 表示這是主幹上最後一筆提交;一個黃色的 HEAD 表示現在電腦中檔案與"功能 3"的檔案是一致的。
剛剛說了,希望時光能倒流到功能2剛完成的時候,這很簡單只要在"功能 2"上按右鍵,再選擇 Checkout Revision ooxxooxx。 (ooxxooxx是這筆提交記錄的編號)
完成Checkout之後,會發現黃標籤 HEAD 移到了"功能 2",而上面 activity_main.xml 中沒有了功能3的程式了,表示時光倒流電腦中的檔案回到了功能2開發完的時候了。
繼續在"功能 2"上按右鍵,點選 New Branch,
在彈出的是窗中填入分支名稱 "Feature2_Redo"
成功後就在"功能 2"上看到多了一個標籤 Feature2_Redo,也在左下方看到多了一個分支 Feature2_Redo。
Step 2: 在分支上開發
前面的步驟,不但讓程式回到"功能 2"上,也讓之後的提交會進到分支 Feature2_Redo 之中。那就來把功能2重做吧,沒有功能3的狀況下顯得好改多了,輕輕鬆鬆就能把 textView2 改成 Button,下圖中紅線部分就是程式最主要修改的地方。
點左方 Commit,再點(double click) activity_main.xml 就看到修改的部分。
接著一樣的步驟開始提交。
這時候就會發現提交記錄多了一個分岔出來,最新的一筆紀錄"功能 2 重做"的線是接在"功能 2"上,而 Feature2_Redo 與 HEAD 標籤移到了"功能 2 重做"上。
Step 3: 併回到主幹
功能2重做好了,可以把程式合併回到主幹上了,保守的合併步驟分成兩步:
先把分岔點之後的"功能3"加到 Feature2_Redo 分支中,並修改互相關連的部分
Feature2_Redo中測試沒問題了,再把分支 merge (合併) 到主幹中
第一步,在 master 上點右鍵並選擇 Rebase 'Feature2_Redo' to 'master'。Rebase 是更改分岔點的意思,這會將分岔點移到主幹最新的提交上,那也就相當於把功能3的功能加到 Feature2_Redo 分支當中了。
Rebase 的過程中如果沒有 conflict (衝突,就是大家都改同一個地方,這樣 Git 不知道要用誰的程式,就需要人來檢查),那就會看到下面這樣的結果。
首先,看到提交記錄又變成一條線了。沒錯,現在的 Feature2_Redo 分支變成從"功能 3"分岔出來的,所以看起來只有一條線。但是注意到,標籤 Feature2_Redo 與 HEAD 是在"功能 2 重做"上,而標籤 master 還是停留在"功能 3"上面。
再來會看到程式出現了紅字,因為 textView3 的 layout_constraintTop_toBottomOf 5 之前設為了 textView2,但 textView2 已經消失了,換成了 Button。也就是說,現在的程式是有錯誤的,"Feature 3" 掉到了螢幕的最下方。
所以,改成 Button 就好了。
所以,改成 Button 就好了。然後要為這次的修改再做一次提交,提交信息填 "Rebase後修改"。
提交成功後就又多看到一筆提交 "Rebase後修改" 的紀錄,而標籤 Feature2_Redo 與 HEAD 移到了 "Rebase後修改" 上。此時,最新的程式還在 Feature2_Redo 上。
第二步, 就是要把分支中的程式全部 merge (合併) 到主幹來。
先在右下方 master 上按右鍵並點選 Checkout,把現在電腦中的檔案先轉回主幹的舊程式。
注意,標籤 HEAD 移到了 "功能 3" 而且 textView2 又回來了。
最後,在左下方 Feature2_Redo 上按右鍵,並點選 Merge 'Feature2_Redo' into 'master'。
基本上不會再有問題,記錄顏色有了變化,三個標籤都移到了 "Rebase後修改" 上。左下方還會出現成功的提示,並詢問是否要刪除 Feature2_Redo 這個分支。
如果新的功能2沒問題,就可以刪除 Feature2_Redo 這個分支。點擊 Delete,右下方出現分支 Feature2_Redo 以被刪除,標籤就只剩下兩個了。
Q & A
問題一:一定要搞的這麼麻煩嗎?
不需要,但如果狀況是功能2重做與功能4, 5開發同時要進行,在沒有版本管理的情形下,是不是要開兩個專案?而當兩邊功能都做好的時候,合併就會是另一個大問題了吧~
問題二:步驟能再簡單一點嗎?
如果分支的修改可以很獨立與其他功能關連不大,可以省掉 Rebase 那一步,但這樣如果 Merge 後出了很多錯誤,那主幹上的程式也就都亂掉了。
還有,前面說明的步驟中還省略了發生衝突的情況,有機會傑夫老師再找例子說明吧~Bye now~