2015年2月4日 星期三

Git Merge

Git的合併方式分成四種

  • Straight merge 
  • Squashed commit 
  • cherry-pick 
  • rebase

git merge 的指令

git merge <branch_name> :
合併另一個 branch,若沒有 conflict 衝突會直接 commit。若需要解決衝突則會再多一個 commit。
git merge --squash <branch_name>
將另一個 branch 的 commit 合併為一筆,特別適合需要做實驗的 fixes bug 或 new feature,最後只留結果。合併完不會幫你先 commit。
git cherry-pick <commit-id> 
只合併特定其中一個 commit。如果要合併多個,可以加上 -n 指令就不會先幫你 commit,這樣可以多 pick幾個要合併的 commit,最後再 git commit 即可。








Fast-forward 

fast-forward 在 Git 是一種 merge 術語,當 B branch (例如一個 local branch) 是從 A branch (例如一個 remote branch) 的最新版(HEAD)分支出來的,那當 A 要把 B merge 進來時,因為 B 的 parent commit 是 A 的 HEAD,所以這兩個 branch 唯一的差異就是 B 後來的 commit 而已,而不會有任何 conflict。所以實際上的動作只要把 A 的 HEAD 改成 B 的 HEAD 就好了,線圖上這兩個 branch 根本是同一條線,此謂 fast-forward



master和 origin/master就是fast-forward.


20151126補充
master(原本的)和 hotfix(多一個commit)就是fastforward , 所以只需要執行
$ git checkout master $ git merge hotfix

 



Conflict 

當user1 , user2 同時clone一份 (test1),然後各自修改後push上去
user2 搶先push , 所以成功 . 之後 user 1 再push 就會出現錯誤 . server要求先pull.
但是此時user1執行pull , 也會失敗 , 警告為 Automatic merge failed.
此時就要用 fetch
$ git fetch #但是我看到的是 衝突檔案被修改, git 直接幫我標出 conflict的地方.(我以為會變成另外一個branch?) 
手動修改衝突的檔案後 , commit/push上去之後變成
    


這時候原本先push上去的user2 會發現變成這樣.

這時候只要 $git pull origin master 即可



附註 =======================

又再做一次實驗 ,user2先push上去
user1 這次用 
$ git fetch origin



可以看到 , 多了一個分支 origin/master , 衝突檔案也沒有被直接修改. 
這時候 , 先切換到 /origin/master ,(指令 : $ git checkout origin/master)
然後把我們的master合併過來(指令 $ git merge master)
直接在master branch合併 (指令 $ git merge origin/master)

可以看到合併 , 但是會有conflict , 手動修改檔案後再push上去.


這時候回去看user2的--------------------------------

local/master 已經落後origin/master , 但是不在同一個branch


只要直接pull下來就好




ref: https://ihower.tw/blog/archives/2620  

沒有留言:

張貼留言