【Git版本控制】Git使用教程

1.Git的綜述

 SVN是集中式版本控制系統,版本庫集中放在中央服務器上,而幹活時用的都是本身的電腦,因此首先要從中央服務器哪裏獲得最新的版本,而後幹活,幹完後,須要把本身作完的活推送到中央服務器。集中式版本控制系統是必須聯網才能工做。jquery

 Git則是分佈式版本控制系統,即它就沒有中央服務器,每一個人的電腦就有一個屬於本身的版本庫,這樣,工做的時候就不須要聯網了,由於版本都是在本身的電腦上。最終,各自將本地分支先合併,再將合併後的分支推向同名的遠程庫。git

Git和GitHub的區別:Git是分佈式版本管理工具,而GitHub是一個網站,能夠在github上創建一個網上倉庫,而後提交本身的代碼到該網上倉庫,這樣你的每次提交,別人也均可以看到你的代碼,同時別人也能夠幫你修改你的代碼,這種開源的方式很是方便程序員之間的交流和學習。程序員

GitHub是一個很是適合程序員交流的網站,不少國際上的技術大牛都在github上有本身的開源代碼,其餘人只要申請個帳號就能夠隨意的看到這些大牛寫的程序。同時國內的不少互聯網公司如百度,阿里等也在github上公佈有開源的代碼。 github

工做區、本地庫、遠程庫三者之間的工做原理及流程以下圖:windows

2.Git本地庫管理

2.1.Git的分支管理策略

Git之因此能實現分佈式版本控制,就是基於其分支管理策略。本地庫所作的操做都是在某分支上進行的,不一樣分支之間能夠合併。能夠拉取遠程分支到本地,也能夠推送本地分支到遠程。bash

git branch <branchName> #建立新的分支服務器

git branch -d <branchName> #刪除已有分支ssh

git checkout <branchName> #切換到其它分支上分佈式

git merge <branchName> #合併branchName分支到當前分支上工具

git branch #查看當前分支

git branch -r #查看遠程分支

git branch -a #查看遠程及本地的全部分支,當前分支前加"*"號

2.1.1.主分支master

Git的分支管理策略中,代碼庫應該有且僅有一個穩定的主分支,一般是默認的master分支。主分支上不作開發,僅用做發佈新版本,故主分支也叫作版本分支。

2.1.2.開發分支develop

一般,開發應在另外一個develop分支上完成。若是想正式對外發布,就在master分支上對develop分支進行"合併"(merge)。

#從master上分出一個develop分支

git checkout -b develop master 

#將develop分支合併到master分支的命令以下兩個:

#切換到master分支

git checkout master

#對develop分支進行合併

git merge --no-ff develop

【注】git checkout -b <newBranch> <originalBranch>命令從原有分支originalBranch上分出一個新分支newBranch,並切換到該分支上。

默認狀況下,Git執行"快進式合併"(fast-farward merge),會直接將master分支指向develop分支。使用--no-ff參數後,會執行正常合併,在master分支上生成一個新節點,這能夠清晰地保留版本演進過程。

2.1.3.臨時性分支

前面講到版本庫的兩條主要分支:master和develop。前者用於發佈新版本,後者用於平常開發。其實,常設分支只須要這兩條就夠了,不須要其餘了。
可是,除了常設分支之外,還有一些臨時性分支,用於應對一些特定目的的版本開發。臨時性分支主要有三種:

1)功能(feature)分支

2)預發佈(release)分支

3)修補bug(fixbug)分支

這三種分支都屬於臨時性須要,使用完之後應該刪除,使得代碼庫的常設分支始終只有master和develop。

1)功能(feature)分支:它是爲了開發某種特定功能,從develop分支上面分出來的。開發完成後,要再併入develop。

功能分支的名字,能夠採用feature-*的形式命名。

建立一個功能分支:

# git checkout -b feature-x develop

開發完成後,將功能分支合併到develop分支:

# git checkout develop

# git merge --no-ff feature-x

刪除feature分支:

# git branch -d feature-x

2)預發佈(release)分支:它是指發佈正式版本以前(即合併到master分支以前),咱們可能須要有一個預發佈的版本進行測試。預發佈分支是從develop分支上面分出來的,預發佈結束之後,必須合併進develop和master分支。它的命名,能夠採用release-*的形式。

