分支 branch 在GIT的使用可是很重要卻又很複雜, 藉由學習一些教學影片後, 將其整理一番.
何時要開Branch?
- Topic feature開發新的功能
- 修正問題但又不想影響主線開發
- 重構程式(refactor)
- 任何實驗
分支範例
在master的C2(commit-2)下開branch, 命名為iss53, 並指向C2
在新的branch iss53作commit, iss53指到C3, 此時master和iss53指到不同的commit
再將branch指到master, 並開一個新的branch hotfix. 然後再切換到hotfix後, 再做commit, 所以hotfix會指到C4. 現存的3個branch都指到不同的commit.
合併範例
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.
如何將iss53合併到master?
假設目前的分支長這樣
將iss53合併到master, 會產一個新的節點 – C6, 這種合併又叫 Straight merge或merge commit (會有2個parent commits)
實作測試Merge Commit
接下來會實作一個merge commit的範例, 來驗證上述的理論.
#開一個branch - new_feature
git branch new_feature
#切換到new_feature branch
git checkout new_feature
#查看目前在哪一個branch
git branch
顯示目前在哪個branch – new_feature
#在new_feature branch中建立一個檔案
touch new_feature.txt
#add/commit到新的branch中
git add .
git commit –m “New feature”
#切回master
git checkout master
#修改README並add/commit
git add .
git commit -m "modify READM update for branch test"
#目前是在master中, 將new_feature合併回來
git merge new_feature
git commit -m "merge from new_feature"
上面顯示可以看到合併成功的結果.
備註: 在TortoiseGit的Log視窗中, 可以點選左上角選擇顯示不同的branch或一起顯示
合併時發生同一個檔案被修改並衝突怎麼辦?
現在模擬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"
修改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"
#目前是在master中, 將new_feature2合併回來
git merge new_feature2
git commit -m "merge from new_feature2"
結果會發生衝突
衝突的程式每一支都要手動去改
改好後留下最後要的程式碼, 手動去add/commit, 合併成功.
快速測試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, 看不到詳細內容
快速測試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的分支
master+new_feature5最後的結果 - 只合併p到master
刪除分支
git提供刪除分支的命令有2種參數可下:
強制刪除: git branch –D
未完成合併無法刪除: git branch –d
沒有留言:
張貼留言