Git分支管理

前言

分支在實際生產環境中的作用:比如你準備開發一個新功能,但是需要很長的時間才能完成,第一天編寫了一些代碼,如果講代碼立即上傳,由於代碼還沒寫完,不完整的代碼庫會導致別人不能工作。但是如果等代碼全部寫完再提交,又存在丟失每天進度的巨大風險。

現在有了分支,這樣的擔心就完全沒有必要了。創建一個屬於自己的分支,別人看不到,還繼續在原來的分支上進行工作,而你在自己的分支上工作,想提交隨時可以提交,直到開發完畢後,再一次性地合併到原本的分支上,這樣,既安全,又不影響別人工作。

幾乎每一種版本控制系統都以某種形式支持分支。使用分支意味着你可以從開發主線上分離開來,然後在不影響主線的同時繼續工作。在很多版本控制系統中,這是個昂貴的過程,常常需要創建一個源代碼目錄的完整副本,對大型項目來說會花費很長時間。

有人把git的分支模型稱爲“必殺技特性”,而正是因爲它,將git從版本控制系統家族裏區分出來。git有何特別之處呢?git的分支可謂是難以置信的輕量級,它的新建操作幾乎可以在瞬間完成,並且在不同分支間切換起來也差不多一樣快。和許多其他版本控制系統不同,git鼓勵在工作流程中頻繁使用分支與合併,哪怕一天之內進行許多次都沒有關係。

理解分支的概念並熟練運用後,你纔會意識到爲什麼 Git 是一個如此強大而獨特的工具,並從此真正改變你的開發方式。

關於git的詳細介紹,建議還是移步到git官方文檔進行系統化的學習!

1)安裝並初始化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 [email protected]

2)創建、快速合併及刪除分支

[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分支下)

3)解決分支衝突問題

在我們實際工作中會遇到一個分支衝突的問題,就是當你在工作分支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

4)關閉快速合併

在上面說到,在查看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分支

5)Bug分支

開發人員在開發過程中,bug就像家常便飯一樣,有了bug就要修復,在git中,由於分支是強大的,所以都可以通過一個新的臨時分支來修復bug,修復後,分支合併,然後將臨時分支刪除。

當我們接到一個修改bug的任務後,很自然的想要創建一個分支來修復它,但是當前正在進行的工作進行到一半,還無法提交,但又需要馬上修復bug,此時,可以通過git提供的stash功能,可以把當前工作區“儲藏”起來,等以後恢復現場後繼續工作。

1)工作進行到一半時工作區的狀態如下:

[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")

2)將此時的工作區隱藏起來

[root@git lzj]# git stash                     #使用此命令講當前工作區隱藏
[root@git lzj]# git status                    #再次查看當前工作區,就是乾淨的狀態了
# 位於分支 master
無文件要提交,乾淨的工作區
[root@git lzj]# cat readme.txt                  #再次查看文件內容,也沒有剛纔添加的內容
aaaa
cccc
bbbb
dddd

3)假設在dev分支上修復bug

[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 "解決分支衝突"            #重新提交

6)遠程分支管理

將本地的版本庫與github進行關聯,由於關於簡單,省略此步驟!

[root@git ~]# git clone [email protected]:lvzhenjiang-hub/test.git
#將github上的數據拉取到本地
[root@git ~]# git remote add origin [email protected]: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分支,則會新建

如圖:
Git分支管理
Git分支管理

[root@git ~]# git branch -r -d origin/dev          #將遠程的dev分支進行刪除
[root@git ~]# git push origin :dev              #將刪除的遠程分支提交到遠程版本庫中

如果github在dev分支下,這時再次刷新就會出現以下頁面,如圖:
Git分支管理

——————————本次博文到此結束,感謝閱讀————————————

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章