分支在實際生產環境中的做用:好比你準備開發一個新功能,可是須要很長的時間才能完成,第一天編寫了一些代碼,若是講代碼當即上傳,因爲代碼還沒寫完,不完整的代碼庫會致使別人不能工做。可是若是等代碼所有寫完再提交,又存在丟失天天進度的巨大風險。git
如今有了分支,這樣的擔憂就徹底沒有必要了。建立一個屬於本身的分支,別人看不到,還繼續在原來的分支上進行工做,而你在本身的分支上工做,想提交隨時能夠提交,直到開發完畢後,再一次性地合併到本來的分支上,這樣,既安全,又不影響別人工做。github
幾乎每一種版本控制系統都以某種形式支持分支。使用分支意味着你能夠從開發主線上分離開來,而後在不影響主線的同時繼續工做。在不少版本控制系統中,這是個昂貴的過程,經常須要建立一個源代碼目錄的完整副本,對大型項目來講會花費很長時間。vim
有人把git的分支模型稱爲「必殺技特性」,而正是由於它,將git從版本控制系統家族裏區分出來。git有何特別之處呢?git的分支可謂是難以置信的輕量級,它的新建操做幾乎能夠在瞬間完成,而且在不一樣分支間切換起來也差很少同樣快。和許多其餘版本控制系統不一樣,git鼓勵在工做流程中頻繁使用分支與合併,哪怕一天以內進行許屢次都沒有關係。安全
理解分支的概念並熟練運用後,你纔會意識到爲何 Git 是一個如此強大而獨特的工具,並今後真正改變你的開發方式。app
關於git的詳細介紹,建議仍是移步到git官方文檔進行系統化的學習!ide
[root@git ~]# yum -y install git [root@git ~]# git --version git version 1.8.3.1 [root@localhost ~]# mkdir /git && cd /git [root@git git]# git init 初始化空的 Git 版本庫於 /git/.git/ [root@git git]# git config --global user.name admin [root@git git]# git config --global user.email admin@admin.com
[root@localhost git]# echo -e "第一行" > README.txt [root@localhost git]# git add README.txt [root@git git]# git commit -m "第一次提交來自master分支" [root@localhost git]# git checkout -b dev #建立一個新的分支,名稱爲dev,而且切換到dev分支下 ###############如下操做在dev分支下操做################## [root@localhost git]# git branch #查看當前的分支狀況 * dev #分支前的「*」號就表示當前在該分支下 master [root@git git]# echo -e "# 第二行" >> README.txt [root@git git]# git add README.txt [root@git git]# git commit -m "第一次提交來自dev分支" [root@git git]# cat README.txt #在dev分支下查看文件內容 # 第一行 # 第二行 [root@git git]# git checkout master #切換到master分支 ##############如下操做在master分支操做################# [root@git git]# git branch #保證分支切換成功 dev * master [root@git git]# cat README.txt #在master分支下查看文件內容 # 第一行 [root@git git]# git merge dev #將dev分支與當前(master)分支合併,採起的是快速合併的方式 [root@git git]# cat README.txt #再次查看文件內容 # 第一行 # 第二行 [root@git git]# git log --graph --pretty=oneline --abbrev-commit #查看提交的日誌信息,使其在一行顯示 * da7e6c8 第一次提交來自dev分支 * 78c0b14 第一次提交來自master分支 #能夠看到提交日誌前面的「*「號在同列,這就是採用快速合併的方式的特色(默認) #時間長了,就沒法分辨出,具體是在那個分支進行的提交 #稍後寫下關閉快速合併的方法,兩者進行比對! [root@git git]# git branch -d dev #刪除dev分支(前提是不在dev分支下)
在咱們實際工做中會遇到一個分支衝突的問題,就是當你在工做分支dev下對文件內容進行了修改,而後在你提交到版本庫前,master分支下的內容已經發生了改變,此時,你dev分支下的內容是比master下的內容要舊,這種狀況下進行分支合併,會有一個分支衝突的概念,例子以下:工具
[root@git git]# mkdir /lzj && cd /lzj #從新建立目錄用於測試 [root@git lzj]# git init #初始化目錄 [root@git lzj]# echo "aaaa" > readme.txt [root@git lzj]# git add readme.txt [root@git lzj]# git commit -m "commit from master" #將測試文件上傳到版本庫中 [root@git lzj]# git branch #確認當前分支 * master [root@git lzj]# cat readme.txt #確認文件內容 aaaa [root@git lzj]# git checkout -b dev #建立dev分支並切換到dev分支 [root@git lzj]# echo "bbbb" >> readme.txt [root@git lzj]# git add readme.txt [root@git lzj]# git commit -m "commit form dev" #將dev分支的內容提交到版本庫 [root@git lzj]# cat readme.txt #查看文件內容 aaaa bbbb [root@git lzj]# git checkout master #切換到master分支 [root@git lzj]# cat readme.txt #查看文件內容(仍是本來的內容) aaaa [root@git lzj]# echo "cccc" >> readme.txt [root@git lzj]# git add readme.txt [root@git lzj]# git commit -m "alter commit from master" #再次插入內容並提交 [root@git lzj]# cat readme.txt #確認文件內容 aaaa cccc [root@git lzj]# git merge dev #將dev分支與master分支進行合併 #返回如下內容,說明合併時發生衝突 自動合併 readme.txt 衝突(內容):合併衝突於 readme.txt 自動合併失敗,修正衝忽然後提交修正的結果。 #接下來就是解決合併時發生的衝突 #出現上述報錯信息,表示dev分支下的內容存在master分支的文件,只是dev分支的文件沒有與master分支下的文件進行合併,再次提交提交便可 #實際環境中,並不建議直接提交,由於文件內容可能有特殊的地方 [root@git lzj]# vim readme.txt #此時文件內容以下 aaaa <<<<<<< HEAD cccc ======= bbbb >>>>>>> dev [root@git lzj]# cat readme.txt #講特殊符號進行刪除後再次提交 aaaa cccc bbbb [root@git lzj]# git add readme.txt [root@git lzj]# git commit -m "衝突已解決" #再次提交 [root@git lzj]# git log --graph --pretty=oneline --abbrev-commit #查看分支合併狀況 * 9549c57 衝突已解決 |\ | * 336e03c commit from dev * | 26e7e0d alter commit from master |/ * e766eaf commit from master
在上面說到,在查看git版本的提交歷史時,其分支結構表現的不是那麼直觀,那是由於默認開啓了快速合併的選項,這裏寫下如何關閉快速合併。學習
[root@git lzj]# git checkout dev #切換到dev分支下 [root@git lzj]# echo "dddd" >> readme.txt [root@git lzj]# git add readme.txt [root@git lzj]# git commit -m "關閉快速合併" #插入數據並提交 [root@git lzj]# git checkout master #切換master分支 [root@git lzj]# git merge --no-ff -m "分支合併說明" dev #」--no-ff「選項就是關閉快速合併,需自行添加提交的說明信息 [root@git lzj]# git log --graph --pretty=oneline --abbrev-commit #查看提交的日誌信息,並以一行顯示 * 2255433 分支合併說明 |\ | * 5c3d07a 關閉快速合併 * | 9549c57 衝突已解決 #從這裏往上,能夠看出是通過一個分支才提交的 |\ \ | |/ | * 336e03c commit from dev * | 26e7e0d alter commit from master |/ * e766eaf commit from master [root@git lzj]# git branch -d dev #刪除dev分支
開發人員在開發過程當中,bug就像屢見不鮮同樣,有了bug就要修復,在git中,因爲分支是強大的,因此均可以經過一個新的臨時分支來修復bug,修復後,分支合併,而後將臨時分支刪除。測試
當咱們接到一個修改bug的任務後,很天然的想要建立一個分支來修復它,可是當前正在進行的工做進行到一半,還沒法提交,但又須要立刻修復bug,此時,能夠經過git提供的stash功能,能夠把當前工做區「儲藏」起來,等之後恢復現場後繼續工做。3d
[root@git lzj]# cat readme.txt aaaa cccc bbbb dddd [root@git lzj]# echo "eeee" >> readme.txt [root@git lzj]# git status #查看狀態能夠看出有修改但未提交 # 位於分支 master # 還沒有暫存以備提交的變動: # (使用 "git add <file>..." 更新要提交的內容) # (使用 "git checkout -- <file>..." 丟棄工做區的改動) # # 修改: readme.txt # 修改還沒有加入提交(使用 "git add" 和/或 "git commit -a")
[root@git lzj]# git stash #使用此命令講當前工做區隱藏 [root@git lzj]# git status #再次查看當前工做區,就是乾淨的狀態了 # 位於分支 master 無文件要提交,乾淨的工做區 [root@git lzj]# cat readme.txt #再次查看文件內容,也沒有剛纔添加的內容 aaaa cccc bbbb dddd
[root@git lzj]# git checkout -b dev #建立dev分支並切換到dev分支 [root@git lzj]# echo "ffff" >> readme.txt [root@git lzj]# git add readme.txt [root@git lzj]# git commit -m "alter from dev" [root@git lzj]# git checkout master #切換到master分支 [root@git lzj]# git merge dev #將dev分支進行快速合併 #有兩種恢復方法: #一是使用 git stash apply 恢復,可是恢復後,stash 內容並不刪除,須要用 git stash drop 來刪除; #另外一種方式是用 git stash pop,恢復的同時把 stash 內容也刪了;這裏我採用第二種方法 [root@git lzj]# git stash pop #回覆存儲區的內容 [root@git lzj]# cat readme.txt aaaa cccc bbbb dddd <<<<<<< Updated upstream ffff ======= eeee >>>>>>> Stashed changes #查看文件內容發現出現了分支衝突 [root@git lzj]# cat readme.txt aaaa cccc bbbb dddd ffff eeee #將文件中的亂碼進行刪除 [root@git lzj]# git add readme.txt [root@git lzj]# git commit -m "解決分支衝突" #從新提交
將本地的版本庫與github進行關聯,因爲關於簡單,省略此步驟!
[root@git ~]# git clone git@github.com:lvzhenjiang-hub/test.git #將github上的數據拉取到本地 [root@git ~]# git remote add origin git@github.com:lvzhenjiang-hub/test.git [root@git ~]# git remote #查看遠程關聯的遠程主機,使用」-v「選項查看詳細信息 origin [root@git ~]# git checkout -b dev #建立並進入dev分支 [root@git ~]# echo "aaa" > 123.txt [root@git ~]# git add 123.txt [root@git ~]# git commit -m "aaa" [root@git ~]# git push origin dev #將本地的dev分支與遠程的dev進行關聯,若是遠程沒有dev分支,則會新建
如圖:
[root@git ~]# git branch -r -d origin/dev #將遠程的dev分支進行刪除 [root@git ~]# git push origin :dev #將刪除的遠程分支提交到遠程版本庫中
若是github在dev分支下,這時再次刷新就會出現如下頁面,如圖:
——————————本次博文到此結束,感謝閱讀————————————