Git的分支管理

0.引言

本文參考最後的幾篇文章,將git的分支管理整理以下。學習git的分支管理將能夠版本進行靈活有效的控制。html

1.如何創建與合併分支

1.1分支的新建與合併指令

新建分支 newBranch,並進入新分支:git

$ git checkout -b newBranch 

至關於:bash

$ git branch newBranch
$ git checkout newBranch

合併分支 mergeBranch,例如要把mergeBranch,合併入master:服務器

$ git checkout master
$ git merge mergeBranch

合併後,master和mergeBranch都指向同一個版本,能夠刪除掉mergeBranch了:併發

$ git branch -d mergeBranch

1.2 分支建立與合併的實例

Task:

  1. 開發某項目。
  2. 爲實現某個新的需求,建立一個分支iss53。
  3. 在這個分支上開展工做。

   假設臨時有個很嚴重的其餘問題須要緊急修補,按照下面的方式處理:post

  1. 返回master分支。
  2. 爲此次緊急修補創建一個新分支hotfix,並在其中修復問題。
  3. 經過測試後,回到服務器所在的master分支,將修補分支合併進來,而後再推送到服務器上。
  4. 刪除hotfix
  5. 切換到以前實現新需求的分支iss53,繼續工做。

   工做完成之後,將分支iss53合併入master學習

  若是iss53與hotfix工做沒有衝突,則合併成功,若是有衝突則須要再進行處理判斷後,再合併。測試

Do:

一、假設當前,master更新爲C2版本:spa

   

二、爲實現某功能建立iss53分支,建立index.html,並上傳3d

這個時候,狀態是這樣的:

三、緊急任務來了,要先返回master分支

四、如今接到進行緊急修改的要求,而後建立hotfix

五、進行了相應的開發,包括修改index.html(注意,在iss53中也進行了修改)

而後git push origin hotfix。

Git 會把工做目錄的內容恢復爲檢出某分支時它所指向的那個提交對象的快照。它會自動添加、刪除和修改文件以確保目錄的內容和你當時提交時徹底同樣。

因而當前的狀態是:

六、當分支hotfix的內容測試經過確認後,就能夠合併到master中,並刪除hotfix

若是順着一個分支走下去能夠到達另外一個分支的話,那麼 Git 在合併二者時,只會簡單地把指針右移,由於這種單線的歷史分支不存在任何須要解決的分歧,因此這種合併過程能夠稱爲快進(Fast forward)。

如今最新的修改已經合併到master分支了。能夠發佈啦。

接下來刪除hotfix

七、如今咱們回到iss35繼續工做

咱們繼續推動iss35:

八、如今接下來要合併master和iss53

合併後,刪除iss53分支,便可。

請注意,此次合併操做的底層實現,並不一樣於以前 hotfix 的併入方式。由於此次你的開發歷史是從更早的地方開始分叉的。因爲當前 master 分支所指向的提交對象(C4)並非 iss53 分支的直接祖先,Git 不得不進行一些額外處理。就此例而言,Git 會用兩個分支的末端(C4 和 C5)以及它們的共同祖先(C2)進行一次簡單的三方合併計算。

此次,Git 沒有簡單地把分支指針右移,而是對三方合併後的結果從新作一個新的快照,並自動建立一個指向它的提交對象(C6)(見圖 3-17)。這個提交對象比較特殊,它有兩個祖先(C4 和 C5)。

值得一提的是 Git 能夠本身裁決哪一個共同祖先纔是最佳合併基礎;這和 CVS 或 Subversion(1.5 之後的版本)不一樣,它們須要開發者手工指定合併基礎。因此此特性讓 Git 的合併操做比其餘系統都要簡單很多。

九、可是若是在不一樣的分支中都修改了同一個文件的同一部分,Git 就沒法乾淨地把二者合到一塊兒(譯註:邏輯上說,這種問題只能由人來裁決。)。若是你在解決問題 #53 的過程當中修改了 hotfix 中修改的部分,則會出現:

咱們先看一下狀態:

接下來咱們能夠打開 index.html

git 已經自動對其作了區分,HEAD表示master分支的內容,=====下面的是iss53分支作的修改

你能夠對其再作調整和修改。

