介紹 建立、切換、合併分支(fast-forward、Merge And No Commit)、刪除
首先,可設定別名,以後可以不用打branch那麼多字
$ git config --global alias.br branch
$ git config --global alias.co checkout
建立分支
git co -b br1 => 建立一個新的分支br1,並直接切換過去
git br develop => 建立一個 名叫develop的分支
git br develop 分支代號 => 以分支代號為版本建立一個分支
git co develop => 切換到分支develop內
git br =>可看到目前有哪些分支
git br --merged => 顯示已經merge過的分支
git br --no-merged => 顯示還沒有merge過的分支
git br -r => r 表示remote ,只列出遠端追蹤分支,origin/master 遠端的origin跟本地的master有繫結
(透過git push -u origin master 設定的)
git br -a => 可以看到所有的分支(本地分支+遠端的)
git push -u origin br名稱 => 將分支也上傳到github設定遠端分支建立繫結。
刪除分支
目前我所在的分支是不能刪除的
$ git br -d br1 => 刪除分支br1,但是該分支如果有資料已經commit但是尚未merge回master ,
一次刪除所有的分支
//"(^\*|master|develop)" => 不想被刪除的分支名稱
//只能在git bash使用
git branch --merged | egrep -v "(^\*|master|develop)" | xargs git branch -d
這樣是刪不掉的,要改用 git br -D br1 大寫的D來強制刪除
刪除之後的分支可以重建回來,
例如:
下圖1 是刪除分支br之後,後會會有一個編號b5cb85c
若刪除之後想重新把分支建立回來,只要在建立分支的時候,後面加上剛剛的編號:b5cb85c ,就可以把分支建立回來
刪除的編號可透過 git reflog 來查詢(保留30天),也可以用小烏龜來查詢
合併分支 - 基礎
假設要將分支br1修改後的狀態合併回master,先切換到master
git merge 分支名稱 => 將分支合併回master
git merge --no-ff --no-commit develop(分支名稱) => Merge回master 應該常用這個指令。
fast-forward(快轉)
Merge 裡面有一個fast-forward(快轉)的機制,
當我分支修改的檔案內容就是未來要主幹呈現的內容,就會啟動fast-forward的機制,
主幹會快轉到跟分支一樣的版本,在樹狀圖上看不到分支的圖示
看樹狀圖,原本develop跟master 是一樣的
但是在merge的時候啟動fast-forward的機制
所以樹狀圖就不會出現分支切出去的圖示,圖1不會如同圖2般的呈現分支
先使用 git reset --hard ORIG_HEAD 將master 退版回去merge之前的狀態
(或者是git reset --hard 指定版號 => 可退回指定的版號,但是中間的紀錄都會消失。)
在使用指令 git merge develop --no-ff 強制關掉ff 的方式來Merge,就會出現分支
如果要Merge的分支跟主幹是不同分支的概念,建議關閉fast-forward(快轉)的機制
=> 在本地端改需求的時候,將需求合併回主幹,確保樹狀圖會有分支的出現
如果要Merge的分支跟主幹是相同分支的概念,建議使用fast-forward(快轉)的機制
=>本地端的master跟遠端git hub 的master的同步的時候,雖然是不同分支,但是本質上應該是相同的主幹
Merge And no commit
兩個分支合併成功之後,不代表程式碼是好的,Merge之後應該要進行測試,先不要commit。
如果merge之後有問題,還可以修改,最後在add -> commit
git merge --no-ff --no-commit develop(分支名稱)
狀態會變成合併進行中,這時候分支的資料已經合併回master,資料還是能修改,未commit
修改測試完確定沒有問題之後,在使用git commit 完成Merge的全部動作。
如要取消,可使用: git merge --abort 來取消merge。
squash merge
git merge --squash develop
壓縮merge ,使用squash 的時候,樹狀圖不會出現分支出去,master 會自動跳到下一個版本,
分支內不管幾個commit ,都會被壓縮成一個,然後master 直接跳到下一個版本
建議使用情境:開分支出去修改之後,覺得分支好像不是那麼重要,可能只是簡單的測試或是很小的修改,想直接讓master跳到下一個版本,不想要出現分支
squash 不能跟no ff 一起使用 ,因為squash本身就不會出現分支的樹狀圖,所以無法強制關閉ff
如果想要有no ff的效果,讓master 跟分支不一樣,也就是說,master做一些小修正,分支不是master未來的樣子,
兩者必須強制做merge
使用squash來merge之後,效果會跟 no commit merge一樣,檔案會先合併,但是還不會commit
因為他壓縮所有的分支commit ,會需要你再整理註解,整理完之後再重新commit
commit 之後,可以看到分支裡面commit了兩次,但是壓縮之後,master跳一個版本而且分支沒有真的回master
如果把分支刪除之後會變成這樣,分支的樹狀圖跟著不見了,master跳了一個版本,
除了看LOG之外看不出來有建立過分支。
合併分支出現衝突
分支出現衝突的條件=>修改到相同檔案的相同行數
舉例來說,現在有兩個分支,master 、develop,我同時在兩個分支內的檔案:MergeConflict.txt內 都修改第一行,來模擬Merge 失敗的情境
-- Master ,修改完檔案之後將這次的修改commit
-- 分支develop , 一樣修改之後 commit
接著切回master ,將develop merge 回master
會顯示錯誤訊息 CONFLICT (衝突)
解決方法有兩種,一種是放棄merger (如下圖第二點) => git merge --abort
一種是將檔案手動修改完畢之後,透過指令 git add 檔案名稱 來告訴git 衝突以解決
來手動修改檔案之後再繼續merge ,打開衝突的檔案,會看到
1.目前的版本會在上面
2.兩個會用7個 = 分開來
3.要merge回來的版本在下面
如下圖:
1.修改檔案完檔案之後
2.使用git add filename將檔案加回來
3.查看狀態,衝突已經修復,但是尚未merge,可以使用git commit 來結束merge
4.使用git commit來完成merge
5.目前狀態=>nothing to commit , working tree clean