天天看點

玩轉git分支

搞個代碼的管理工具,居然不弄上分支啥的東西。這簡直太low了。尤其是在使用了傳說中得很牛x的git的時候,尤其顯得low。拿着青龍偃月刀當燒火棍子使,關公知道了還不重反人間教育你!?

遠端分支

要說分支就一定要從分支産生的最遙遠的曆史談起。這一切開始于你用clone指令從遠端把代碼庫的代碼拉取到本地開始。這個時候,git自動把這個遠端代碼庫命名為origin并自動建立一個origin/master分支。相對的在本地建立一個叫做master的本地分支。這個時候這兩個分支的指針都是指向一個地方的(不同的push發生的時候,master的指針就會發生變化)。

要建立一個遠端分支是非常必要的。也非常的簡單。隻需要先建立一個本地分支。

這隻是建立了一個叫做develop的分支。如果要使用這個分支,還需要切換到這個分支上:

還有一個更快的方式建立分支,并直接切換到這個分支上:

一個指令就把上面的兩個指令幹得事全部搞定了。

說了半天都是折騰在本地分支(local branch)了。沒有離題。遠端分支就是本地分支push到遠端以後生成的。也就是前面我們折騰出來的develop分支隻要push到遠端伺服器上就可以了。

但是,你還需要給你建立起來的遠端的和本地的分支設定一個直接的聯系。這個時候就需要把你本地的分支變成一個tracking branch。tracking branch就是一個和遠端的分支有直接聯系的本地分支。如果你在一個tracking branch裡使用git pull指令,那麼git自動檢測到從哪個代碼庫擷取代碼和哪個分支執行merge操作。建立tracking branch:

整個的指令是:

上面的是一個簡寫的版本。

下面是要給謹慎使用的指令,删除遠端分支。

這個時候遠端分支就被删除了。

日常工作

日常裡使用git的時候就是處理代碼的pull,push和merge以及在這個時候遇到的各種問題。

既然有了這麼多分支。也許是兩個,但是使用git建立分支的成本真的非常的低,是以有的時候可以是每一個大一點的issue就是一個分支。這時候就需要在多個分支之間切換:

每天早晨一到公司首先要做的就是確定你在正确的分支上,然後從git repository上面把代碼弄下來。這就要用到pull:

如果你在前一天的晚上忘記push代碼或者有其他的人在你push之後push了代碼了。那麼就會遇到:“沖突”。git會告訴你:

error: your local changes to "你修改過的檔案" would be overwritten by merge. aborting. please commit your changes or stash them before you can merge.

這種情況是編輯檔案的沖突

這樣的一個aborting非常的郁悶。好的提示已經告訴我們該如何解決這個問題了。使用stash。

1. 使用stash指令把本地的代碼先存起來。

這時,你本地的修改已經暫時存起來了。使用指令:git stash list可以看到儲存的資訊。

2. 然後使用我們上面說到的pull指令拉取遠端庫的代碼。

3. 還原暫時儲存的本地的修改

大象裝冰箱分的是三部。到這裡我們的代碼還是沒有處理完畢的。真正的問題才浮出水面。ooxx這個時候就出現了。也就是在svn中常見的<<<<<<< ======什麼的就出現在了你的代碼裡。手動的解決沖突吧。當你處理好這些沖突的代碼之後。

然後commit,之後:

當把代碼同步的事情弄順了以後就應該考慮要把本地檔案送出到遠端代碼庫了。

當然如果你的本地分支名和遠端分支名是一樣的,那麼就隻需要git push origin [分支名稱]就可以了。 

補充:

1. 有的時候即使你處理完成沖突之後再commit還是會有問題:

這個時候:

來commit沖突的檔案。

2. 這裡你還會用到别的指令:

3. 撤銷對某個檔案的修改:

如果是檔案的删除沖突的話:

這個時候隻要使用git rm [檔案名]删掉已經被删掉的檔案就可以了。

commit之後用git show | head指令檢視結果。

合并分支

要合并那個分支,比如要把develop的分支合并到master上。那麼:

1. 轉到master分支上:

2. 開始合并:

在這個指令執行之後就會把develop分支上的代碼都合并到master上了。

如果遇到任何沖突

按照以上提到的解決沖突的方法解決沖突就可以。

撤銷一個合并

如果你發現你的本地代碼簡直是一團糟,需要回到合并之前的狀态:

本地代碼回到合并之前的狀态。

或者,你已經把合并後的代碼送出,但還是想把它們撤銷:

但是這個指令某些情況下會很危險,尤其是在你已經把合并後的分支删除之後再使用這個指令。。。

删除不存在對應于遠端分支的本地分支

在删除之前首先需要檢視一下遠端代碼庫origin下得分支都是什麼情況的:

玩轉git分支
玩轉git分支

這時候你會看到這個b1的分支還是stable的。使用git remote prune origin可以将其從本地代碼庫中去除。

還有一個更簡單的方法:git fetch -p。會在fetch之後删除沒有與遠端分支對應的本地分支。

重命名遠端分支

這個過程很墨迹。因為要先删除遠端分支,然後重命名本地分支,然後再送出這個命名好的本地分支到遠端分支。

現在有一個devel的分支,要把它重命名為develop。先用git branch -av指令檢視分支的狀況。這裡最重要是确定好了,你要删除的不是預設分支!之後就可以删除了:

重命名本地分支:

推送本地分支到遠端:

玩轉git分支
玩轉git分支

檢視未推送

檢視全部分支的已經commit但是沒有push的:

檢視全部分支的全部的最近的commit:

檢視某檔案的曆史記錄:

常見錯誤處理

1. non-fast-forward

如果有人比你先push代碼到你所在的分支了,那麼git就不允許你再嵌入代碼到這代碼庫。

玩轉git分支
玩轉git分支

這時候使用fetch和merge的方法解決這個問題:

fetch:

merge:

或者直接pull。pull指令同時執行了這兩個指令。

歡迎加群互相學習,共同進步。qq群:ios: 58099570 | android: 330987132 | go:217696290 | python:336880185 | 做人要厚道,轉載請注明出處!http://www.cnblogs.com/sunshine-anycall/p/4342520.html