Git分支管理——建立、合併、刪除分支

幾乎全部的版本控制都以某種形式支持分支。使用分支意味着你能夠把你的工做從開發主線上分離開來,以避免影響開發主線。git

Git的分支模型成稱爲它的「必殺技特性」,也正由於這一特性,使得Git從衆多版本控制系統中脫穎而出。Git處理分支的方式是難以置信的輕量,建立新的分支這一操做是秒級完成的,而且在不一樣分支之間的切換操做也是同樣便捷。vim

Git的分支,其實本質上僅僅是指向提交對象的可變指針。Git的默認分支是master。在屢次提交操做以後,其實咱們已經有一個指向最後那個提交對象的master分支。他會在每次的提交操做中自動向前移動。app

實際工做中咱們可能會遇到一個下面這個狀況:ide

  • 開發某個網站。
  • 爲實現某個新的需求,建立一個分支。
  • 在這個分支上開展工做。
  • 正在此時,你忽然接到一個電話說有個很嚴重的問題須要緊急修補。 你將按照以下方式來處理:
  • 切換到你的線上分支(production branch)。
  • 爲這個緊急任務新建一個分支,並在其中修復它。
  • 在測試經過以後,切換回線上分支,而後合併這個修補分支,最後將改動推送到線上分支。
  • 修改後切換回你最初工做的分支上,繼續工做。

一、初始化一個目錄並聲明用戶及郵箱地址測試

[root@git /]# mkdir /git 
[root@git /]# cd git/
[root@git git]# git init 
Initialized empty Git repository in /git/.git/
[root@git git]# ls -a 
.  ..  .git
[root@git git]# git config --global user.name admin
[root@git git]# git config --global user.email admin@admin.com

二、建立、快速合併及刪除分支網站

[root@git git]# echo "aaaa" > branch.txt
[root@git git]# git add branch.txt
[root@git git]# git commit -m "第一次提交From master"
[master (root-commit) b9f1465] 第一次提交From master
 1 file changed, 1 insertion(+)
 create mode 100644 branch.txt
 #建立一個分支並進入新建的分支
[root@git git]# git checkout -b dev
Switched to a new branch 'dev'
[root@git git]# git branch                #查看當前所在分支
* dev                              # 星號所在的列就是當前所在分支
  master
#在dev分支更新文件並提交
[root@git git]# echo "bbbb" >> branch.txt 
[root@git git]# git add *
[root@git git]# git commit -m "commit From dev branch"
[dev e9989ba] commit From dev branch
 1 file changed, 1 insertion(+)
[root@git git]# cat branch.txt               # 確認當前內容
aaaa
bbbb
[root@git git]# git checkout master             # 切換到主分支
Switched to branch 'master'
[root@git git]# cat branch.txt               # 查看內容
aaaa
[root@git git]# git merge dev                    # 合併dev分支
Updating b9f1465..e9989ba
Fast-forward
 branch.txt | 1 +
 1 file changed, 1 insertion(+)
[root@git git]# cat branch.txt                 # 再次查看內容
aaaa
bbbb
[root@git git]# git log --graph --pretty=oneline --abbrev-commit            #查看提交日誌
* e9989ba commit From dev branch
* b9f1465 第一次提交From master                    

#能夠查看到其提交日誌前面的星號是在同列的,這是由於採用的是快速合併的方法(默認)
#稍後會寫下關閉快速合併,而後能夠對比該命令查看的結果
[root@git git]# git branch -d dev               # 刪除dev分支
Deleted branch dev (was e9989ba).

三、解決分支衝突問題ui

在咱們實際工做中會遇到一個分支衝突的問題,就是當你在工做分支dev下對文件內容進行了修改,而後在你提交到版本庫前,master分支下的內容已經發生了改變,此時,你dev分支下的內容是比master下的內容要舊,這種狀況下進行分支合併,會有一個分支衝突的概念,例子以下:
[root@git git]# cat branch.txt             # 查看當前內容
aaaa
bbbb
[root@git git]# git checkout -b dev         # 建立一個分支並切換至本身的工做分支
Switched to a new branch 'dev'
[root@git git]# echo "cccc" >> branch.txt            # 寫入新數據
[root@git git]# git add branch.txt              
[root@git git]# git commit -m "alter from dev"        
[dev 051082c] alter from dev
 1 file changed, 1 insertion(+)
