前幾篇博客陸陸續續的講了好多關於Git操做的內容, 其中在上篇博客聊了《Git中的merge、rebase、cherry-pick以及交互式rebase》,本篇博客仍然也不例外,不過本篇博客的主題是關於git的遠程操做的。依照以前博客的風格,咱們依然依託於LearningGitBranch中的相關內容來探究一下Git的遠程操做。今天這篇博客算是Git系列博客的結尾了。html
1、PUSH到遠端git
一、將本地的Merge操做推送給遠端ide
下方左邊是咱們的git分支的初始狀態,咱們從master分支上分別建立了三個不一樣的分支side一、side二、side3。而且在每一個分支上都有新的提交。右邊是遠端的狀態,在咱們從遠端Clone後,團隊的其餘小夥伴往遠端提了一個新的提交C8。post
下方就是咱們通過遠端代碼的pull,而後在本地進行merge, 最終進行push的效果。下方咱們就經過具體的分支操做來達到下方的目標。fetch
上述的目標其實很簡單,就是將上述的side一、side二、side3分支合入到master分支,而後再push到遠端。下方是完成目標的具體操做。url
git pull: 由於要合入到master分支,全部先咱們經過 checkout 命令切換到master分支,而後經過 pull 命令獲取到遠端master分支上的全部提交。
git merge: 接下來就是在 master分支上一系列的merge操做了,最終side一、side二、side3的分支都會合入到master分支。
git push: 而後經過git push 操做將本地合併好的master分支push到遠端進行共享。
使用場景:上述操做在平常開發中常常用到,好比你本地針對不一樣的問題開出了不一樣的分支,而後在各個分支上分別作了不一樣的事情。當這些事情作完時須要合併到主分支,和其餘同事進行共享。在合入以前,須要先拉取遠端master分支的最新代碼,而後在本地進行合併,合併後在進行push操做。有的小夥伴文爲啥要拉取最新的代碼,由於拉取代碼是爲了保證本地的master分支與遠端一致,並在代碼merge時極有可能會產生衝突,須要咱們在本地merge的過程當中將這些衝突進行解決掉,而後再push到遠端。spa
二、推送遠端前的rebase操做3d
上面代碼合併時的分支看上去是很是亂的,咱們能夠不選擇使用merge命令來合併分支,可使用rebase-變基操做。變基操做在以前的博客中已經介紹過了,本篇博客就不作具體講解了,下方只是對rebase操做的具體實踐。指針
下方的內容也是比較簡單的,就是使用rebase操做來代替上方的merge操做。下方的截圖就是咱們要完成的目標。此處的目標與上述merge操做後的結果對比一下,不難發現,下方通過rebase操做後的分支並無那麼雜亂,而是成線性的操做,push到遠端的話,看上去就好像是基於master分支來開發的同樣。htm
下方的操做也是比較簡單的,就是將上一部分的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,沒有具體的要求。
2、遠端分支追蹤和push
一、分支的遠程追蹤
首先咱們來看一個示例:
首先咱們經過 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分支上的相關內容。具體以下所示。
二、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分支上。
上述冒號後方的分支名所對應的就是遠端的分支。
3、抓取遠端操做
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分支。
具體以下所示:
4、本地分支跟蹤遠端其餘分支
本關其實就是在拉取分支時順便建立一個追蹤遠端相關分支的本地分支。下方截圖就是本關要完成的任務。圖左邊是咱們要完成的目標,右邊是現有狀態。要完成最終的目標,需執行下方的幾步:
當前狀態是在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相關內容先到這兒,之後若是還有其餘內容再作補充。