2015年9月30日 星期三

Git使用學習系列 - 開分支

分支 branch 在GIT的使用可是很重要卻又很複雜, 藉由學習一些教學影片後, 將其整理一番.

何時要開Branch?

  • Topic feature開發新的功能
  • 修正問題但又不想影響主線開發
  • 重構程式(refactor)
  • 任何實驗

 

分支範例

在master的C2(commit-2)下開branch, 命名為iss53, 並指向C2

image

在新的branch iss53作commit, iss53指到C3, 此時master和iss53指到不同的commit

image

再將branch指到master, 並開一個新的branch hotfix. 然後再切換到hotfix後, 再做commit, 所以hotfix會指到C4. 現存的3個branch都指到不同的commit.

image

合併範例

4種合併方式

  • fast-forward : 加上—on-ff參數, 就會產生與Straight merge方式一樣會有合併線.
  • Straight merge或merge-commit: 會有2個Parents線.
  • Squashed merge: 壓縮合併. git merge new_feature –squash , 壓縮成只有一個merge-commit, 不會有被合併的log, SVN的merge即是如此. 缺點是線圖會看不出來.
  • Cherry-pick: git cherry-pick 714cba , 只合併指定的commit, -x參數會在log裡加注本來是哪個SHA1(適合在backpointing情境)

如何將hotfix合併到master?

對這樣的合併, master不需要做merge的動作, 只要將參考指到C4就可以了, 並沒有真的要合併 - 又稱為 fast-forward.

image

如何將iss53合併到master?

假設目前的分支長這樣

image

將iss53合併到master, 會產一個新的節點 – C6, 這種合併又叫 Straight mergemerge commit (會有2個parent commits)

image

實作測試Merge Commit

接下來會實作一個merge commit的範例, 來驗證上述的理論.

#開一個branch - new_feature
git branch new_feature

#切換到new_feature branch
git checkout new_feature

#查看目前在哪一個branch
git branch

顯示目前在哪個branch – new_feature


image

#在new_feature branch中建立一個檔案
touch new_feature.txt

#add/commit到新的branch中
git add .
git commit –m “New feature”

image

#切回master
git checkout master

#修改README並add/commit
git add .
git commit -m "modify READM update for branch test"

image

#目前是在master中, 將new_feature合併回來
git merge new_feature
git commit -m "merge from new_feature"

image


上面顯示可以看到合併成功的結果.


備註: 在TortoiseGit的Log視窗中, 可以點選左上角選擇顯示不同的branch或一起顯示


image


合併時發生同一個檔案被修改並衝突怎麼辦?


現在模擬2個branch都修改同一個檔案, 在合併時發生衝突時的解決方式.


Story: master有一個README檔, 然後新建一個new_feature2的branch, 切換到new_feature2 branch後, 去修改README並commit到repo, 最後合併new_feature2到master.


修改new_feature2的README內容: 62: modify for test branch - this is modify in new_branch2

#開一個branch - new_feature2
git branch new_feature2

#切換到new_feature2 branch
git checkout new_feature2

#在new_feature2 branch中修改README檔案
#add/commit到new_feature2 branch中
git add .
git commit -m "Modify README in new_feature2"

image


修改master的README內容:60: modify for test branch - modify by new_feature2, master change 62 to 60

#切回master
git checkout master

#修改README並add/commit
git add .
git commit -m "modify READM update for branch merge conflict test in master"

image

#目前是在master中, 將new_feature2合併回來
git merge new_feature2
git commit -m "merge from new_feature2"

結果會發生衝突


image


衝突的程式每一支都要手動去改


image


改好後留下最後要的程式碼, 手動去add/commit, 合併成功.


image


快速測試Squash Merge


command如下

git branch new_feature3
git checkout new_feature3
git branch
touch x
touch y
git add .
git commit -m "Add x and y files for new_feature3"
git checkout master
git branch
git merge new_feature3 --squash
git commit

結果如下 -被壓縮成一個commit, 看不到詳細內容


image


快速測試Cherry-Pick


cherry-pick可以只合併branch的某一個交付點, 而跳過其他的交付點.


Story: 建立一個new_feature5的branch, 建立p, 作add/commit. 再建立q, 作add/commit. 切回master, 合併new_feature中的p交付點.

#以下這行可直接建立new_feature5 branch並切換過去
git checkout -b new_feature5
touch p
git add .
git commit -m "Add p"
touch q
git add .
git commit -m "Add q"
git checkout master
git cherry-pick 71320daa1f2bcd3b19bb2700c7a3763ab01f7343

new_feature5的分支


image


master+new_feature5最後的結果 - 只合併p到master


image


刪除分支


git提供刪除分支的命令有2種參數可下:


強制刪除: git branch –D


未完成合併無法刪除: git branch –d

沒有留言:

張貼留言