分支在實際生產環境中的作用:比如你準備開發一個新功能,但是需要很長的時間才能完成,第一天編寫了一些代碼,如果講代碼立即上傳,由于代碼還沒寫完,不完整的代碼庫會導致別人不能工作。但是如果等代碼全部寫完再提交,又存在丟失每天進度的巨大風險。
現在有了分支,這樣的擔心就完全沒有必要了。創建一個屬于自己的分支,別人看不到,還繼續在原來的分支上進行工作,而你在自己的分支上工作,想提交隨時可以提交,直到開發完畢后,再一次性地合并到原本的分支上,這樣,既安全,又不影響別人工作。
幾乎每一種版本控制系統都以某種形式支持分支。使用分支意味著你可以從開發主線上分離開來,然后在不影響主線的同時繼續工作。在很多版本控制系統中,這是個昂貴的過程,常常需要創建一個源代碼目錄的完整副本,對大型項目來說會花費很長時間。
有人把git的分支模型稱為“必殺技特性”,而正是因為它,將git從版本控制系統家族里區分出來。git有何特別之處呢?git的分支可謂是難以置信的輕量級,它的新建操作幾乎可以在瞬間完成,并且在不同分支間切換起來也差不多一樣快。和許多其他版本控制系統不同,git鼓勵在工作流程中頻繁使用分支與合并,哪怕一天之內進行許多次都沒有關系。
理解分支的概念并熟練運用后,你才會意識到為什么 Git 是一個如此強大而獨特的工具,并從此真正改變你的開發方式。
關于git的詳細介紹,建議還是移步到git官方文檔進行系統化的學習!
[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功能,可以把當前工作區“儲藏”起來,等以后恢復現場后繼續工作。
[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分支下,這時再次刷新就會出現以下頁面,如圖:
——————————本次博文到此結束,感謝閱讀————————————
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。