[廖雪峯] Git 分支管理(3):分支管理策略

一般,合併分支時,若是可能,Git 會用 Fast forward 模式,但這種模式下,刪除分支後,會丟掉分支信息。git

若是要強制 禁用 Fast forward 模式,Git 就會在 merge 時生成一個新的 commit,這樣,從分支歷史上就能夠看出分支信息。安全

下面咱們實戰一下 --no-ff 方式的 git mergebash

首先,仍然建立並切換 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(+)

如今,咱們切換回 master3d

$ git checkout master
Switched to branch 'master'

準備合併 dev 分支,請注意 --no-ff 參數,表示禁用 Fast forwardcode

$ 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:實際開發流程是否是這樣子的呢?

  1. leader 在遠程倉庫建立 2 個分支:master 和 dev
  2. 張三和李四克隆遠程倉庫到本地
  3. 張三和李四都切換到 dev 分支
  4. 張三建立分支 z3,李四建立分支 l4
  5. 張三合併 z3 到 dev,李四合並 l4 到 dev
  6. 張三和李四 push dev 到遠程庫(此處會衝突嗎)
  7. leader 把遠程庫裏的 dev 合併到遠程庫的 master

答1:[廖雪峯] 合併也是在本地合併,把本地的 dev 合併到本地的 master,再把本地的 master 推到遠程 master。

答2:Z3 --> dev 時  先 pull origin dev

有衝突時,在本身本地更改。

Z3 提交到 --> dev

dev 下 merge z3

若是這時候

l4 --> dev

可是他並無先 pull,他提交上去的就會出現衝突 

若是這個時候他也在 dev 下 merge 就會出現衝突。

這時候就須要在 dev 下解決衝突。

若是有衝突的狀況下  提交 master 請求時 就會告訴你,解決完衝突才能夠提交。

留言2:遠程的 master 和 push 上去的 master 進行衝突解決? 

z3 master-->    |
l4 master-->     | ----> 遠程 master
w5 master-->   |

各自解決各自的衝突,各個 master 之間的衝突 push 上去誰解決呢?

答1:[勤奮的光光2012] 根據個人理解,假設提交的前後順序爲 Z3 L4 W5, Z3 push 上去有衝突就 Z3 解決, l4 再拿到的就是 Z3 push 後的版本了,因此有衝突是 l4 解決, 依次類推。

 

 

延伸閱讀:

[廖雪峯] 分支管理 - 多人協做

 

 

摘自:

http://www.liaoxuefeng.com/wiki/0013739516305929606

相關文章
相關標籤/搜索