[root@git git]# cat branch.txt              # 查看當前內容
aaaa
bbbb
cccc
[root@git git]# git checkout master                 # 切換至主分支
Switched to branch 'master'
[root@git git]# cat branch.txt                # 查看內容仍是以前的
aaaa
bbbb
#修改master下的文件內容並提交
[root@git git]# echo "dddd" >> branch.txt              # 寫入新數據
[root@git git]# git add branch.txt         
[root@git git]# git commit -m "alter from master"
[master 1303111] alter from master
 1 file changed, 1 insertion(+)
[root@git git]# cat branch.txt                 # 肯定當前內容 
aaaa
bbbb
dddd
#接下來將dev分支進行合併:
[root@git git]# git merge dev 
Auto-merging branch.txt
CONFLICT (content): Merge conflict in branch.txt            # 合併衝突於 branch.txt
Automatic merge failed; fix conflicts and then commit the result.
#解決合併衝突
#其實有上述報錯後,dev分支下的內容已經存在了master目錄下的文件中,只是沒有提交而已,提交便可
#可是工做中不建議直接提交,由於內容有些特殊的地方
[root@git git]# cat branch.txt                  # 此時文件的內容以下
aaaa
bbbb
<<<<<<< HEAD
dddd
=======
cccc
>>>>>>> dev
[root@git git]# cat branch.txt               #是用vim命令進入修改,將衝突報錯產生的特殊符號刪除再提交
aaaa
bbbb
dddd
cccc
[root@git git]# git add branch.txt
[root@git git]# git commit -m "衝突已解決"
[master 26ff6b8] 衝突已解決
[root@git git]# git log --graph --pretty=oneline --abbrev-commit            #查看分支合併狀況
*   26ff6b8 衝突已解決
|\  
| * 051082c alter from dev
* | 1303111 alter from master
|/  
* e9989ba commit From dev branch
* b9f1465 第一次提交From master

四、關閉快速合併
在上面說到,在查看git版本的提交歷史時,其分支結構表現的不是那麼直觀,那是由於默認開啓了快速合併的選項,這裏寫下如何關閉快速合併3d

#進入分支,修改文件內容,並提交
[root@git git]# git checkout -b dev 
Switched to a new branch 'dev'
[root@git git]# echo "123" >> branch.txt 
[root@git git]# git add branch.txt
[root@git git]# git commit -m "關閉快速合併"
[dev 3d40b6a] 關閉快速合併
 1 file changed, 1 insertion(+)
 #切換至master分支,進行合併
[root@git git]# git checkout master 
Switched to branch 'master'
[root@git git]# git merge --no-ff -m "分支合併說明" dev                #選項「--no--ff」就是關閉快速合併
Merge made by the 'recursive' strategy.
 branch.txt | 1 +
 1 file changed, 1 insertion(+)
[root@git git]# git log --graph --pretty=oneline --abbrev-commit
#再次查看提交日誌
*   f438cbf 分支合併說明
|\  
| * 3d40b6a 關閉快速合併
|/  
*   26ff6b8 衝突已解決
|\  
| * 051082c alter from dev
* | 1303111 alter from master
|/  
#如下是最初沒有關閉快速合併的分支合併操做,能夠看到只有一列星號,而不顯示分支
* e9989ba commit From dev branch
* b9f1465 第一次提交From master

五、Bug分支
開發人員在開發過程當中,bug就像屢見不鮮同樣,有了bug就要修復,在git中,因爲分支是強大的,因此均可以經過一個新的臨時分支來修復bug,修復後,分支合併,而後將臨時分支刪除。版本控制

當咱們接到一個修改bug的任務後,很天然的想要建立一個分支來修復它,可是當前正在進行的工做進行到一半,還沒法提交,但又須要立刻修復bug,此時,能夠經過git提供的stash功能,能夠把當前工做區「儲藏」起來,等之後恢復現場後繼續工做。
工做進行到一半時工做區的狀態以下:指針

