Git知識總覽(三) 分支的建立、刪除、切換、合併以及衝突解決

前兩篇博客集中的聊了git的一些經常使用命令,具體請參見《Git知識總覽(一) 從 git clone 和 git status 談起》、《Git知識總覽(二) git經常使用命令概覽》。本篇博客主要涉及了在git版本管理中的分支的建立、切換以及合併。而且羅列了在merge分支使發生衝突時的解決方式。同時還介紹瞭如何刪除本地分支以及遠程分支。本篇博客除了參考ProGit中的內容,還參考了learngitbranching這個網站進行的git分支內容的學習和梳理。下方的示例有的給出了基於LearningBranching的示例,有的是基於真實分支操做的示例。本篇博客只是git分支管理的部分知識,下篇博客會繼續總結git分支的相關操做。html

 

1、分支建立與切換git

一、建立新的分支並切換到該分支上進行提交工具

首先咱們先從最簡單的來,下方演示了git分支的建立和切換的最基本的操做,具體步驟以下:post

  1. git branch <分支名> : 首先使用 git branch bugfix01,在當前分支也就是master分支上建立了一個名爲bugfix01的新分支。
  2. git checkout <分支名> : 而後使用 git checkout bugfix01 命令來切換到咱們新建立的bugfix01的新分支上。
  3. git commit : 最後使用 git commit 命令在新的分支上進行代碼提交。

  

 

從上面的操做上咱們不難看出,其中的星號*表示git的 HEAD 指針,指向當前所在分支。開始時 HEAD指針指向的是master分支,也就是用戶當前所操做的分支是master。使用 git branch 建立一個新的分支後,HEAD的指向並無改變,仍然指向的是master分支。當使用 git checkout 命令後,HEAD 指針就由 master 分支轉向了 bugfix01 分支了,這樣咱們就能夠對bugfix01進行操做了。學習

上面還須要注意的時,在建立好分支後,若是在新的分支上沒有提交的話,那麼 bugfix01 分支和 master 分支所指向的提交號是一致的,上面都是 C1。 這個 C1 表示的就是每次提交的哈希值,也就是提交號。當使用 git commit 時,說明在分支上有新的提交了,就會在以前的提交的基礎上往下延伸一個提交,也就是 C2。後提交的 C2 會有一個指針指向上一個提交C1。開發工具

 

二、上述操做在終端的表現網站

接下來咱們來看一下終端的具體操做。下方是最初的狀態,目前所在的分支爲master分支。從下方能夠看出該分支上的Tag號,以及HEAD指針指向的master。url

  

 

而後咱們使用 git branch bugfix01 建立一個新的分支。從下方能夠看出 bugfix01分支的指針指向的commit號和master的commit號一致,緣由是咱們從master中開出來的分支。不過當前所操做的分支仍然是master (HEAD -> master)。spa

  

 

由於咱們從master分支上切換到了bugfix01分支上,因此此刻的HEAD指針指向的是bugfix01。 3d

  

 

而後咱們在bugfix01上提了一些代碼,此刻咱們看到bugfix01指向最新的commit,可是HEAD一直是指向當前分支bugfix的。

  

 

上面這些操做所使用的命令以下所示:

  

  

三、建立並切換分支

咱們可使用一個簡寫的命令來建立並切換到該分支上,下方就演示了這一操做:

  1. git checkout -b <分支名> : 首先使用 git checkout -b bugfix02 命令在當前所在分支bugfix01上建立一個新的分支而且切換到新建立的bugfix02上。
  2. git commit : 而後就可使用 git commit 在新的分支 bugfix02 上進行提交了。

  

上述命令在終端上的執行結果就不作過多贅述了,請參見第二部分。

 

四、切換到以前的分支並提交

下方的使用場景是切換到以前已經建立好的分支上,並在切換後的分支上進行提交。下方操做後就會造成分叉。

  1. git checkout <分支名> :目前所在分支是bugfix02, 而後使用 git checkout bugfix01 命令將分支切換到 bugfix01上。
  2. git commit : 切換後就能夠在bugfix01上進行提交操做了。

  

 

上篇博客中也聊到了,在終端中,咱們可使用 git log --oneline --graph --all 來查看全部分支狀況。具體以下所示:

  

 

 

2、分支的合併與刪除以及衝突解決

上一部分是如何建立分支和在各個分支間進行切換,接下來咱們就來看一下分支的合併與刪除。

一、分支的合併-merge

咱們還以上面那個示例來看一下分支的合併。下方的操做主要是分支的合併、當在兩個分支 bugfix01 和 bugfix02 上修改了相關bug, 而且須要將修改後的代碼合入到master分支上。下方就是這一系列的操做:

  • 首先使用 git checkout master 命令切換到master分支上。
  • 而後使用 git merge bugfix01 命令將 bugfix01 分支的修改合入到master分支上,在合入成功後會將合入後的新文件進行提交,此刻會有一個新的commit號,也就對應着下方的C9。
  • 而後使用  git merge bugfix02,在將 bugfix02上的修改合入到master分支上,merge 對應的commit號爲C10。
  • 最後仍是能夠在master分支上進行正常提交的。

  

 

