1. 程式人生 > >玩轉git分支

玩轉git分支

total important 主動 解決問題 class 刪掉 develop ron 提示

搞個代碼的管理工具。竟然不弄上分支啥的東西。

這簡直太low了。尤其是在使用了傳說中得非常牛X的Git的時候。尤其顯得low。

拿著青龍偃月刀當燒火棍子使,關公知道了還不重反人間教育你!?

遠程分支

要說分支就一定要從分支產生的最遙遠的歷史談起。

這一切開始於你用clone命令從遠端把代碼庫的代碼拉取到本地開始。這個時候。git自己主動把這個遠端代碼庫命名為origin並自己主動創建一個origin/master分支。相對的在本地創建一個叫做master的本地分支。這個時候這兩個分支的指針都是指向一個地方的(不同的push發生的時候,master的指針就會發生變化)。

要創建一個遠程分支是很必要的。也很的簡單。僅僅須要先創建一個本地分支。

git branch 分支名

//如 git branch develop

這僅僅是創建了一個叫做develop的分支。假設要使用這個分支。還須要切換到這個分支上:

git checkout 分支名
// 如 git checkout develop

另一個更快的方式創建分支,並直接切換到這個分支上:

git checkout -b 分支名
// git checkout -b develop

一個命令就把上面的兩個命令幹得事所有搞定了。

說了半天都是折騰在本地分支(local branch)了。

沒有離題。遠程分支就是本地分支push到遠端以後生成的。也就是前面我們折騰出來的develop分支僅僅要push到遠端server上就能夠了。

git push origin 分支名
// git push origin develop

可是。你還須要給你建立起來的遠端的和本地的分支設定一個直接的聯系。

這個時候就須要把你本地的分支變成一個tracking branch。Tracking branch就是一個和遠端的分支有直接聯系的本地分支。假設你在一個tracking branch裏使用git pull命令。那麽git自己主動檢測到從哪個代碼庫獲代替碼和哪個分支運行merge操作。創建tracking branch:

git checkout --track origin/分支名
// git checkout --track origin/develop

整個的命令是:

git checkout -b [本地分支名] [遠端代碼庫名稱]/[分支名]
//這時會創建一個本地分支名和遠端分支名不一樣的分支

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

以下是要給慎重使用的命令,刪除遠端分支。

$ git push origin --delete develop
To https://github.com/xxx/xxxx.git
 - [deleted]         develop

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

日常工作

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

既然有了這麽多分支。

或許是兩個。可是使用Git創建分支的成本真的很的低,所以有的時候能夠是每個大一點的issue就是一個分支。

這時候就須要在多個分支之間切換:

git checkout [分支名稱]
// git checkout develop

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

git pull [遠端代碼庫名稱] [分支名稱]
// git pull origin develop

假設你在前一天的晚上忘記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

這時,你本地的改動已經臨時存起來了。

使用命令:git stash list能夠看到保存的信息。

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

git pull

3. 還原臨時保存的本地的改動

git stash pop stash@{0}

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

git add [沖突文件名稱]

然後commit。之後:

當把代碼同步的事情弄順了以後就應該考慮要把本地文件提交到遠端代碼庫了。

git push origin [本地分支名]:[遠端分支名]

當然假設你的本地分支名和遠端分支名是一樣的,那麽就僅僅須要git push origin [分支名稱]就能夠了。

補充:

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

fatal: cannot do a partial commit during a merge.

這個時候:

git commit -i [沖突文件名稱]

來commit沖突的文件。

2. 這裏你還會用到別的命令:

git status // 看看git裏的狀態,是沖突的有哪些文件等
git show | head // 查看commit進去的是誰、日期等

3. 撤銷對某個文件的改動:

git checkout -- [文件名稱]

假設是文件的刪除沖突的話

這個時候僅僅要使用git rm [文件名稱]刪掉已經被刪掉的文件就能夠了。

commit之後用git show | head命令查看結果。

合並分支

要合並那個分支。比方要把develop的分支合並到master上。那麽:

1. 轉到master分支上:

git checkout master

2. 開始合並:

git merge develop

在這個命令運行之後就會把develop分支上的代碼都合並到master上了。

假設遇到不論什麽沖突

git diff //查看是什麽沖突

依照以上提到的解決沖突的方法解決沖突就能夠。

撤銷一個合並

假設你發現你的本地代碼簡直是一團糟,須要回到合並之前的狀態:

git reset --hard HEAD

本地代碼回到合並之前的狀態。

或者,你已經把合並後的代碼提交。但還是想把它們撤銷:

git reset --hard ORIG_HEAD

可是這個命令某些情況下會非常危急。尤其是在你已經把合並後的分支刪除之後再使用這個命令。。

刪除不存在相應於遠程分支的本地分支

在刪除之前首先須要查看一下遠端代碼庫origin下得分支都是什麽情況的:

$ git remote show origin
#* remote origin
#  Fetch URL: [email protected]:xxx/xxx.git
#  Push  URL: [email protected]:xxx/xxx.git
#  HEAD branch: master
#  Remote branches:
#    master                 tracked
#    refs/remotes/origin/b1 stale (use ‘git remote prune‘ to remove)
#  Local branch configured for ‘git pull‘:
#    master merges with remote master
#  Local ref configured for ‘git push‘:
#    master pushes to master (up to date)

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

另一個更簡單的方法:git fetch -p。會在fetch之後刪除沒有與遠程分支相應的本地分支。

重命名遠程分支

這個過程非常墨跡。由於要先刪除遠程分支。然後重命名本地分支,然後再提交這個命名好的本地分支到遠程分支。

如今有一個devel的分支,要把它重命名為develop。先用git branch -av命令查看分支的狀況。這裏最重要是確定好了,你要刪除的不是默認分支!之後就能夠刪除了:

git push --delete origin devel
#To [email protected]:xxx/xxxxxxxx.git
# - [deleted]         devel

重命名本地分支:

git branch -m devel develop

推送本地分支到遠端:

$ git push origin develop
#Counting objects: 92, done.
#Delta compression using up to 4 threads.
#Compressing objects: 100% (48/48), done.
#Writing objects: 100% (58/58), 1.38 MiB, done.
#Total 58 (delta 34), reused 12 (delta 5)
#To [email protected]:xxx/xxx-xxxxxx-x.git
# * [new branch]      develop -> develop

查看未推送

查看所有分支的已經commit可是沒有push的:

git log --branches --not --remotes

查看所有分支的所有的近期的commit:

git log --branches --not --remotes --simplify-by-decoration --decorate --online

查看某文件的歷史記錄:

git log my/file.c     #所有歷史
git log -n 1 -- my/file.c    #查看近期歷史改動

常見錯誤處理

1. non-fast-forward

假設有人比你先push代碼到你所在的分支了,那麽git就不同意你再嵌入代碼到這代碼庫。

git push origin master
# To https://github.com/USERNAME/REPOSITORY.git
#  ! [rejected]        master -> master (non-fast-forward)
# error: failed to push some refs to ‘https://github.com/USERNAME/REPOSITORY.git‘
# To prevent you from losing history, non-fast-forward updates were rejected
# Merge the remote changes (e.g. ‘git pull‘) before pushing again.  See the
# ‘Note about fast-forwards‘ section of ‘git push --help‘ for details.

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

fetch:

git fetch origin [分支名稱]  

merge:

git merge origin [分支名稱]    

或者直接pull。pull命令同一時候運行了這兩個命令。



歡迎加群互相學習,共同進步。QQ群:58099570 | 做人要厚道,轉載請註明出處。

玩轉git分支