GIT 分支的基本操作

  • 4047
  • 0
  • 2018-07-04

介紹 建立、切換、合併分支(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