Git工具詳解以及與GitHub的配合使用

git和Github

 

概念

git --- 版本控制工具(命令)html

工具介紹官方網站:http://git-scm.comlinux

工具下載地址:http://git-scm.com/download/git

git是一個開源的分佈式版本控制系統,用以有效、高速的處理從很小到很是大的項目版本管理。git是個工具,在linux裏面也就相似gcc這樣的工具同樣,是一個shell命令git是Linus Torvalds爲了幫助管理Linux內核開發而開發的一個開放源碼的版本控制軟件。Torvalds開始着手開發git是爲了做爲一種過渡方案來替代BitKeeper,後者以前一直是Linux內核開發人員在全球使用的主要源代碼工具。開放源碼社區中的有些人以爲BitKeeper的許可證並不適合開放源碼社區的工做,所以 Torvalds決定着手研究許可證更爲靈活的版本控制系統。儘管最初git的開發是爲了輔助Linux內核開發的過程,可是咱們已經發如今不少其餘自由軟件項目中也使用了git。例如:不少Freedesktop的項目也遷移到了git上。github

Github --- 一個平臺(網站)web

Github官方網站:https://github.com/shell

提供給用戶建立git倉儲空間保存(託管)用戶的一些數據文檔或者代碼等。數據庫

Github目前擁有140多萬開發者用戶。隨着愈來愈多的應用程序轉移到了雲上,Github已經成爲了管理軟件開發以及發現已有代碼的首選方法。GitHub能夠託管各類git庫,並提供一個web界面,但與其它像SourceForge或Google Code這樣的平臺不一樣,GitHub的獨特賣點在於從另一個項目進行分支的簡易性。爲一個項目貢獻代碼很是簡單:首先點擊項目站點的「fork」的按鈕,而後將代碼檢出並將修改加入到剛纔分出的代碼庫中,最後經過內建的「pull request」機制向項目負責人申請代碼合併。已經有人將GitHub稱爲代碼玩家的MySpace。編程

Github公有倉庫免費,私有倉庫要收費的!windows

 

git和Github的關係

指定了remote連接和用戶信息(git靠用戶名+郵箱識別用戶)以後,git能夠幫你將提交過到你本地分支的代碼push到遠程的git倉庫(任意提供了git託管服務的服務器上均可以,包括你本身建一個服務器 或者 GitHub/BitBucket等網站提供的服務器)或者將遠程倉庫的代碼 fetch 到本地。緩存

Github只是一個提供存儲空間的服務器,用來存儲git倉庫固然如今Github已經由一個存放git倉庫的網站空間發展爲了一個開源社區(不僅具備存儲git倉庫的功能了),你能夠參與別人的開源項目,也可讓別人參與你的開源項目。

 

Github相似產品

有不少Github相似的平臺,用於提供git倉庫的存儲。

BitBucket

公有、私有倉庫都免費。

網址:https://bitbucket.org/

 

GitCafe

網址:https://gitcafe.com/

 

GitLab

GitLab能夠下載軟件GitLab CE 或者 直接在在線平臺上操做。

網址:http://www.gitlab.cc/

 

Git@OSC 

Git@OSC是開源中國社區團隊基於開源項目GitLab開發的在線代碼託管平臺。
網址:http://git.oschina.net/

CSDN代碼託管平臺
CSDN CODE系統搭建於阿里雲IaaS平臺之上,向我的開發者、IT團隊及企業提供代碼託管、在線協做、社交編程、項目管理等服務。
網址:https://code.csdn.net

 

git和CVS、SVN的區別

git是分佈式版本控制系統,代碼提交是在本地的(如此速度就快),固然生成補丁(patch)而後push到遠程服務器上是須要聯網的

CVS、SVN是集中式版本控制系統,代碼提交都是提交到遠程服務器上,是須要一直聯網的(如此速度就慢)(這裏的一直聯網不是說你寫代碼的時候要聯網,而是說你提交代碼的時候必須聯網;可是git不一樣,git提交代碼是本地的不須要聯網,生成patch後push patch才須要聯網,至關於svn的遠程的集中服務器對於git來講,這個集中的遠程服務器就在本地)。這個地方比較難理解。

CVS、SVN這樣的集中式版本控制系統,它的完整代碼倉庫(代碼倉庫不只僅只包含了代碼,還包含各個歷史版本的信息等)在中心服務器上,一旦這個中心服務器掛了,也就是完整的代碼倉庫掛了,雖然你本地可能以前有從中心服務器上取得過代碼,可是那些歷史版本信息都沒有了,並且你也沒法再提交代碼。

git不一樣,git沒有中心服務器的概念,每個git客戶端(git節點)都含有一個完整的代碼倉庫(前提是你以前從遠程git倉庫fetch過代碼),因此那些歷史版本信息都在你本機上,假如哪個git節點掛掉了,隨意從其餘git節點clone一個代碼倉庫過來就ok了, 那些原來的代碼、版本信息之類的都仍是完整的(固然若是你在這個掛掉的git節點上新增的代碼是沒有掉了的)。

綜上,git的每個節點(第一次從遠程git倉庫取得代碼後,該git節點就是一個完整的代碼倉庫)至關於SVN的中心服務器,都包含完整的代碼倉庫

 

git的工做原理

 

架構圖

 

功能特性

git的功能特性:
通常開發者的角度來看,git有如下功能:
一、從遠程服務器上克隆clone完整的git倉庫(包括代碼和版本信息)到本身的機器(單機)上。
二、在本身的機器上根據不一樣的開發目的,建立分支,修改代碼。
三、在單機上本身建立的分支上提交代碼。
四、在單機上合併分支。
五、把遠程服務器上最新版的代碼fetch下來,而後跟本身的主分支合併。
六、生成補丁(patch),把補丁發送給主開發者。
七、看主開發者的反饋,若是主開發者發現兩個通常開發者之間有衝突(他們之間能夠合做解決的衝突),就會要求他們先解決衝突,而後再由其中一我的提交。若是主開發者能夠本身解決,或者沒有衝突,就經過。
八、通常開發者之間解決衝突的方法,開發者之間可使用pull命令解決衝突,解決完衝突以後再向主開發者提交補丁。

 

主開發者的角度看,git有如下功能:
一、查看郵件或者經過其它方式查看通常開發者的提交狀態。
二、打上補丁,解決衝突(能夠本身解決,也能夠要求開發者之間解決之後再從新提交,若是是開源項目,還要決定哪些補丁有用,哪些不用)。
三、向遠程服務器(公共的)提交結果,而後通知全部開發人員。


優勢:
一、適合分佈式開發,強調個體。
二、遠程服務器(公共的)壓力和數據量都不會太大。
三、速度快、靈活。
四、任意兩個開發者之間能夠很容易的解決衝突。
五、離線工做。(固然提交遠程服務器或者從遠程服務器fetch代碼是要聯網的)。

 

git中的一些概念和原理

工做區

Working Directory

電腦上能看到的目錄即工做目錄,好比:/e/git_repo/

 

版本庫

Repository

工做區有一個隱藏目錄.git,這個不算工做區,而是git的版本庫。
git的版本庫裏存了不少東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有git爲咱們自動建立的第一個分支master,以及指向master的一個指針叫HEAD。構造參見上面的結構圖。

 

暫存區

Stage

暫存區就是版本庫中的一個區域,具體參見上面的結構圖。

 

工做區、版本庫、暫存區之間的關係

git工做的流程就是:
第1步,使用git add把文件從工做區添加到版本庫中的暫存區,git add命令能夠屢次用;
第2步,使用git commit提交代碼,就是把暫存區的全部內容提交到當前分支。
綜上,須要提交的文件修改統統放到暫存區(可能有屢次的git add),而後,一次性提交暫存區的全部修改到當前分支(git commit)。

 

分支

分支(branch)有什麼用呢?假設你準備開發一個新功能,可是須要兩週才能完成,第一週你寫了50%的代碼,若是馬上提交,因爲代碼還沒寫完,不完整的代碼庫會致使別人不能幹活了。若是等代碼所有寫完再一次提交,又存在丟失天天進度的巨大風險。
如今有了分支,就不用怕了。你建立了一個屬於你本身的分支,別人看不到,還繼續在原來的分支上正常工做,而你在本身的分支上幹活,想提交就提交,直到開發完畢後,再一次性合併到原來的分支上,這樣,既安全,又不影響別人工做。

 

分支內部原理

一、以下圖所示,版本的每一次提交(commit),git都將它們根據提交的時間點串聯成一條線。剛開始是隻有一條時間線,即master分支,HEAD指向的是當前分支的當前版本。

 

二、當建立了新分支,好比dev分支(經過命令git branch dev完成),git新建一個指針dev,dev=master,dev指向master指向的版本,而後切換到dev分支(經過命令git checkout dev完成),把HEAD指針指向dev,以下圖。

三、在dev分支上編碼開發時,都是在dev上進行指針移動,好比在dev分支上commit一次,dev指針往前移動一步,可是master指針沒有變,以下:

四、當咱們完成了dev分支上的工做,要進行分支合併,把dev分支的內容合併到master分支上(經過首先切換到master分支,git branch master,而後合併git merge dev命令完成)。其內部的原理,其實就是先把HEAD指針指向master,再把master指針指向如今的dev指針指向的內容。以下圖。

五、當合並分支的時候出現衝突(confict),好比在dev分支上commit了一個文件file1,同時在master分支上也提交了該文件file1,修改的地方不一樣(好比都修改了同一個語句),那麼合併的時候就有可能出現衝突,以下圖所示。

這時候執行git merge dev命令,git會默認執行合併,可是要手動解決下衝突,而後在master上git add而且git commit,如今git分支的結構以下圖。

可使用以下命令查看分支合併狀況。

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git log --graph --pretty=oneline --abbrev-commit  

 

六、合併完成後,就能夠刪除掉dev分支(經過git branch -d dev命令完成)。

 

如此,就是分支開發的原理。其好處也是顯而易見的。

 

分支策略

如何合適地使用分支?

在實際開發中,咱們應該按照幾個基本原則進行分支管理:
一、master分支應該是很是穩定的,也就是僅用來發布新版本,平時不要在master分支上編碼開發。master分支應該與遠程倉庫保持同步
二、日常編碼開發都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,好比1.0版本發佈時,再把dev分支合併到master上,在master分支發佈1.0版本;dev分支也應該與遠程保持同步;(git push/git pull也要解決衝突)
三、你和團隊成員每一個人都在本地的dev分支上幹活,每一個人都有本身的分支,時不時地往遠程dev分支上push/pull就能夠了。(push/pull的時候是要解決衝突的.

上面這個圖是大體示意圖,其實上面這個圖是省略了git push/git pull操做的,好比bob在本地dev分支上,新建了一個feature1分支幹完活,在本地的dev分支上合併了feature1分支,而後要把dev分支push到公共服務器上,這樣michael才能pull下來bob完成的內容。更詳細一點的圖以下:

PS:git本沒有公共服務器的概念,git的每一個節點都是一個完整的git庫,可是公共服務器是方便了git節點之間的代碼互相push/pull(要否則每一個git節點都須要互相鏈接,每增長一個git節點就要鏈接其餘的git節點)。以下圖所示:

        

        有公共服務器的結構                             無公共服務器的結構

有公共服務器的,增長tom節點時候,只須要tom和公共服務器相鏈接,tom就能夠取得(pull)michael提交(push,此處不是commit,commit是本地提交,沒有推送到公共服務器)的代碼,也能夠取得bob提交(push)的代碼。

若是沒有公共服務器,tom要想取得(pull)michael的代碼,則必須在tom和michael之間創建一個網絡鏈接; 要想取得(pull)bob的代碼,必須在tom和bob之間創建一個網絡鏈接。

 

 

git安裝

 

linux上的安裝

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. yum install git  



 

windows上的安裝

http://git-scm.com/download/win

下載安裝便可。

 

安裝完成後,還須要最後一步設置,在命令行輸入:

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git config --global user.name "Your Name"  
  2. git config --global user.email "email@example.com"  

 

由於git是分佈式版本控制系統,因此,每一個機器都必須自報家門:你的名字和Email地址。注意git config命令的--global參數,用了這個參數,表示你這臺機器上全部的git倉庫都會使用這個配置,固然也能夠對某個倉庫指定不一樣的用戶名和Email地址。而後在本機會生成一個.gitconfig文件,裏面包含了user.name和user.email的信息。

WINDOWS下須要再添加一個配置,以下:

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git config --global core.autocrlf false  

若是沒有加這個配置,在後續git操做的時候可能會報warning,以下:

 

這是由於在windows中的換行符爲CRLF(\r\n), 而在linux下的換行符爲:LF(\n)。
使用git來生成一個工程後,文件中的換行符爲LF,在windows中,執行git add file操做時,系統提示:LF將被轉換成CRLF。
CRLF -- Carriage-Return Line-Feed 回車換行,就是回車(CR,ASCII 13,\r) 換行(LF,ASCII 10,\n)。

 

git命令

 

git目錄最好都不要包含中文名。

 

單機操做命令/單倉庫命令

 

建立版本庫repository

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. mkdir git_repo  
  2. cd git_repo  
  3. git init  

會在目錄中生成.git文件夾,該文件夾就是git倉庫的管理文件,不要隨意改動裏面的內容。該文件夾默認是隱藏,ls命令看不到,用ls -ah命令能夠看到。

 

 

新建一個file1.txt文件,文件內容以下(隨意寫的):

[plain]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. This is file1.txt.  
  2. for test~~~  

 

把文件添加到代碼庫

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git add file1 file2...  
  2. git commit -m "comment"  

 

git add是把想要提交的文件先提交到commit緩存中;

git commit纔是真正的文件提交。

經過git add命令,就等因而把文件加入到git管理中,會有各類git信息跟蹤,好比代碼版本號,修改了哪裏等等。

 

查看代碼倉庫狀態

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git status  

假設我修改了file1.txt文件內容以下:

 

 

[plain]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. hello everybody!  
  2. This is an file1.txt.  
  3.   
  4. end file.  

而後用git status命令看一下:

 

上面的提示告訴咱們file1.txt被修改過了,可是尚未add到commit緩存中,即尚未準備提交(commit)

 

查看修改內容

雖然git status告訴咱們file1.txt被修改了,可是沒告訴咱們哪裏被修改,爲了具體查看文件什麼地方被修改,就使用以下命令:

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git diff file  

git diff命令要在git add命令以前使用,不然一旦添加到commit緩存後,git diff命令就失效了

 

 

 

經過git add後,再看git status狀態,就變成了準備提交(commit)的狀態了

隨後再git commit一下,就提交成功。

commit後,咱們再看看git status,以下:

上圖黃色框中說明當前目錄多了個less文件是沒有被git跟蹤管理的,這個是我不當心加入的文件,在此無用,能夠刪去。若是是你須要的文件,那麼就經過git add把它加入git管理。

刪去了less文件後,看git status,以下所示:

 

查看兩個版本之間的不一樣

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git diff 版本1 版本2 [文件]  

文件是可選的參數,不帶[文件]參數的是比較全部的不一樣修改:

 

帶[文件]參數的,你能夠只查看某個文件的不一樣:

 

查看commit歷史

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git log  

 

 

查看命令歷史

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git reflog  

 

 

版本回退

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git reset --hard HEAD^  
  2. git reset --hard HEAD@{4}  

先用git log或者git reflog看下歷史版本,而後用git reset 命令回退版本,以下:

 

git是用HEAD來表示當前分支中的當前版本,HEAD^表示上一個版本,HEAD^^表示上上一個版本,以此類推,若是要回退很早的版本就用HEAD@{版本號},版本號用git reflog查看。

 

撤銷修改

分3種狀況

場景1:當你改亂了工做區某個文件的內容,想直接丟棄工做區的修改時,用命令git checkout -- file 或者 手動修改。
場景2:當你不但改亂了工做區某個文件的內容,而且還添加到了暫存區(即已經git add了)時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操做。
場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,能夠用版本回退(參考版本回退一節),不過前提是沒有推送到遠程庫

 

下面舉例說明:

場景1

若是文件仍是在工做區中,尚未git add到暫存區,那麼撤銷修改有2種辦法:,以下:

第1種辦法:手動復原,把不想要的修改地方復原。(該方法能夠只修改文件的一部分)

第2種辦法:使用命令git checkout -- file。(這裏的 -- 很重要,後續的版本分支也是是用git checkout命令,它沒有 --

(該方法只能所有復原文件,由於git checkout -- file其實就是把版本庫中的file替換如今工做區的file

 

場景2

 

當你不但改亂了工做區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步驟。
第1步:用命令git reset HEAD file,就回到了場景1;
第2步:按場景1操做。

git reset HEAD file命令是把緩存區中的file文件刪去,對工做區後續作的修改並無影響,好比上面的例子,git add後又修改了文件的內容everybody->chenj_freedom,git reset HEAD file後,file的內容仍是chenj_freedom。

 

場景3

已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠程庫

 

刪除文件/誤刪除還原

從版本庫中刪除文件

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git rm file 或者 git add file  
  2. git commit  

 

誤刪除復原

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git checkout -- file  

 

git checkout -- file其實就是用版本庫中的file文件替換工做區的文件,因此不管工做區的file文件是被修改了仍是被刪除了,用這個命令均可以一鍵還原。

 

遠程倉庫命令

 

關聯遠程倉庫

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git remote add 遠程倉庫名 [url]  

 

舉例:

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git remote add origin git@github.com:chenj-freedom/learngit.git  

如上,origin是遠程倉庫的名字(注意:是倉庫的名字,倉庫中含有分支等信息)。

 

 

查看遠程倉庫

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git remote //查看遠程倉庫  
  2. git remote -v //查看遠程倉庫,更詳細信息  

以下圖:

 

fetch說明本地有提取遠程倉庫的權限,push說明本地有推送代碼到遠程倉庫的權限。

 

克隆遠程倉庫

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git clone [url]  

舉例:

 

git clone操做會自動爲你將遠程倉庫命名爲origin,並抓取遠程倉庫中的全部數據,創建一個指向它的master指針,在本地命名爲orgin/master,而後,git自動創建一個屬於你本身的本地master分支,始於origin上master分支相同的位置(master分支的關聯,這個也叫作跟蹤遠程分支),你能夠就此開始工做。

原理以下圖所示:

 

 

跟蹤遠程分支

 

從遠程分支checkout出來的本地分支,稱爲:跟蹤分支 (tracking branch)。跟蹤分支的本質就是使得本地分支名指向遠程分支名指向的內容(本質就是設置指針),如上一小節的圖,使得本地分支名(master)指向遠程分支名(origin/master)指向的節點。設置了跟蹤分支以後,使用git push/git pull命令就會自動使得本地分支(local-branch-name)自動push/pull遠程分支(remote-branch-name)的內容。

命令格式以下:

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git checkout -b [local-branch-name] [remote-name]/[remote-branch-name] //傳統格式  
  2. git checkout --track [remote-name]/[remote-branch-name] //簡化格式  

 

第一行的是傳統格式,第二行的是簡化格式,簡化格式中,本地分支名默認和遠程分支名相同。

舉例:假設遠程倉庫中如今有一個分支dev11。

用傳統格式跟蹤分支後,設置本地分支名和遠程分支名相同時,用命令git remote show origin命令查看。這時候,git push配置爲把本地dev11分支推送到遠程dev11分支,本地master分支推送到遠程master分支;git pull命令配置爲遠程dev11分支合併到本地dev11分支,遠程master分支合併到本地master分支。

可是假如用傳統方式,設置本地分支名和遠程分支名不相同時,用命令git remote show origin命令查看。git pull命令仍是2個分支(master和dev11)都能拉取併合併到本地對應的分支,可是push命令就只有master分支能推送了。所以:最好是配置本地分支名和遠程分支名同樣。(因此直接用--track就默認本地分支名和遠程分支名同樣)

 

推送內容

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git push [remote-name] [local-branch-name]:[remote-branch-name]  

注意:

一、該命令其中local-branch-name或者remote-branch-name是能夠兩者省略其一。

二、只有在遠程服務器上有寫權限,或者同一時刻沒有其餘人在推數據,這條命令纔會如期完成任務。若是在你推數據前,已經有其餘人推送了若干更新,那你的推送操做就會被駁回。你必須先把他們的更新抓取(git pull)到本地,合併到本身的項目中,而後才能夠再次推送。

舉例:git push origin master

這裏git自動把master擴展成了refs/heads/master:refs/heads/master,意爲「取出我在本地的master分支,推送到遠程倉庫的master分支中去」。

若想把遠程的master分支叫作other分支,可使用git push origin master:other。

 

 

抓取內容

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git fetch [remote-name] //抓取遠程倉庫的所有內容,可是不會自動合併  
  2. git pull //抓取遠程倉庫跟蹤分支的內容,並自動合併到本地相應的分支  

git pull是你在本地的哪一個分支使用本命令,它會自動抓取本地這個分支所跟蹤的遠程分支的內容,而後合併到本地分支上,對其餘分支不會抓取內容。

舉例1:git fetch origin

 

此命令會到遠程倉庫中拉取全部你本地倉庫中尚未的數據。運行完成後,你就能夠在本地訪問該遠程倉庫中的全部分支。

git fetch會抓取從你上次克隆以來別人上傳到此遠程倉庫中的全部更新(或是上次fetch以來別人提交的更新)。有一點很重要,須要記住,git fetch命令只是將遠端的數據拉到本地倉庫,並不自動合併到當前工做分支,須要你本身手工合併。以下圖所示:

在本地新建一個git_repo文件夾,不經過git clone命令來克隆一個遠程庫,而是經過git remote add關聯遠程庫,並用git fetch來抓取遠程庫的全部未抓取過的數據,當抓取下來以後,必須手動合併git merge遠程庫的內容,纔會顯示出分支內容,不然,沒有手動合併,git fetch是不會自動合併的。

 

舉例2:git pull

實驗前提:在github頁面上,dev11分支建立一個新文件remote_file.txt,在master分支建立新文件master_remote_file.txt。而且用git checkout -b跟蹤遠程分支dev11和master了。接下來用git pull命令(注意:是在本地dev11分支上使用git pull命令,因此會抓取dev11分支跟蹤的遠程分支的內容,併合併到本地dev11分支上。

可是這時候master分支的內容仍是沒有改變。以下:

 

 

刪除遠程分支

即刪除遠程倉庫中的分支。

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git push [remote-name] :[remote-branch-name]  


還記得git push命令嗎?git push [remote-name] [local-branch-name]:[remote-branch-name],把本地分支設置爲空(冒號以前的內容),就相對於把一個空分支推送到遠程倉庫中的remote-branch-name分支去了,就至關於刪除了遠程倉庫中的該分支。

 

舉例:

 

刪除遠程倉庫本地關聯

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git remote rm [remote-name]  

舉例:git remote rm origin

 

刪除遠程分支本地關聯

刪除遠程分支關聯也即刪除本地跟蹤分支。

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git branch -d [local-branch-name]  

和刪除本地分支同樣的命令。

 

 

 

分支管理命令

 

建立、切換、查看分支

假設dev是要建立分支名字。

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git branch //查看分支  
  2. git branch dev //建立分支  
  3. git checkout dev //切換分支  
  4. git checkout -b dev //建立並切換分支  

 

 

合併分支

假設dev是要建立分支名字。

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git merge --no-ff -m "commit comment" dev //禁用Fast forward模式合併分支  
  2. git merge dev //Fast forward模式合併分支  

在Fast forward模式下,當刪除分支後,會丟掉分支信息。

 

 

刪除分支

假設dev是要建立分支名字。

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git branch -d dev  
  2. git branch -D dev //強行刪除掉還未合併的分支  

 

 

bug分支

因爲git的分支功能強大,因此修改bug通常也是新建一個bug分支,修改後,合併到你的工做分支(master分支或者dev分支或者其餘),再刪除bug分支。

假設場景,當你正在dev分支上編碼工做,忽然接到一個須要緊急修復的bug,你應該會想創建一個bug分支,可是你dev的工做尚未提交(不管是add或者commit),這時候可使用「存儲工做現場」命令,以下:

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git stash //存儲工做現場,對working directory來講  

而後首先肯定要在哪一個分支上去解決bug,好比我想要在master分支上解決bug,就先切換到master分支,而後從master分支上建立一個bug分支。(固然你也能夠從別的分支上解決bug,好比dev分支上解決bug)。解決bug後合併到工做分支(就是你從哪一個分支建立bug分支的那個分支)。

注意:git stash是針對工做區(working directory)來講的,對緩存區無效。因此再切換到bug分支的時候,緩存區的內容要先commit一下,要否則bug解決後,切換回工做分支,緩存區的內容就丟失了,git stash只存儲工做區現場的內容。

 

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git checkout master //先切換到master分支  
  2. git checkout -b bug //建立bug分支,並切換到bug分支上  
  3. ... //解決bug  
  4. git add . //在bug分支上add  
  5. git commit -m "fix bug" //在bug分支上commit  
  6. git checkout master //切換回master分支  
  7. git merge --no-ff bug //在master分支上合併bug分支  
  8. git branch -d bug //刪除bug分支  

如今bug解決了,要回到原來dev上的工做,但是時間過久了,忘記了。那麼能夠用一下命令查看工做現場列表。

 

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git stash list //查看工做現場列表  

 

能夠看出來工做現場保存的是dev分支上的現場。因此要先切換回dev分支,在恢復工做現場。若是沒有先切換到dev分支,好比在master分支就去恢復工做現場,那麼會執行合併dev分支的操做

恢復工做現場的命令,以下:

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git stash apply //恢復工做現場  
  2. git stash drop //刪除工做現場列表中的對應項  

或者直接

 

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git stash pop //恢復工做現場並刪除工做現場列表中的對應項  

 

自定義git命令

 

忽略特殊文件

問題提出

有些時候,你必須把某些文件放到Git工做目錄中,但又不能提交它們,好比保存了數據庫密碼的配置文件啦,等等,每次git status都會顯示Untracked files ...,這樣顯示對於用戶很不友好,應該怎麼辦?

回答

step1:使用.gitignore文件,而後把要忽略的文件名填進去,git就會自動忽略這些文件。
step2:把.gitignore文件加入到git倉庫(目錄)中。

忽略文件的原則是:
一、忽略操做系統自動生成的文件,好比縮略圖等;
二、忽略編譯生成的中間文件、可執行文件等;
三、忽略你本身的帶有敏感信息的配置文件,好比存放口令的配置文件。

在github裏有一些.gitignore文件的例子,網址:https://github.com/github/gitignore

舉個例子:

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. # Compiled Object files  
  2. *.slo  
  3. *.lo  
  4. *.o  
  5. *.obj  
  6.   
  7. # Precompiled Headers  
  8. *.gch  
  9. *.pch  
  10.   
  11. # Compiled Dynamic libraries  
  12. *.so  
  13. *.dylib  
  14. *.dll  

 

 

配置git命令

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git config //不帶global參數的是對當前倉庫進行配置(當前倉庫)  
  2. git config --global  //帶global參數的是對本地全部倉庫的配置(當前用戶)  

 

當前倉庫的git配置文件放在.git/config文件;
當前用戶的git配置文件放在用戶主目錄下的一個隱藏文件.gitconfig。

 

搭建本身的git服務器

github託管私有項目是要收費的,因此可能會有搭建本身的git服務器的需求,具體不詳述,直接參考網址:點擊這裏

日常開源的我就用github,閉源的能夠用git@OSC(開源中國的代碼託管平臺,私有倉庫也免費)

 

Github使用

 

帳號設置

 

本地Git倉庫和GitHub倉庫之間的傳輸是經過SSH加密的。

爲什麼GitHub須要SSH Key呢?由於GitHub須要識別出你推送的提交確實是你推送的,而不是別人冒充的,而Git支持SSH協議,因此,GitHub只要知道了你的公鑰,就能夠確認只有你本身才能推送。
固然,GitHub容許你添加多個Key。假定你有若干電腦,你一下子在公司提交,一下子在家裏提交,只要把每臺電腦的Key都添加到GitHub,就能夠在每臺電腦上往GitHub推送了。

 

step1:建立github帳號。(我這裏的帳號是chenj-freedom,後續文章會使用到)

step2:建立SSH key。

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. ssh-keygen -t rsa -C "chenj_freedom@qq.com"  

使用上面的命令建立SSH key(把郵箱換成你本身的郵箱)。命令中會要求你設置ssh key生成的路徑,設置密碼(passphrase)等等,命令執行完畢後,會在你設置的路徑中生成.ssh目錄,裏面含有id_rsa(私鑰)文件和id_rsa.pub文件(公鑰)。私鑰文件不能外泄,公鑰文件能夠公開

 

這個生成的key是針對每一臺電腦的,每一個機器根據郵箱名字來識別用戶的

step3:登錄github網站,設置公鑰。
打開"Account settings"->"SSH Keys"頁面,而後點擊"Add SSH Key",在Key文本框中粘貼id_rsa.pub公鑰文件的內容,點擊"Add Key",就能夠看到剛添加的key了。

>>>

 

把本地庫推送到github遠程庫

 

step1:登錄github,點擊"Create a new repo"。
填入倉庫名字(最好和本地庫名字同樣),其餘保持默認,建立一個新的代碼倉庫。建立完畢後,會顯示以下提示:

github上的倉庫有https和ssh兩種鏈接方式,都是OK的。

 

step2:把本地庫推送到github遠程庫上(關聯)。

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git remote add origin git@server-name:path/repo-name.git //關聯遠程庫  
  2. git push -u origin master //第一次推送master分支內容,-u參數指定遠程庫所在的服務器爲默認服務器,在此例即爲github服務器  
  3. git push origin master //後續推送master分支內容不須要帶參數-u  

 

說明:

一、git remote add命令就是把git@server-name:path/repo-name.git和origin關聯起來origin的名字是你本身能夠隨意取的。

二、git push origin master,就是把master分支推送到遠程的origin上,也就是推送到git@server-name:path/repo-name.git倉庫中。

三、git push origin master,這裏也能夠不推送master分支,能夠推送其餘分支。

關聯遠程庫後,能夠用git remote -v命令查看,以下:

 

根據step1中圖上面的提示,你能夠create a new repository on the command line或者push an existing repository from the command line或者import code from another repository,咱們根據第二種提示來把本地庫關聯到github遠程庫上(推送)。

推送成功後,能夠看到github頁面中顯示的遠程庫和本地是同樣的了。

 

從github遠程庫克隆到本地庫

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. git clone git@github.com:chenj-freedom/git_repo.git  

 

github原理應用

 

好比A有一個開源項目託管在github上,地址是git@github.com:A/git_A.git。帳戶A對該地址的遠程倉庫是有讀/寫的權限的,可是其餘帳戶,好比帳戶B和帳戶C對git@github.com:A/git_A.git只有讀的權限,可是沒有寫的權限。(這是github這個平臺幫咱們設置的git服務器的權限,每一個帳戶只能對本身帳戶下的遠程倉庫讀/寫,對其餘帳戶邊的遠程倉庫只有讀權限,沒有寫權限

其餘帳戶(好比帳戶B)要讀git@github.com:A/git_A.git的倉庫,能夠在github網站上進行fork操做,就會克隆一個git_A倉庫到本身的帳戶下,而後本地對本身帳戶下的這個git_A倉庫是有讀/寫的權限的。

當想把本身的代碼貢獻給帳戶A,那麼在github網站上進行pull request操做便可,至於帳戶A是否願意接受你的代碼,那是由帳戶A決定的。

 

推薦相關git教程

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000( 此教程更爲詳細):

http://git.oschina.net/progit/

http://www.yiibai.com/git/home.html

參考連接:http://blog.csdn.net/chenj_freedom/article/details/50543152

相關文章
相關標籤/搜索