1. 程式人生 > >Git知識總覽(六) Git分支中的遠端操作實踐

Git知識總覽(六) Git分支中的遠端操作實踐

前幾篇部落格陸陸續續的講了好多關於Git操作的內容, 其中在上篇部落格聊了《》,本篇部落格仍然也不例外,不過本篇部落格的主題是關於git的遠端操作的。依照之前部落格的風格,我們依然依託於LearningGitBranch中的相關內容來探究一下Git的遠端操作。今天這篇部落格算是Git系列部落格的結尾了。

一、PUSH到遠端

1、將本地的Merge操作推送給遠端

下方左邊是我們的git分支的初始狀態,我們從master分支上分別建立了三個不同的分支side1、side2、side3。並且在每個分支上都有新的提交。右邊是遠端的狀態,在我們從遠端Clone後,團隊的其他小夥伴往遠端提了一個新的提交C8。

  

下方就是我們經過遠端程式碼的pull,然後在本地進行merge, 最終進行push的效果。下方我們就通過具體的分支操作來達到下方的目標。

  

上述的目標其實很簡單,就是將上述的side1、side2、side3分支合入到master分支,然後再push到遠端。下方是完成目標的具體操作。

  • git pull: 因為要合入到master分支,所有先我們通過 checkout 命令切換到master分支,然後通過 pull 命令獲取到遠端master分支上的所有提交。
  • git merge: 接下來就是在 master分支上一系列的merge操作了,最終side1、side2、side3的分支都會合入到master分支。
  • git push: 然後通過git push 操作將本地合併好的master分支push到遠端進行共享。

使用場景:上述操作在日常開發中經常用到,比如你本地針對不同的問題開出了不同的分支,然後在各個分支上分別做了不同的事情。當這些事情做完時需要合併到主分支,和其他同事進行共享。在合入之前,需要先拉取遠端master分支的最新程式碼,然後在本地進行合併,合併後在進行push操作。有的小夥伴文為啥要拉取最新的程式碼,因為拉取程式碼是為了保證本地的master分支與遠端一致,並在程式碼merge時極有可能會產生衝突,需要我們在本地merge的過程中將這些衝突進行解決掉,然後再push到遠端。

  

2、推送遠端前的rebase操作

上面程式碼合併時的分支看上去是非常亂的,我們可以不選擇使用merge命令來合併分支,可以使用rebase-變基操作。變基操作在之前的部落格中已經介紹過了,本篇部落格就不做具體講解了,下方只是對rebase操作的具體實踐。

下方的內容也是比較簡單的,就是使用rebase操作來代替上方的merge操作。下方的截圖就是我們要完成的目標。此處的目標與上述merge操作後的結果對比一下,不難發現,下方經過rebase操作後的分支並沒有那麼雜亂,而是成線性的操作,push到遠端的話,看上去就好像是基於master分支來開發的一樣。

  

下方的操作也是比較簡單的,就是將上一部分的merge操作換成了rebase操作,不過在執行rebase操作時要區分好一個分支變基到那個分支上。下方是具體操作的描述:

  • git fetch: 首先投過git fetch抓取遠端的程式碼。
  • git rebase: 然後就一系列的git rebase操作,先使用git rebase o/master side1 操作將side1分支上的提交內容變基到o/master分支上,然後是將side2變基到side1上,接著是將side3變基到side2上。最後是將master分支變基到side3上,這一步操作也就是快速前進的操作,目的是將master分支指向目前rebase後的分支的最後一個提交上。
  • git push: 最後就是通過git push將整理好的分支push到遠端。遠端的分支看上去就是一個線性的提交了,而不會保留我們本地之前的那三個分支的具體提交。

通過merge和rebase操作都能完成我們將本地的程式碼進行合併到主分支然後push到遠端的目標,但是其具體整理分支方式不同。rebase使得分支的合併更線性一些,而merge操作就使的分支的合併呈現二維的一個結構。

至於rebase好還是merge好,個人感覺merge的優點是能更好的儲存你的操作歷史,而rebase則會丟棄掉一些操作歷史。但是merge的缺點是多個分支進行合併時,其合併歷史看上去會比較繁雜,而rebase操作顯得就比較乾淨利索。至於在合併分支時時用merge還是rebase,沒有具體的要求。

  

二、遠端分支追蹤和push

1、分支的遠端追蹤