[root@git git]# cat branch.txt             
aaaa
bbbb
dddd
cccc
123
[root@git git]# echo "321321" >> branch.txt 
[root@git git]# git status                 #提示修改可是還沒有提交
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   branch.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

將此時的工做區隱藏起來

[root@git git]# git stash               # 這條命令,能夠將當前工做區隱藏
Saved working directory and index state WIP on master: f438cbf 分支合併說明
HEAD is now at f438cbf 分支合併說明
[root@git git]# git status           # 查看狀態,如今是乾淨的
# On branch master 
nothing to commit, working directory clean
[root@git git]# cat branch.txt            #文件也沒有咱們新加的內容
aaaa
bbbb
dddd
cccc
123

假設在master分支上修復bug

#切換至master分支並進入bug分支修改
[root@git git]# git checkout master 
[root@git git]# git checkout -b bug 
Switched to a new branch 'bug'
[root@git git]# echo "eeee" >> branch.txt 
[root@git git]# git add branch.txt
[root@git git]# git commit -m "alter from bug"
[bug 1cdff4b] alter from bug
 1 file changed, 1 insertion(+)
 #切換至master分支合併修改後的bug分支
[root@git git]# git checkout master 
Switched to branch 'master'
[root@git git]# git merge bug 
Updating f438cbf..1cdff4b
Fast-forward
 branch.txt | 1 +
 1 file changed, 1 insertion(+)
[root@git git]# cat branch.txt              #合併後的文件內容以下
aaaa
bbbb
dddd
cccc
123
eeee
[root@git git]# git branch -d bug              # 刪除bug分支
Deleted branch bug (was 1cdff4b).
#回到dev分支恢復以前修改的內容繼續本身的工做
#有兩種恢復方法:
#一是使用 git stash apply 恢復,可是恢復後,stash 內容並不刪除,須要用 git stash drop 來刪除;
#另外一種方式是用 git stash pop,恢復的同時把 stash 內容也刪了;這裏我採用第二種方法
[root@git git]# git stash pop            #恢復存儲區的內容
Auto-merging branch.txt
CONFLICT (content): Merge conflict in branch.txt
[root@git git]# cat branch.txt          #咱們以前的內容又回來了  
aaaa
bbbb
dddd
cccc
123
<<<<<<< Updated upstream
eeee
=======
321321
>>>>>>> Stashed changes
#最後工做完成,在合併dev分支的時候,也會有分支衝突,能夠參考前面解決分支衝突的方法

六、Git分支管理相關命令

[root@git ll]# git checkout -b ops    #建立ops分支並切換到ops分支
[root@git ll]# git checkout master     #切換至master分支
[root@git ll]# git merge dev     #快速合併dev分區到當前分支
[root@git ll]# git branch -d ui       #刪除ui分支
[root@git ll]# git branch        #查看所在分支(用星號表示所在分支)
[root@git ll]# git log --graph --pretty=oneline --abbrev-commit 
#查看分支合併圖
[root@git ll]# git merge --no-ff -m "合併時提交信息" dev   #不使用快速合併分支
[root@git ll]# git stash        #將當前版本庫的狀態臨時存儲
[root@git ll]# git stash pop   #恢復並刪除臨時存儲的信息
[root@git ll]# git stash apply    #恢復臨時存儲信息,但不刪除信息
[root@git ll]# git stash drop     #刪除臨時存儲中的信息
[root@git ll]# git stash show     #查看臨時存儲的信息
[root@git ll]# git branch -D dev       #強制刪除一個分支
[root@git ll]# git remote       #查看當前版本庫是否屬於遠程版本庫
[root@git ll]# git remote -v    #查看遠程版本庫的詳細信息
[root@git ll]# git push origin dev     #將本地dev分支推送到遠程倉庫
[root@git ll]# git checkout -b dev origin/dev   #建立本地dev分支並關聯到遠程倉庫的dev分支
[root@git ll]# git pull    #抓取遠程分支,通常用於解決衝突
[root@git ll]# git branch --set-upstream-to=origin/dev dev   #將本地分支dev關聯到遠程倉庫的dev分支
相關文章
相關標籤/搜索