1.Git的綜述
SVN是集中式版本控制系統,版本庫集中放在中央服務器上,而干活時用的都是自己的電腦,所以首先要從中央服務器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服務器。集中式版本控制系統是必須聯網才能工作。
Git則是分布式版本控制系統,即它就沒有中央服務器,每個人的電腦就有一個屬於自己的版本庫,這樣,工作的時候就不需要聯網了,因為版本都是在自己的電腦上。最終,各自將本地分支先合並,再將合並后的分支推向同名的遠程庫。
Git和GitHub的區別:Git是分布式版本管理工具,而GitHub是一個網站,可以在github上建立一個網上倉庫,然后提交自己的代碼到該網上倉庫,這樣你的每次提交,別人也都可以看到你的代碼,同時別人也可以幫你修改你的代碼,這種開源的方式非常方便程序員之間的交流和學習。
GitHub是一個非常適合程序員交流的網站,很多國際上的技術大牛都在github上有自己的開源代碼,其他人只要申請個賬號就可以隨意的看到這些大牛寫的程序。同時國內的很多互聯網公司如百度,阿里等也在github上公布有開源的代碼。
工作區、本地庫、遠程庫三者之間的工作原理及流程如下圖:
2.Git本地庫管理
2.1.Git的分支管理策略
Git之所以能實現分布式版本控制,就是基於其分支管理策略。本地庫所做的操作都是在某分支上進行的,不同分支之間可以合並。可以拉取遠程分支到本地,也可以推送本地分支到遠程。
git branch <branchName> #創建新的分支
git branch -d <branchName> #刪除已有分支
git checkout <branchName> #切換到其它分支上
git merge <branchName> #合並branchName分支到當前分支上
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.2.提交文件到當前分支
工作區、暫存區以及版本庫三者之間的關系。
工作區:就是你在電腦上看到的目錄,比如目錄testgit下的所有文件(.git版本庫目錄除外)。或者以后需要再新建的目錄文件等等都屬於工作區范疇。
暫存區(stage):工作區有一個.git隱藏目錄,這個不屬於工作區,這是版本庫。其中版本庫里面存了很多東西,其中最重要的就是stage(暫存區),還有就是Git為我們自動創建的第一個master分支。
在Git中每次提交都分為兩個步驟:
第一步:用add命令將文件添加到版本庫的暫存區
第二步:用commit命令把暫存區的所有內容提交到當前分支上
3.本地庫與遠程庫之間同步
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.拉取遠程分支到本地並建立關聯
語法:
git checkout -b 本地分支名 origin/遠程分支名
這個將會自動創建一個新的本地分支,並與指定的遠程分支關聯起來。
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時,若省略冒號前的來源分支(即本地分支)則表示刪除冒號后的遠程分支。