分支是版本管理系統裡面乙個重要的概念, 使得版本管理變得更加靈活. 專案分支可以用來建立臨時的**分支, 當我們編輯測試好之後再推送到主分支上, 使得專案開發變得更可控. 每個開發者可以通過建立自己的分支來方便整體專案的管理和專案成員之間的交流. 而git相比於svn這種集中式版本管理系統, 能夠迅速地進行分支的建立, 切換和刪除, 所以對於專案開發來說很方便高效.
git進行版本控制的時候, 把每次提交作為時間線的乙個節點, 每條分支都是一條時間線, 每個專案都至少有一條時間線, 對應著專案的主分支(master
分支), 如果建立了別的分支, 就會產生新的時間線,head
指標, 嚴格來說, 指向的是分支, 而分支指向的則是提交, head指向的便是當前的分支.
當我們建立新的分支的時候, 比如dev
分支, git會建立乙個新的指標dev
指向此時master
時間線末端, 此時的head
指標也會轉而指向dev
分支, 然而工作的檔案都沒有任何變化, 此後的工作的修改和提交就會變成在dev
分支上的提交, 提交時,master
指標不會移動, 而dev
指標則會向前移動. 當你在dev
分支工作完成, 就可以把dev
分支的更改合併到master
分支了.
分支的合併, 最簡單的方式就是把master
指標指向dev
的最新提交, 合併完分支之後就可以刪除dev
分支了, 刪除』dev指標即可, 此時的
head 指標重新會指向master
.
下面介紹一些關於分支的一些命令
-檢視分支
git branch
命令會羅列出當前工作區內所有的分支, 當前分支會用*
在分支名前標示.
-建立和切換分支
git branch
命令會建立乙個名字為name
的分支, 而使用git checkout
則可以把當前分支切換為分支.而
git checkout -b
命令則可以快速地建立乙個名字為的分支並且預設切換過去.
此時要注意, git提交的是修改, 所以在分支內進行修改後, 也要和主分支一樣, 先把修改提交到暫存區, 再進行提交.
-合併分支
git merge
命令可以實現分支的合併, 把分支的更改合併到當前分支上.此時預設使用的快速合併選項(fast-forward).
然而當本地端的提交和遠端端的提交存在衝突時, 快速合併選項就不能處理這種情況了, git會提示你衝突, 並提示你衝突的型別, 此時我們就需要根據提示先解決存在的衝突, 再進行操作. 在衝突解決後, git會自動繼續之前的合併操作.
git合併分支是, 缺省會使用fast forward方式, 但是這種模式下, 刪除分之後, 會丟失分支的資訊. 如果強制禁用fast forward模式, git就會在合併的時候生成乙個新的提交(在合併的時候加上--no-ff -m
, 所以此時要在新增-m
引數和提交的描述), 這樣從分支歷史上就可以看出分支的資訊.
-刪除分支
git branch -d
命令可以用來刪除分支, 要注意刪除操作不能刪除當前所在的分支. 在進行刪除的時候, 引數-d
會先確認分支是否已經完全合併再進行刪除, 而-d
則不會檢查是否已經合併直接進行刪除.
通常在實際的開發中, 我們通常使用master
分支來管理較為穩定的專案內容, 用dev
分支來進行所有的不穩定的開發工作, 開發完成之後就把dev
分支合併懂啊master
分支上, 同時同乙個專案的不同開發人員通常都有自己的分支, 再在需要的時候把自己的開發內容合併到dev
分支.此外由於程式都避免不了bug的問題, 所以我們還可以建立bug分支來進行bug修復, 在修復bug的時候, 為了不破壞原有的開發流程與順序, 我們可以利用git的stash
功能,
$ git stash
利用git進行多人協作, 我們可以根據分支的不同進行本地庫與遠端庫之間的同步過程. 像master
分支, 屬於專案的主分支, 所以要時時與雲端的版本進行同步, 同理,dev
分支作為master
分支的候選版本的誕生分支, 開發人員要經常進行同步進行交流. 而通常bug分支再修復之後就被刪除了, 就沒有很大必要推送到雲端.
我們可以使用
git push origin to_push_branch
來進行向雲端的推送(origin是遠端倉庫的預設名稱).
通常從遠端庫進行clone的時候, 本地只能看到專案的master分支, 如果想要在dev分支上進行開發, 就必須手動在本地建立dev分支並和遠端的dev分支連線起來.
$ git checkout -b dev origin/dev
此時就可以通過git push
向雲端的dev分支推送更改了.
如果多個開發者對同乙個檔案進行了修改, 那麼第乙個開發者推送後, 雲端的dev分支就已經發生了變化, 此時第二個開發者進行dev分支更改的推送時便會發生衝突, 此時, 我們需要把最新的雲端的dev分支抓取下來
$ git branch --set-upstream dev origin/dev
$ git pull
然後在本地進行合併(可以參看上一節), 解決衝突之後進行推送.
因此,多人協作的工作模式通常是這樣:
首先,可以試圖用git push origin branch-name
推送自己的修改;
如果推送失敗,則因為遠端分支比你的本地更新,需要先用git pull
試圖合併;如果git pull
提示「no tracking information」,則說明本地分支和遠端分支的鏈結關係沒有建立,用命令git branch --set-upstream branch-name origin/branch-name
。如果合併有衝突,則解決衝突,並在本地提交;沒有衝突或者解決掉衝突後,再用git push origin branch-name
推送就能成功!
參考文獻:
1. 廖雪峰的git教程
2. 阮一峰的網路日誌
3. 網路
Git學習筆記4 分支
參考鏈結廖雪峰git教程 建立本地分支 git branch testing 建立乙個分支,並命名為testing 建立遠端分支 分兩步 git branch testing 建立乙個分支,並命名為testing git push origin testing 將分支推送到遠端 相當於建立乙個遠端分...
Git10 分支管理
分支就是科幻電影裡面的平行宇宙,當你正在電腦前努力學習 git的時候,另乙個你正在另乙個平行宇宙裡努力學習 svn。如果兩個平行宇宙互不干擾,那對現在的你也沒啥影響。不過,在某個時間點,兩個平行宇宙合併了,結果,你既學會了 git又學會了 svn!分支在實際中有什麼用呢?假設你準備開發乙個新功能,但...
Git筆記 2 分支管理
svn有分支管理,但是建立和切換分支耗時特別長,形同虛設。建立於合併分支 檢視分支 git branch 建立分支 git branch 切換分支 git checkout 建立 切換分支 git checkout b 合併某分支到當前分支 git merge 刪除分支 git branch d 強...