建立一個預發佈分支:

# git checkout -b release-1.2 develop

確認沒有問題後,合併到master分支:

# git checkout master

# git merge --no-ff release-1.2

對合並生成的新節點,作一個標籤

# git tag -a 1.2

再合併到develop分支:

# git checkout develop

# git merge --no-ff release-1.2

最後,刪除預發佈分支:

# git branch -d release-1.2

3)修補bug(fixbug)分支:軟件正式發佈之後,不免會出現bug。這時就須要建立一個分支,進行bug修補。修補bug分支是從master分支上面分出來的。修補結束之後,再合併進master和develop分支。它的命名,能夠採用fixbug-*的形式。

建立一個修補bug分支:

# git checkout -b fixbug-0.1 master

修補結束後,合併到master分支:

# git checkout master

# git merge --no-ff fixbug-0.1

# git tag -a 0.1.1

再合併到develop分支:

# git checkout develop

# git merge --no-ff fixbug-0.1

最後,刪除"修補bug分支":

# git branch -d fixbug-0.1

2.2.提交文件到當前分支

工做區、暫存區以及版本庫三者之間的關係。

工做區:就是你在電腦上看到的目錄,好比目錄testgit下的全部文件(.git版本庫目錄除外)。或者之後須要再新建的目錄文件等等都屬於工做區範疇。

暫存區(stage):工做區有一個.git隱藏目錄,這個不屬於工做區,這是版本庫。其中版本庫裏面存了不少東西,其中最重要的就是stage(暫存區),還有就是Git爲咱們自動建立的第一個master分支。

在Git中每次提交都分爲兩個步驟:

第一步:用add命令將文件添加到版本庫的暫存區

第二步:用commit命令把暫存區的全部內容提交到當前分支上

2.3.撤銷工做區中某文件的修改

case1:若已知待撤銷的內容,直接手動更改待撤銷的文件,而後從新add到暫存區,最後再commit到當前分支。

case2:文件添加到暫存區後又作了修改,撤銷修改回到添加暫存區時的狀態。使用git checkout –fileName撤銷工做區的修改,實例:

git checkout —readme.txt

【注】命令git checkout -readme.txt 中的"-"很重要,若是沒有"-"的話,該命令是切換分支命令。

case3:撤銷已提交到當前分支的修改

使用reset版本回退命令回退到上一個版本,以達到撤銷修改的目的。具體操做以下:

使用git log或git reflog命令查看版本日誌,再用git reset --hard 版本號命令回退到上一版本便可(或者經過git reset --hard HEAD^直接回退到上一版本)。實例:

git reset --hard 6fcfc89回退到上一版本

3.GitHub上的遠程庫與本地庫之間的同步

3.1.GitHub上進行SSH認證

因爲本地Git倉庫和GitHub倉庫之間的傳輸是經過SSH加密的,因此必需要讓github倉庫認證你的SSH key,在此以前,必需要生成SSH key。

第一步:生成SSH Key

在windows下查看[c盤->用戶->本身的用戶名->.ssh]下是否有id_rsa、id_rsa.pub文件,若是沒有須要手動生成。打開git bash,在控制檯中輸入如下命令:$ ssh-keygen -t rsa -C youremail

 參數-t用於指定密鑰類型,若未指定則默認生成用於SSH-2的RSA密鑰,這裏使用的是rsa。

參數-C用來指定對該密鑰的註釋,方便用戶標識這個密鑰,指出密鑰的用途或其它的信息,這裏通常輸入在GitHub上註冊時填的郵箱做爲該密鑰的標識。 

第二步:登陸github,打開setting->SSH keys,點擊右上角New SSH key,把公鑰id_rsa.pub的所有內容放進key輸入框,再爲當前的key起一個title來標識每一個key。

3.2.由遠程庫向本地庫同步

由遠程庫向本地庫同步時遠程庫充當的是來源,本地庫充當的是去向。

3.2.1.clone命令克隆遠程庫到本地

$ git clone <遠程庫的網址>

$ git clone <版本庫的網址> <本地庫目錄名>

$ git clone –o 遠程主機名 <版本庫的網址> <本地庫目錄名>

注:該命令會在當前目錄生成一個新目錄,與遠程主機的版本庫同名。若是要指定不一樣的目錄名,能夠將目錄名做爲git clone命令的第二個參數。並在克隆的時候將遠程主機默認命名爲origin,若是想用其它的遠程主機名,須要用git clone命令的-o選項指定。實例:

$ git clone -o jQuery https://github.com/jquery/jquery.git

3.2.2.fetch命令獲取遠程分支到本地

一旦遠程版本庫有了更新(Git術語叫作commit),咱們須要將這些更新取回到本地。這時就要用到git fetch命令,獲取遠程分支到本地,並以遠程主機名/分支名命名。獲取的遠程分支不會與本地分支進行合併,故對本地代碼無影響。默認狀況下git fetch命令獲取遠程全部分支(branch)。若是隻想獲取特定的分支,則能夠指定分支名。

語法:

#將遠程主機上的更新所有取回到本地。

$ git fetch <遠程主機名>

#取回origin主機的master分支到本地

$ git fetch <遠程主機名> <分支名>

【注】fetch從遠程所取回的分支在本地是以"遠程主機名/分支名"的形式命名。好比origin主機的master分支,就要用origin/master讀取。

git branch命令的-r選項,能夠用來查看遠程分支,-a選項查看全部分支。

$ git branch -r

origin/master

$ git branch -a

* master

remotes/origin/master

3.2.3.pull命令拉取遠程分支並與本地分支合併

git pull命令先拉取遠程分支到本地,再與本地指定的分支合併。

語法:$ git pull <遠程主機名> <遠程分支名>:<本地分支名>

實例:$ git pull origin next:master

若是是將遠程分支與本地當前分支合併,則冒號後面的目的分支可省略。

實例:$ git pull origin next

上面命令表示取回origin/next分支,再與當前分支合併。實質上,這等同於先作git fetch,再作git merge。

$ git fetch origin

$ git merge origin/next

【注】1.從遠程fetch到的分支在本地都是以"遠程主機名/分支名"表示的。

2.若是遠程主機刪除了本地所關聯的分支,git pull在拉取遠程分支時不會刪除所關聯的本地分支。這是爲了不,因爲其餘人刪除了遠程主機的分支,致使git pull時不知不覺刪除了與本地關聯的分支。

3.從遠程克隆倉庫到本地時默認給遠程主機命名爲origin,能夠經過選項-o來指定遠程主機名。

3.3.由本地向遠程同步

3.3.1.remote命令管理遠程主機名

爲了便於管理,Git要求每一個遠程主機都必須指定一個主機名。git remote命令就是用於管理遠程主機名的,這包括對遠程主機名的增、刪、改、查操做。

添加遠程主機

語法:$ git remote add <遠程主機名> <網址>

刪除遠程主機

語法:$ git remote rm <遠程主機名>

修改遠程主機名

語法:$ git remote rename <原主機名> <新主機名>

查詢遠程主機

查詢全部與本地庫關聯的遠程主機名

語法:$ git remote

查詢全部與本地庫關聯的遠程主機名及其地址

語法:$ git remote –v

實例:

origin git@github.com:jquery/jquery.git (fetch)

origin git@github.com:jquery/jquery.git (push)

查看某遠程主機的詳細信息

語法:$ git remote show <遠程主機名>

3.3.2.push命令將本地分支推送到遠程主機上

當本地分支有了更新,就須要將其推送到遠程與之關聯的分支上

語法:$ git push <遠程主機名> <本地分支名>:<遠程分支名>

若是略去了冒號後的遠程分支名,則表示將本地分支推送到遠程與之關聯的分支上;若該遠程分支不存在,則會在遠程主機新建該分支;若省略本地分支名,則表示刪除指定的遠程分支。

實例:

#推送master分支到origin主機的master分支上

$ git push origin master

#本地分支爲空,表示刪除遠程的master分支

$ git push origin :master

# 等同於

$ git push origin --delete master

【注】1.從遠程向本地拉取時遠程分支是來源,由本地向遠程推送時本地分支是來源

2.由遠程向本地拉取時,若省略冒號前的來源分支(即遠程分支)則表示拉取與當前分支關聯的遠程分支進行合併;若省略冒號後的目的分支(即本地分支),則視當前分支爲目的分支。可是,由本地向遠程push時,若省略冒號前的來源分支(即本地分支)則表示刪除冒號後的遠程分支。

相關文章
相關標籤/搜索