首先我們來看一個示例:

  • 首先我們通過 git clone 操作克隆了一份程式碼,然後在本地的master分支上通過 git checkout -b bugfix01分支並切換到該分支上,並且在遠端通過fakeTeamwork操作建立了一個遠端提交。
  • 接著我們在bugfix01分支上做了一次提交。
  • 此時此刻我們在bugfix01分支上想拉取遠端最新的程式碼,執行了git pull操作。從下方來看,是不被允許的,並給出了提示 “bugfix01 is not a remote tracking branch! I dont know where to push”,大概意思是bugfix01沒有一個正在追蹤的遠端分支,不知道從哪個分支上進行拉取。

  

接下來要做的事情是在建立分支就給我們建立的新的分支指定一個追蹤的遠端分支,這樣就可在我們建立的新分支上來pull遠端分支中的內容了。下方是具體操作:

  • 首先我們通過 git checkout -b bugfix02 o/master 命令建立並切換到了bugfix02上,後邊所新增的o/master分支名就是bugfix02所要追蹤的遠端分支。
  • 因為我們為bugfix02新增和遠端追蹤分支,我們就可以在bugfix02分支上通過 git pull 命令來拉取 o/master分支上的相關內容。具體如下所示。

  

 2、push到遠端

接下來我們要聊到就是在當前操作分支上將將本地的其他分支push到遠端。具體操作如下所示:

  • 下方的操作我們事先將HEAD指標指向了C0。
  • 然後執行 git push origin foo 操作將foo分支上的內容push到遠端,push完畢後,本地的o/foo分支也會跟著變動,如下所示。
  • 同樣,使用 git push origin master 命令,可以將本地的master分支上的提交push到遠端的master分支,並修改本地的遠端o/master分支的指向。

因為在該操作中foo追蹤了遠端的o/foo分支,所以可以push到遠端的foo分支上。

  

上面將相關分支同步到遠端所對應的分支上,比如將本地的master分支push到遠端的o/master分支上。而接下來要做的事情是將本地的 a分支push到遠端的b分支上,將本地的b分支push到遠端的a分支上。具體導致如下所示:

  • 下方我們通過 git push origin foo:master 操作將本地foo分支上的提交push到遠端的master分支上。
  • 通過 git push origin master^:foo 操作,將本地的master分支之前的所有分支提交到遠端的foo分支上。

上述冒號後方的分支名所對應的就是遠端的分支。

  

三、抓取遠端操作

1. fetch origin

上面演示了push origin 的操作,接下來我們可以看一下fetch origin的操作。

  • 我們可以通過 git fetch origin foo:master 來將遠端的master分支上的內容同步到本地的foo分支上,當然這個foo分支也要有對應的追蹤遠端的。

  

我們還可以通過fetch origin或者push origin來建立和刪除相關分支。下方左圖是我們要完成的目標,右圖是目前現狀。我們要做的是通過 fetch origin 命令來刪除foo分支,然後也是通過fetch origin命令來建立一個barf分支。

  

接下來我們就通過相關命令來完成上述目標:

  • 首先我們通過git push origin :foo 操作來刪除遠端的foo分支。
  • 然後在通過git fetch origin :bar操作來建立一個本地的bar分支。

具體如下所示:

  

四、本地分支跟蹤遠端其他分支

本關其實就是在拉取分支時順便建立一個追蹤遠端相關分支的本地分支。下方截圖就是本關要完成的任務。圖左邊是我們要完成的目標,右邊是現有狀態。要完成最終的目標,需執行下方的幾步:

  • 當前狀態是在master分支上有一個新的提交C4並未push到遠端, 若要達到目標,需要在master分支上線pull遠端的bar分支,然後在pull遠端的master分支。
  • 在pull遠端分支時,分別建立了不同的分支跟蹤遠端的分支。下方會有具體的命令操作。

  

下方是具體的命令操作:

  • 首先通過 git pull origin bar:foo 命令拉取遠端的 bar 分支,在拉取遠端分支後,在本地建立一個 foo 分支來跟蹤遠端的bar分支。
  • 然後再通過 git pull origin master:side 命令拉取遠端的 master 分支,然後建立一個本地side分支來跟蹤遠端的master分支。

最終操作如下所示:

  

陸陸續續的也聊了好多git相關操作,git相關內容先到這兒,以後如果還有其他內容再做補充。