一般,合併分支時,若是可能,Git 會用 Fast forward
模式,但這種模式下,刪除分支後,會丟掉分支信息。git
若是要強制 禁用 Fast forward
模式,Git 就會在 merge 時生成一個新的 commit,這樣,從分支歷史上就能夠看出分支信息。安全
下面咱們實戰一下 --no-ff
方式的 git merge
:bash
首先,仍然建立並切換 dev
分支:測試
$ git checkout -b dev Switched to a new branch 'dev'
修改 readme.txt 文件,並提交一個新的 commit:spa
$ git add readme.txt $ git commit -m "add merge" [dev 6224937] add merge 1 file changed, 1 insertion(+)
如今,咱們切換回 master
:3d
$ git checkout master Switched to branch 'master'
準備合併 dev
分支,請注意 --no-ff
參數,表示禁用 Fast forward
:code
$ git merge --no-ff -m "merge with no-ff" dev Merge made by the 'recursive' strategy. readme.txt | 1 + 1 file changed, 1 insertion(+)
由於本次合併要建立一個新的 commit,因此加上 -m
參數,把 commit 描述寫進去。blog
合併後,咱們用 git log
看看分支歷史:開發
$ git log --graph --pretty=oneline --abbrev-commit * 7825a50 merge with no-ff |\ | * 6224937 add merge |/ * 59bc1cb conflict fixed ...
能夠看到,不使用 Fast forward
模式,merge 後就像這樣:get
在實際開發中,咱們應該按照幾個基本原則進行分支管理:
master
分支應該是很是穩定的,也就是僅用來發布新版本,平時不能在上面幹活;dev
分支上,也就是說,dev
分支是不穩定的,到某個時候,好比 1.0 版本發佈時,再把 dev
分支合併到 master
上,在 master
分支發佈 1.0 版本;dev
分支上幹活,每一個人都有本身的分支,時不時地往 dev
分支上合併就能夠了。說白了就是 master 是正式版,dev 是測試版。測試版在測試後確認無誤才能和正式版合併,若是一開始就在正式版上開發或者修改,那若是改的過程恰好有人要使用正式版,那麼就沒辦法保證正式版的安全穩定了。
因此,團隊合做的分支看起來就像這樣:
Git 分支十分強大,在團隊開發中應該充分應用。
合併分支時,加上 --no-ff
參數就能夠用普通模式合併,合併後的歷史有分支,能看出來曾經作過合併,而 fast forward
合併就看不出來曾經作過合併。
答1:[廖雪峯] 合併也是在本地合併,把本地的 dev 合併到本地的 master,再把本地的 master 推到遠程 master。
答2:Z3 --> dev 時 先 pull origin dev
有衝突時,在本身本地更改。
Z3 提交到 --> dev
dev 下 merge z3
若是這時候
l4 --> dev
可是他並無先 pull,他提交上去的就會出現衝突
若是這個時候他也在 dev 下 merge 就會出現衝突。
這時候就須要在 dev 下解決衝突。
若是有衝突的狀況下 提交 master 請求時 就會告訴你,解決完衝突才能夠提交。
z3 master--> | l4 master--> | ----> 遠程 master w5 master--> |
各自解決各自的衝突,各個 master 之間的衝突 push 上去誰解決呢?
答1:[勤奮的光光2012] 根據個人理解,假設提交的前後順序爲 Z3 L4 W5, Z3 push 上去有衝突就 Z3 解決, l4 再拿到的就是 Z3 push 後的版本了,因此有衝突是 l4 解決, 依次類推。
延伸閱讀:
摘自: