git知識總結-2.git基本操做之原理說明 簡單對比git pull和git pull --rebase的使用 git checkout 命令詳解

0.前言

本文主要對git經常使用命令的工做原理作一個詳細的說明,經常使用命令主要包括:html

 

一篇文章,教你學會Git

 

1.git add 

git add相關命令很簡單,主要實現將工做區修改的內容提交到暫存區,交由git管理。git

一篇文章,教你學會Git

一篇文章,教你學會Git

 

2. git commit

git commit主要實現將暫存區的內容提交到本地倉庫,並使得當前分支的HEAD向後移動一個提交點。github

一篇文章,教你學會Git

一篇文章,教你學會Git

3. git branch

關於分支,大概有展現分支,切換分支,建立分支,刪除分支這四種操做。緩存

一篇文章,教你學會Git

一篇文章,教你學會Git

4. git merge

merge命令把不一樣的分支合併起來。以下圖,在實際開發中,咱們可能從master分支中切出一個分支,而後進行開發完成需求,中間通過R3,R4,R5的commit記錄,最後開發完成須要合入master中,這便用到了merge。bash

一篇文章,教你學會Git

 

一篇文章,教你學會Git

注:通常在merge以後,會出現conflict,須要針對衝突狀況,手動解除衝突。主要是由於兩個用戶修改了同一文件的同一塊區域。以下圖所示,須要手動解除。服務器

一篇文章,教你學會Git

5. git rebase

rebase又稱爲衍合,是合併的另一種選擇。在開始階段,咱們處於new分支上,執行 git rebase dev ,那麼new分支上新的commit都在new分支上重演一遍,最後checkout切換回到new分支。svg

這一點與merge是同樣的,合併先後所處的分支並無改變。post

git rebase dev ,通俗的解釋就是new分支想站在dev的肩膀上繼續下去。rebase也須要手動解決衝突。fetch

一篇文章,教你學會Git

 

注1: merge與rebase的區別,請參考 <<merge與rebase區別>>url

注2:在項目中常用git pull來拉取代碼,git pull至關因而git fetch + git merge,若是此時運行git pull -r,也就是git pull –rebase,至關於git fetch + git rebase,參考:簡單對比git pull和git pull --rebase的使用

6.  git pull

當你使用git pull時,它將會獲取遠程服務器(你請求的,不管什麼分支)上的代碼,而且當即合併到你的本地廠庫,pull是一個高等級的請求,默認會支持fetch+merge的操做,若是不是爲了使用上的方便,你能夠徹底不使用它。

1 $git checkout localbranch
2 $git pull origin master
3 $git branch
4  master 
5 *localbranch

 

上面的命令會將遠程服務器上的master分支合併到localbranch中。

7. git fetch

fetch和pull很類似,只是fetch不會作任何的合併操做。

1 $git checkout localbranch
2 $git fetch origin remotebranch
3 $git branch
4 master
5 *localbranch
6 remotebranch

所以,fetch指是獲取remotebranch,而後建立一個本地copy,你不該該直接對這個copy作任何的操做,而應該應該建立一個本地分支,而後在本地分支上進行工做。

8. git Clone

clone將會克隆一個本地廠庫,

1 $cd newfolder
2 $git clone git@github.com:whatever/something.git
3 $git branch
4 *master
5 remotebranch

clone會爲它被克隆的遠程repo建立一個名爲「origin」的local repo,併爲遠程repo的活動分支建立一個本地分支以及遠程跟蹤分支。

9. git reset

reset命令把當前分支指向另外一個位置,而且相應的變更工做區和暫存區。

一篇文章,教你學會Git

一篇文章,教你學會Git

 

以下圖顯示了soft mixed和--hard的做用範圍。 

git rese的定義域

10. git checkout

1.切換到某個分支

git checkout hotfix

上面這個命令作的不過是將HEAD移到一個新的分支,而後更新工做目錄。

由於這可能會覆蓋本地的修改,Git 強制你提交或者緩存工做目錄中的全部更改,否則在 checkout 的時候這些更改都會丟失。和 git reset 不同的是,git checkout 沒有移動這些分支。

 

2.切換都某個提交或恢復文件的兩種用法

git checkout [<commit>] [--] <paths> ...  注:其中---表示路徑標記,以避免路徑和分支同名時用以區分

第1種用法(包含<paths>的用法)不會改變HEAD頭指針,主要使用於指定版本的文件覆蓋工做區中對應的文件。

若是省略<commit>,如git checkout paths,則會用暫存區的文件覆蓋工做區中的文件,不然git checkout commit paths用指定提交中的文件覆蓋暫存區和工做區中的對應文件

 

 

