默認狀況下合併分支經常直接使用 git merge
命令,是最方便快速的合併方法.其實這種狀況下 git
採用的是 fast forward
模式,特色是刪除分支後,會丟失分支信息,好像歷來沒存在該分支同樣,而咱們推薦的是recursive
模式,可以保留分支的版本記錄.html
recursive
)建立並切換 dev
分支,提交版本後切換回 master
分支,而後再合併 dev
分支,這不過這一次再也不使用 git merge dev
命令:git
# 建立並切換 dev 分支 $ git checkout -b dev Switched to a new branch 'dev' # 提交版本 $ echo "git checkout -b dev" >> test.txt $ git add test.txt $ git commit -m "git checkout -b dev" [dev 44d68f6] git checkout -b dev 1 file changed, 1 insertion(+) # 切換回 master 分支 $ git checkout master Switched to branch 'master' Your branch is ahead of 'origin/master' by 6 commits. (use "git push" to publish your local commits) $
如今添加 --no-ff
參數禁用 fast forward
模式,即git merge --no-ff
:github
$ git merge --no-ff -m "git merge --no-ff dev" dev Merge made by the 'recursive' strategy. test.txt | 1 + 1 file changed, 1 insertion(+) $
上述內容顯示,此次使用的再也不是 fast forward
模式,而是 recursive
模式,那讓咱們看一下提交歷史有什麼不一樣吧!分佈式
$ git log --pretty=oneline --graph * 22fbef7 (HEAD -> master) git merge --no-ff dev |\ | * 44d68f6(dev) git checkout -b dev |/ * 3b8f434 fix conflict |\ | * 0fe95f8 git commit c2 * | 0949cc3 git commit c3 |/ * 5c482cd git commit c1 * 413a4d1 see https://snowdreams1006.github.io/git/usage/branch-overview.html * 9c30e51 learn git branch * b3d8193 (origin/master, origin/HEAD) see https://snowdreams1006.github.io/git/usage/remote-repository.html * 8e62564 add test.txt * 9b196aa Initial commit $
這種遞歸模式(recursive
) 有一個明顯的特色就是會產生一個新的 commit
,並不會像以前快速前進模式(fast forward
)那樣單純更改 HEAD
的指向.3d
秉承着閱後即焚的習慣,分支一旦合併後就當即刪除,如今刪除 dev
分支,看一下會發生什麼:版本控制
# 刪除 dev 分支 $ git branch -d dev Deleted branch dev (was 44d68f6). # 查看提交歷史 $ git log --pretty=oneline --graph * 22fbef7 (HEAD -> master) git merge --no-ff dev |\ | * 44d68f6 git checkout -b dev |/ * 3b8f434 fix conflict |\ | * 0fe95f8 git commit c2 * | 0949cc3 git commit c3 |/ * 5c482cd git commit c1 * 413a4d1 see https://snowdreams1006.github.io/git/usage/branch-overview.html * 9c30e50 learn git branch * b3d8193 (origin/master, origin/HEAD) see https://snowdreams1006.github.io/git/usage/remote-repository.html * 8e62564 add test.txt * 9b196aa Initial commit $
因而可知,刪除 dev
分支後僅僅少了 dev
的引用而已,原來 dev
分支所作的更改所有保留下來了!code
fast forward
)建立並切換 dev
分支,提交版本後切換回 master
分支,而後再合併 dev
分支,使用 git merge dev
命令:htm
# 建立並切換 dev 分支 $ git checkout -b dev Switched to a new branch 'dev' # 提交版本 $ echo "fast forward" >> test.txt $ git add test.txt $ git commit -m "fast forward" [dev 3fe94c0] fast forward 1 file changed, 1 insertion(+) $
如今切換回 master
分支,採用默認的git merge
命令合併 dev
分支:blog
$ git checkout master Switched to branch 'master' Your branch is ahead of 'origin/master' by 8 commits. (use "git push" to publish your local commits) sunpodeMacBook-Pro:git-demo sunpo$ git merge dev Updating 22fbef7..3fe94c0 Fast-forward test.txt | 1 + 1 file changed, 1 insertion(+) $
上述內容顯示此次合併採用的是快速前進模式(fast forward
),讓咱們看一下提交歷史:遞歸
$ git log --pretty=oneline --graph * 3fe94c0 (HEAD -> master, dev) fast forward * 22fbef7 git merge --no-ff dev |\ | * 44d68f6 git checkout -b dev |/ * 3b8f434 fix conflict |\ | * 0fe95f8 git commit c2 * | 0949cc3 git commit c3 |/ * 5c482cd git commit c1 * 413a4d1 see https://snowdreams1006.github.io/git/usage/branch-overview.html * 9c30e50 learn git branch * b3d8193 (origin/master, origin/HEAD) see https://snowdreams1006.github.io/git/usage/remote-repository.html * 8e62564 add test.txt * 9b196aa Initial commit $
上述內容代表,這次合併並無產生新的 commit
,只是更改下 HEAD
指向而已(HEAD -> master, dev
).
一樣,如今刪除 dev
分支,再看一下提交歷史:
# 刪除 dev 分支 $ git branch -d dev Deleted branch dev (was 3fe94c0). # 查看提交歷史 $ git log --pretty=oneline --graph * 3fe94c0 (HEAD -> master) fast forward * 22fbef7 git merge --no-ff dev |\ | * 44d68f6 git checkout -b dev |/ * 3b8f434 fix conflict |\ | * 0fe95f8 git commit c2 * | 0949cc3 git commit c3 |/ * 5c482cd git commit c1 * 413a4d1 see https://snowdreams1006.github.io/git/usage/branch-overview.html * 9c30e50 learn git branch * b3d8193 (origin/master, origin/HEAD) see https://snowdreams1006.github.io/git/usage/remote-repository.html * 8e62564 add test.txt * 9b196aa Initial commit $
因而可知,快速前進模式一旦刪除分支後就完全丟失了分支的信息,即使是從提交歷史中也找不到曾經存在的痕跡!
git
是分佈式版本控制系統,同時鼓勵大量使用分支,如此一來大量的分支該如何管理?
實際開發中,建議準從如下原則進行分支管理:
master
分支做爲主幹分支,負責對外提供服務,要求穩定可靠,由於應該專人負責更新維護.dev
分支做爲開發分支,取代 master
分支的開發地位,積累到必定產出時再合併到 master
分支.feature
分支做爲新功能分支,根據實際狀況動態建立,刪除分支,並適時合併到 dev
分支.bugFixed
分支做爲修復特定 bug 分支,可能由 master
分支衍生而來,也可能由 dev
分支衍生等等,修復後及時合併到原分支.custom
自定義分支,項目成員私有分支,由上級領導分配任務後各開發人員自行選擇建立本身的分支,並根據實際狀況決定合併到 dev
分支或 feature
等分支.git merge <name>
)不保留分支合併歷史,遞歸模式(git merge --no-ff -m <remark> <name>
)保留分支合併歷史.