下方就是咱們在真正的分支中進行的分支合併的操做,咱們將 bugfix01 分支merge到了master分支上。從下方能夠看到 bugfix02 還還沒有合入Master分支。稍後咱們會在處理衝突的示例中將bugfix02分支合入到master分支中。

  

 

二、分支的刪除

上面能夠看到,雖然 bugfix01 和 bugfix02 的分支已經被合入到master分支上了,可是這兩個分支仍是存在的。若是咱們不須要這兩個分支指針了,能夠將兩個分支指針進行刪除:

  • 首先使用 git branch -d bugfix01 對分支 bugfix01 進行刪除。
  • 而後使用  git branch -d bugfix02 對分支 bugfix02 進行刪除。

從下方的操做上來看對分支的刪除只是刪除的指向該commit號的指針,並不會刪除其相關的提交號, 在日誌中仍然能夠找到以前的commit記錄,也仍然能夠在該commit上建立新的分支。若是你想刪除遠端的分支的話,那麼得使用 $ git push origin --delete <分支名> 了。

  

 

仍是要依附於實例,下方對上一部分已經合入master分支的bugfix01分支執行了刪除操做,刪除成功後會提示 「Delete branch bugfix01 ( was 223aefb)」, 後邊這個就是刪除分支所對應的commit號的前7位。

  

 

從下方截圖中能夠看到,其中bugfix01這個分支被刪除了,不過刪除的只是指向該commit號的一個指針或者別名,其餘的都沒改變。

  

 

三、衝突解決

上面是不衝突時的正常流程,若是在分支合併時,兩個分支同時修改了同一個文件的同一個地方。此刻分支合併時就會衝突,就須要人工介入來解決衝突的代碼了。上面咱們說留着 bugfix02 這個分支是有用的,如今就來看一下bugfix02 這個分支的用處。從下方的 log 中不難發現,bugfix02分支和 master 分支都修改該了README.md文件的第二行數據。接下來咱們就將 bugfix02 合入 master分支上。

  

 

下方截圖的內容就是咱們將 bugfix02 分支合入到 master分支時所報的衝突。衝突的大概意思就是在合併 README.md 文件時產生了衝突,自動合併失敗了,須要修復這個衝突,在修復以後再對結果進行提交。咱們可使用 git status來查看一下當前的狀態(配置的別名 git st)。從 git status的提示中也能夠看到,你能夠修復該衝突,而後使用 git commit 進行提交,或者 使用 git merge --abort 命令放棄本次合併。若是放棄本次合併就會回到合併以前的狀態,固然,這並非咱們想要的,下方會對衝突進行解決,並提交,

  

 

接下來咱們就來看一下衝突的具體內容,從<<<<<<<<開始到>>>>>>>>>結尾是衝突的部分,兩個分支的內容由========進行分割。上方是當前分支所修改的內容, 咱們須要將衝突的內容進行合併,根據具體狀況具體分析,看那些須要保留那些不須要保留。仍是都須要保留。

  

 

下方就是咱們修改衝突後的內容,修復策略是保留了master的修改,刪除了bugfix02分支的修改。而後將修改的文件進行提交便可,在此就不作過多贅述了。

  

 

四、使用工具進行衝突解決

輸入 git mergetool 而後根據提示輸入opendiff, 在Mac下會打開Xcode自帶的FileMerge工具。

  

 

下方就是啓動的 FileMerge 工具, 在使用該工具進行文件merge時,能夠選擇幾種文件合併策略。好比以左邊爲準,以右邊爲準等。

  

上述工具位於Xcode的開發工具中,以下所示:

  

 

 

3、分支的查看以及強制刪除

首先咱們使用 git log --oneline --graph --all 命令來可視化的看一下目前的分支狀態。從下方的截圖中咱們能夠看到,目前共有三個分支 master、bugfix0二、bugfix03。而且咱們能夠看出bugfix02已經合入master分支,bugfix03還沒有合入。

  

 

下方是一系列查看分支的一些方法:

  • git branch : 查看全部分支,其中前面有星號的是當前所在分支,下方即爲master分支。
  • git branch -v : 查看全部分支和該分支上最後的一次提交。
  • git branch --merged : 查看已經合入當前分支的全部分支。
  • git branch --no-merged : 查看未被合入分支。

  

 

今天博客關於git分支管理的內容就先到這吧,下篇博客會詳細介紹 rebase 以及 cherry-pick 等相關內容。 

相關文章
相關標籤/搜索