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-forwardmaster和 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 , 衝突檔案也沒有被直接修改.
直接在master branch合併 (指令 $ git merge origin/master)
可以看到合併 , 但是會有conflict , 手動修改檔案後再push上去.
這時候回去看user2的--------------------------------
local/master 已經落後origin/master , 但是不在同一個branch只要直接pull下來就好
ref: https://ihower.tw/blog/archives/2620








沒有留言:
張貼留言