本系列教程來自廖雪峰的官方網(wǎng)站,現(xiàn)在搬運(yùn)過來,目的幫助自己和小白學(xué)習(xí)收藏!
附贈:常用git命令清單
到目前為止锌订,我們已經(jīng)掌握了如何在Git倉庫里對一個文件進(jìn)行時(shí)光穿梭投队,你再也不用擔(dān)心文件備份或者丟失的問題了。
可是有用過集中式版本控制系統(tǒng)SVN的童鞋會站出來說幌氮,這些功能在SVN里早就有了吉拳,沒看出Git有什么特別的地方。
沒錯朴肺,如果只是在一個倉庫里管理文件歷史,Git和SVN真沒啥區(qū)別坚洽。為了保證你現(xiàn)在所學(xué)的Git物超所值宇挫,將來絕對不會后悔,同時(shí)為了打擊已經(jīng)不幸學(xué)了SVN的童鞋酪术,本章開始介紹Git的殺手級功能之一(注意是之一器瘪,也就是后面還有之二翠储,之三……):遠(yuǎn)程倉庫。
Git是分布式版本控制系統(tǒng)橡疼,同一個Git倉庫援所,可以分布到不同的機(jī)器上。怎么分布呢欣除?最早住拭,肯定只有一臺機(jī)器有一個原始版本庫,此后历帚,別的機(jī)器可以“克隆”這個原始版本庫滔岳,而且每臺機(jī)器的版本庫其實(shí)都是一樣的,并沒有主次之分挽牢。
你肯定會想谱煤,至少需要兩臺機(jī)器才能玩遠(yuǎn)程庫不是?但是我只有一臺電腦禽拔,怎么玩刘离?
其實(shí)一臺電腦上也是可以克隆多個版本庫的,只要不在同一個目錄下睹栖。不過硫惕,現(xiàn)實(shí)生活中是不會有人這么傻的在一臺電腦上搞幾個遠(yuǎn)程庫玩,因?yàn)橐慌_電腦上搞幾個遠(yuǎn)程庫完全沒有意義野来,而且硬盤掛了會導(dǎo)致所有庫都掛掉恼除,所以我也不告訴你在一臺電腦上怎么克隆多個倉庫。
實(shí)際情況往往是這樣曼氛,找一臺電腦充當(dāng)服務(wù)器的角色豁辉,每天24小時(shí)開機(jī),其他每個人都從這個“服務(wù)器”倉庫克隆一份到自己的電腦上搪锣,并且各自把各自的提交推送到服務(wù)器倉庫里,也從服務(wù)器倉庫中拉取別人的提交彩掐。
完全可以自己搭建一臺運(yùn)行Git的服務(wù)器构舟,不過現(xiàn)階段,為了學(xué)Git先搭個服務(wù)器絕對是小題大作堵幽。好在這個世界上有個叫GitHub的神奇的網(wǎng)站狗超,從名字就可以看出,這個網(wǎng)站就是提供Git倉庫托管服務(wù)的朴下,所以努咐,只要注冊一個GitHub賬號,就可以免費(fèi)獲得Git遠(yuǎn)程倉庫殴胧。
在繼續(xù)閱讀后續(xù)內(nèi)容前渗稍,請自行注冊GitHub賬號佩迟。由于你的本地Git倉庫和GitHub倉庫之間的傳輸是通過SSH加密的,所以竿屹,需要一點(diǎn)設(shè)置:
第1步:創(chuàng)建SSH Key报强。在用戶主目錄下,看看有沒有.ssh
目錄拱燃,如果有秉溉,再看看這個目錄下有沒有id_rsa
和id_rsa.pub
這兩個文件,如果已經(jīng)有了碗誉,可直接跳到下一步召嘶。如果沒有,打開Shell(Windows下打開Git Bash)哮缺,創(chuàng)建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
你需要把郵件地址換成你自己的郵件地址弄跌,然后一路回車,使用默認(rèn)值即可蝴蜓,由于這個Key也不是用于軍事目的碟绑,所以也無需設(shè)置密碼。
如果一切順利的話茎匠,可以在用戶主目錄里找到.ssh
目錄格仲,里面有id_rsa
和id_rsa.pub
兩個文件,這兩個就是SSH Key的秘鑰對诵冒,id_rsa
是私鑰凯肋,不能泄露出去,id_rsa.pub
是公鑰汽馋,可以放心地告訴任何人侮东。
第2步:登陸GitHub,打開“Account settings”豹芯,“SSH Keys”頁面:
然后悄雅,點(diǎn)“Add SSH Key”,填上任意Title铁蹈,在Key文本框里粘貼id_rsa.pub文件的內(nèi)容:
點(diǎn)“Add Key”宽闲,你就應(yīng)該看到已經(jīng)添加的Key:
為什么GitHub需要SSH Key呢?因?yàn)镚itHub需要識別出你推送的提交確實(shí)是你推送的握牧,而不是別人冒充的容诬,而Git支持SSH協(xié)議,所以沿腰,GitHub只要知道了你的公鑰览徒,就可以確認(rèn)只有你自己才能推送。
當(dāng)然颂龙,GitHub允許你添加多個Key习蓬。假定你有若干電腦纽什,你一會兒在公司提交,一會兒在家里提交友雳,只要把每臺電腦的Key都添加到GitHub稿湿,就可以在每臺電腦上往GitHub推送了。
最后友情提示押赊,在GitHub上免費(fèi)托管的Git倉庫饺藤,任何人都可以看到喔(但只有你自己才能改)。所以流礁,不要把敏感信息放進(jìn)去涕俗。
如果你不想讓別人看到Git庫,有兩個辦法神帅,一個是交點(diǎn)保護(hù)費(fèi)再姑,讓GitHub把公開的倉庫變成私有的,這樣別人就看不見了(不可讀更不可寫)找御。另一個辦法是自己動手元镀,搭一個Git服務(wù)器,因?yàn)槭悄阕约旱腉it服務(wù)器霎桅,所以別人也是看不見的栖疑。這個方法我們后面會講到的,相當(dāng)簡單滔驶,公司內(nèi)部開發(fā)必備遇革。
確保你擁有一個GitHub賬號后,我們就即將開始遠(yuǎn)程倉庫的學(xué)習(xí)揭糕。
添加遠(yuǎn)程庫
現(xiàn)在的情景是萝快,你已經(jīng)在本地創(chuàng)建了一個Git倉庫后,又想在GitHub創(chuàng)建一個Git倉庫著角,并且讓這兩個倉庫進(jìn)行遠(yuǎn)程同步揪漩,這樣,GitHub上的倉庫既可以作為備份吏口,又可以讓其他人通過該倉庫來協(xié)作奄容,真是一舉多得。
首先锨侯,登陸GitHub嫩海,然后冬殃,在右上角找到“Create a new repo”按鈕囚痴,創(chuàng)建一個新的倉庫:
在Repository name填入learngit,其他保持默認(rèn)設(shè)置审葬,點(diǎn)擊“Create repository”按鈕深滚,就成功地創(chuàng)建了一個新的Git倉庫:
目前奕谭,在GitHub上的這個learngit倉庫還是空的,GitHub告訴我們痴荐,可以從這個倉庫克隆出新的倉庫血柳,也可以把一個已有的本地倉庫與之關(guān)聯(lián),然后生兆,把本地倉庫的內(nèi)容推送到GitHub倉庫难捌。
現(xiàn)在,我們根據(jù)GitHub的提示鸦难,在本地的learngit倉庫下運(yùn)行命令:
$ git remote add origin git@github.com:michaelliao/learngit.git
請千萬注意根吁,把上面的michaelliao
替換成你自己的GitHub賬戶名,否則合蔽,你在本地關(guān)聯(lián)的就是我的遠(yuǎn)程庫击敌,關(guān)聯(lián)沒有問題,但是你以后推送是推不上去的拴事,因?yàn)槟愕腟SH Key公鑰不在我的賬戶列表中沃斤。
添加后,遠(yuǎn)程庫的名字就是origin刃宵,這是Git默認(rèn)的叫法衡瓶,也可以改成別的,但是origin這個名字一看就知道是遠(yuǎn)程庫组去。
下一步鞍陨,就可以把本地庫的所有內(nèi)容推送到遠(yuǎn)程庫上:
$ git push -u origin master
Counting objects: 19, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (19/19), done.
Writing objects: 100% (19/19), 13.73 KiB, done.
Total 23 (delta 6), reused 0 (delta 0)
To git@github.com:michaelliao/learngit.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
把本地庫的內(nèi)容推送到遠(yuǎn)程,用git push
命令从隆,實(shí)際上是把當(dāng)前分支master
推送到遠(yuǎn)程诚撵。
由于遠(yuǎn)程庫是空的,我們第一次推送master
分支時(shí)键闺,加上了-u
參數(shù)寿烟,Git不但會把本地的master
分支內(nèi)容推送的遠(yuǎn)程新的master
分支,還會把本地的master
分支和遠(yuǎn)程的master
分支關(guān)聯(lián)起來辛燥,在以后的推送或者拉取時(shí)就可以簡化命令筛武。
推送成功后,可以立刻在GitHub頁面中看到遠(yuǎn)程庫的內(nèi)容已經(jīng)和本地一模一樣:
從現(xiàn)在起挎塌,只要本地作了提交徘六,就可以通過命令:
$ git push origin master
把本地master分支的最新修改推送至GitHub,現(xiàn)在榴都,你就擁有了真正的分布式版本庫待锈!
SSH警告
當(dāng)你第一次使用Git的clone
或者push
命令連接GitHub時(shí),會得到一個警告:
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?
這是因?yàn)镚it使用SSH連接嘴高,而SSH連接在第一次驗(yàn)證GitHub服務(wù)器的Key時(shí)竿音,需要你確認(rèn)GitHub的Key的指紋信息是否真的來自GitHub的服務(wù)器和屎,輸入yes
回車即可。
Git會輸出一個警告春瞬,告訴你已經(jīng)把GitHub的Key添加到本機(jī)的一個信任列表里了:
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
這個警告只會出現(xiàn)一次柴信,后面的操作就不會有任何警告了。
如果你實(shí)在擔(dān)心有人冒充GitHub服務(wù)器宽气,輸入yes
前可以對照GitHub的RSA Key的指紋信息是否與SSH連接給出的一致随常。
小結(jié)
要關(guān)聯(lián)一個遠(yuǎn)程庫,使用命令git remote add origin git@server-name:path/repo-name.git
萄涯;
關(guān)聯(lián)后线罕,使用命令git push -u origin master
第一次推送master
分支的所有內(nèi)容;
此后窃判,每次本地提交后钞楼,只要有必要,就可以使用命令git push origin master
推送最新修改袄琳;
分布式版本系統(tǒng)的最大好處之一是在本地工作完全不需要考慮遠(yuǎn)程庫的存在询件,也就是有沒有聯(lián)網(wǎng)都可以正常工作,而SVN在沒有聯(lián)網(wǎng)的時(shí)候是拒絕干活的唆樊!當(dāng)有網(wǎng)絡(luò)的時(shí)候宛琅,再把本地提交推送一下就完成了同步,真是太方便了逗旁!
從遠(yuǎn)程庫克隆
上次我們講了先有本地庫嘿辟,后有遠(yuǎn)程庫的時(shí)候,如何關(guān)聯(lián)遠(yuǎn)程庫片效。
現(xiàn)在红伦,假設(shè)我們從零開發(fā),那么最好的方式是先創(chuàng)建遠(yuǎn)程庫淀衣,然后昙读,從遠(yuǎn)程庫克隆。
首先膨桥,登陸GitHub蛮浑,創(chuàng)建一個新的倉庫,名字叫g(shù)itskills:
我們勾選Initialize this repository with a README只嚣,這樣GitHub會自動為我們創(chuàng)建一個
README.md
文件沮稚。創(chuàng)建完畢后,可以看到README.md文件:
現(xiàn)在册舞,遠(yuǎn)程庫已經(jīng)準(zhǔn)備好了蕴掏,下一步是用命令git clone克隆一個本地庫:
$ git clone git@github.com:michaelliao/gitskills.git
Cloning into 'gitskills'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
$ cd gitskills
$ ls
README.md
注意把Git庫的地址換成你自己的,然后進(jìn)入gitskills目錄看看,已經(jīng)有README.md文件了囚似。
視頻教程:http://github.liaoxuefeng.com/sinaweibopy/video/git-clone.mp4
如果有多個人協(xié)作開發(fā),那么每個人各自從遠(yuǎn)程克隆一份就可以了线得。
你也許還注意到饶唤,GitHub給出的地址不止一個,還可以用https://github.com/michaelliao/gitskills.git
這樣的地址贯钩。實(shí)際上募狂,Git支持多種協(xié)議,默認(rèn)的git://
使用ssh角雷,但也可以使用https
等其他協(xié)議祸穷。
使用https除了速度慢以外,還有個最大的麻煩是每次推送都必須輸入口令勺三,但是在某些只開放http端口的公司內(nèi)部就無法使用ssh協(xié)議而只能用https雷滚。
小結(jié)
要克隆一個倉庫,首先必須知道倉庫的地址吗坚,然后使用git clone
命令克隆祈远。
Git支持多種協(xié)議,包括https商源,但通過ssh支持的原生git協(xié)議速度最快车份。