第2種用法(不包含<paths>的用法)單純的檢出某個commit或分支,如git checkout  commit或git checkout branch是會改變HEAD頭指針的。

只有當HEAD切換到某個分支的時候如git checkout branch才能夠對提交進行跟蹤,不然就會進入「分離頭指針」的狀態。若是省略用法2後面的<branch>如git checkout,則默認對工做區進行狀態檢查

這和 checkout 到另外一個分支是徹底同樣的:把 HEAD 移動到特定的提交。好比,下面這個命令會 checkout 到當前提交的祖父提交。

git checkout HEAD~2

將 HEAD 移動到任意 commit

這對於快速查看項目舊版原本說很是有用。但若是你當前的 HEAD 沒有任何分支引用,那麼這會形成 HEAD 分離。這是很是危險的,若是你接着添加新的提交,而後切換到別的分支以後就沒辦法回到以前添加的這些提交。所以,在爲分離的 HEAD 添加新的提交的時候你應該建立一個新的分支。

11. git revert

git revert用一個新提交來消除一個歷史提交所作的任何修改

一篇文章,教你學會Git

 

注:revert與reset的區別

一篇文章,教你學會Git

(1)git revert是用一次新的commit來回滾以前的commit,git reset是直接刪除指定的commit。

(2)在回滾這一操做上看,效果差很少。可是在往後繼續merge之前的老版本時有區別。

由於git revert是用一次逆向的commit「中和」以前的提交,所以往後合併老的branch時,致使這部分改變不會再次出現,減小衝突。

可是git reset是之間把某些commit在某個branch上刪除,於是和老的branch再次merge時,這些被回滾的commit應該還會被引入,產生不少衝突。

(3)git reset 是把HEAD向後移動了一下,而git revert是HEAD繼續前進,只是新的commit的內容和要revert的內容正好相反,可以抵消要被revert的內容。

12. git push

上傳本地倉庫分支到遠程倉庫分支,實現同步。

git push的通常形式爲 git push <遠程主機名> <本地分支名>  <遠程分支名> ,例如 git push origin master:refs/for/master ,便是將本地的master分支推送到遠程主機origin上的對應master分支, origin 是遠程主機名,

第一個master是本地分支名,第二個master是遠程分支名

1. git push origin master

        若是遠程分支被省略,如上則表示將本地分支推送到與之存在追蹤關係的遠程分支(一般二者同名),若是該遠程分支不存在,則會被新建

 2. git push origin :refs/for/master 

  若是省略本地分支名,則表示刪除指定的遠程分支,由於這等同於推送一個空的本地分支到遠程分支,等同於 git push origin --delete master

 3. git push origin

   若是當前分支與遠程分支存在追蹤關係,則本地分支和遠程分支均可以省略,將當前分支推送到origin主機的對應分支 

4. git push

  若是當前分支只有一個遠程分支,那麼主機名均可以省略,形如 git push,可使用git branch -r ,查看遠程的分支名

5 git push 的其餘命令

  這幾個常見的用法已足以知足咱們平常開發的使用了,還有幾個擴展的用法,以下:

(1) git push -u origin master 若是當前分支與多個主機存在追蹤關係,則可使用 -u 參數指定一個默認主機,這樣後面就能夠不加任何參數使用git push,不帶任何參數的git push,默認只推送當前分支,這叫作simple方式,還有一種matching方式,會推送全部有對應的遠程分支的本地分支, Git 2.0以前默認使用matching,如今改成simple方式.若是想更改設置,可使用git config命令。git config --global push.default matching OR git config --global push.default simple;可使用git config -l 查看配置

(2) git push --all origin 當遇到這種狀況就是不論是否存在對應的遠程分支,將本地的全部分支都推送到遠程主機,這時須要 -all 選項

(3) git push --force origin git push的時候須要本地先git pull更新到跟服務器版本一致,若是本地版本庫比遠程服務器上的低,那麼通常會提示你git pull更新,若是必定要提交,那麼可使用這個命令。

(4) git push origin --tags //git push 的時候不會推送分支,若是必定要推送標籤的話那麼可使用這個命令

一篇文章,教你學會Git

13.其餘命令

一篇文章,教你學會Git

 

參考文檔

 1.http://www.cnblogs.com/hutaoer/archive/2013/05/07/git_checkout.html  git checkout 命令詳解

 2.https://github.com/geeeeeeeeek/git-recipes/wiki/5.2-%E4%BB%A3%E7%A0%81%E5%9B%9E%E6%BB%9A%EF%BC%9AReset%E3%80%81Checkout%E3%80%81Revert-%E7%9A%84%E9%80%89%E6%8B%A9  代碼回滾:Reset、Checkout、Revert 的選擇

相關文章
相關標籤/搜索