再用git add index.html,git commit表示他們已經解決衝突。

而後再融合和刪除iss53分支。完成工做。

也可使用mergetool:

2. Git分支在實際項目中的靈活運用

這是Git版本控制的分支管理整體圖:

 

 其中最重要的是主分支

  • master:用來版本發佈,主要反映當前線上運行的代碼。
  • develop:做爲開發分支,用來存放最新開發的代碼,有時候會叫它「集成分支」。

develop分支用來存放開發完成的代碼,當develop分支上的代碼測試沒有問題後,merge到master分支上,併發布。

輔助分支

  • feature branches

feature分支也能夠叫作主題分支。例如在新版中要開發的新功能,能夠用feature來存放。名字能夠另外取,例如要增長insert和search功能,能夠增長insertFeature和searcheFeature的分支,開發好後,再分別merge到develop分支中。

從 develop 分支建一個 feature 分支,並切換到 feature 分支 
$ git checkout -b myfeature develop
Switched to a new branch "myfeature"

  

 

合併feature 分支到 develop
$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff myfeature
Updating ea1b82a..05e9557
(Summary of changes)
$ git branch -d myfeature
Deleted branch myfeature (was 05e9557).
$ git push origin develop

  其中--no-ff 的參數,ff表示fastforward,--no--ff,就表示會對歷史的分支作一個新的提交對象。加參數和不加參數的區別以下:(可使用 sourceTree 或者命令git log --graph查看)

 

  • release branches

這個分支能夠是來自develop;必須合併到develop和master。release分支能夠理解爲更多的是做爲版本控制、缺陷鏡像修復和最後發佈前的複查工做。

建立一個realase分支

$ git checkout -b release-1.2 develop
Switched to a new branch "release-1.2"
$ ./bump-version.sh 1.2
Files modified successfully, version bumped to 1.2.
$ git commit -a -m "Bumped version number to 1.2"
[release-1.2 74d9424] Bumped version number to 1.2
1 files changed, 1 insertions(+), 1 deletions(-)

  這裏的bump-version.sh ,只是一個虛擬的腳本,是要求讀者本身去編寫這樣的腳本,實現相應的地方都統一更改版本號。

完成release分支:

$ git checkout master
Switched to branch 'master'
$ git merge --no-ff release-1.2
Merge made by recursive.
(Summary of changes)
$ git tag -a 1.2

  融合到develop分支

$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff release-1.2
Merge made by recursive.
(Summary of changes)

  刪除release分支

$ git branch -d release-1.2
Deleted branch release-1.2 (was ff452fe).

  

  • hotfix branches

這個是一個須要緊急修復bug的分支。當線上產品有bug,咱們能夠開一個hotfix分支,修復完bug後,再merge,刪除。

它來自master,融合向develop和master。

關係以下:

具體代碼以下:

建立hotfix分支:

$ git checkout -b hotfix-1.2.1 master
Switched to a new branch "hotfix-1.2.1"
$ ./bump-version.sh 1.2.1
Files modified successfully, version bumped to 1.2.1.
$ git commit -a -m "Bumped version number to 1.2.1"
[hotfix-1.2.1 41e61bb] Bumped version number to 1.2.1
1 files changed, 1 insertions(+), 1 deletions(-)

  

$ git commit -m "Fixed severe production problem"
[hotfix-1.2.1 abbe5d6] Fixed severe production problem
5 files changed, 32 insertions(+), 17 deletions(-)

  完成了hotfix分支:

$ git checkout master
Switched to branch 'master'
$ git merge --no-ff hotfix-1.2.1
Merge made by recursive.
(Summary of changes)
$ git tag -a 1.2.1

  合併到develop分支

$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff hotfix-1.2.1
Merge made by recursive.
(Summary of changes)

  最後刪除hotfix分支

$ git branch -d hotfix-1.2.1
Deleted branch hotfix-1.2.1 (was abbe5d6).

  

參考:

【1】 http://nvie.com/posts/a-successful-git-branching-model/

【2】http://blog.jobbole.com/109466/

【3】https://git-scm.com/book/zh/v1/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E6%96%B0%E5%BB%BA%E4%B8%8E%E5%90%88%E5%B9%B6

相關文章
相關標籤/搜索