第4節(jié):git與github
遠程倉庫
Git是分布式版本控制系統(tǒng)殿如,同一個Git倉庫,可以分布到不同的機器上涉馁。怎么分布呢?最早寒随,肯定只有一臺機器有一個原始版本庫,此后妻往,別的機器可以“克隆”這個原始版本庫互艾,而且每臺機器的版本庫其實都是一樣的讯泣,并沒有主次之分。
有個叫GitHub
這個網(wǎng)站就是提供Git倉庫托管服務(wù)的好渠,所以,只要注冊一個GitHub賬號拳锚,就可以免費獲得Git遠程倉庫。
你的本地Git倉庫和GitHub倉庫之間的傳輸是通過SSH加密的匾荆,所以,需要一點設(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"
你需要把郵件地址換成你自己的郵件地址,然后一路回車滔韵,使用默認值即可,由于這個Key也不是用于軍事目的陪蜻,所以也無需設(shè)置密碼。
如果一切順利的話滋将,可以在用戶主目錄里找到.ssh
目錄邻悬,里面有id_rsa
和id_rsa.pub
兩個文件随闽,這兩個就是SSH Key的秘鑰對,id_rsa
是私鑰橱脸,不能泄露出去,id_rsa.pub
是公鑰添诉,可以放心地告訴任何人。
第2步:登陸GitHub栏赴,打開“Account settings”,“SSH Keys”頁面:
然后竖瘾,點“Add SSH Key”,填上任意Title捕传,在Key文本框里粘貼id_rsa.pub
文件的內(nèi)容:
點“Add Key”扩劝,你就應(yīng)該看到已經(jīng)添加的Key:
為什么GitHub需要SSH Key呢庸论?因為GitHub需要識別出你推送的提交確實是你推送的棒呛,而不是別人冒充的,而Git支持SSH協(xié)議簇秒,所以,GitHub只要知道了你的公鑰扛禽,就可以確認只有你自己才能推送。
當然旋圆,GitHub允許你添加多個Key。假定你有若干電腦灵巧,你一會兒在公司提交搀矫,一會兒在家里提交,只要把每臺電腦的Key都添加到GitHub瓤球,就可以在每臺電腦上往GitHub推送了。
最后友情提示卦羡,在GitHub上免費托管的Git倉庫麦到,任何人都可以看到喔(但只有你自己才能改)绿饵。所以瓶颠,不要把敏感信息放進去。
如果你不想讓別人看到Git庫粹淋,有兩個辦法,一個是讓GitHub把公開的倉庫變成私有的桃移,這樣別人就看不見了(不可讀更不可寫)。另一個辦法是自己動手借杰,搭一個Git服務(wù)器,因為是你自己的Git服務(wù)器纤虽,所以別人也是看不見的。
添加遠程庫
現(xiàn)在的情景是,你已經(jīng)在本地創(chuàng)建了一個Git倉庫后刷袍,又想在GitHub創(chuàng)建一個Git倉庫,并且讓這兩個倉庫進行遠程同步呻纹,這樣,GitHub上的倉庫既可以作為備份雷酪,又可以讓其他人通過該倉庫來協(xié)作,真是一舉多得蔗怠。
首先墩弯,登陸GitHub寞射,然后,在右上角找到“new repository”
按鈕桥温,創(chuàng)建一個新的倉庫:
在Repository name填入learngit
,其他保持默認設(shè)置旺韭,點擊“Create repository”按鈕,就成功地創(chuàng)建了一個新的Git倉庫:
目前区端,在GitHub上的這個learngit
倉庫還是空的履腋,GitHub告訴我們,可以從這個倉庫克隆出新的倉庫遵湖,也可以把一個已有的本地倉庫與之關(guān)聯(lián),然后延旧,把本地倉庫的內(nèi)容推送到GitHub倉庫。
現(xiàn)在迁沫,我們根據(jù)GitHub的提示,在本地的learngit
倉庫下運行命令:
$ git remote add origin git@github.com:michaelliao/learngit.git
請千萬注意集畅,把上面的michaelliao
替換成你自己的GitHub賬戶名,否則挺智,你在本地關(guān)聯(lián)的就是我的遠程庫,關(guān)聯(lián)沒有問題二鳄,但是你以后推送是推不上去的,因為你的SSH Key公鑰不在我的賬戶列表中订讼。
添加后,遠程庫的名字就是origin
欺殿,這是Git默認的叫法,也可以改成別的祈餐,但是origin
這個名字一看就知道是遠程庫。
下一步帆阳,就可以把本地庫的所有內(nèi)容推送到遠程庫上:
$ git push -u origin master
Counting objects: 20, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (20/20), 1.64 KiB | 560.00 KiB/s, done.
Total 20 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), done.
To github.com:michaelliao/learngit.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
把本地庫的內(nèi)容推送到遠程,用git push
命令蜒谤,實際上是把當前分支master
推送到遠程。
由于遠程庫是空的资锰,我們第一次推送master
分支時,加上了-u
參數(shù)绷杜,Git不但會把本地的master
分支內(nèi)容推送的遠程新的master
分支,還會把本地的master
分支和遠程的master
分支關(guān)聯(lián)起來鞭盟,在以后的推送或者拉取時就可以簡化命令瑰剃。
推送成功后齿诉,可以立刻在GitHub頁面中看到遠程庫的內(nèi)容已經(jīng)和本地一模一樣:
從現(xiàn)在起晌姚,只要本地作了提交,就可以通過命令:
$ git push origin master
把本地master
分支的最新修改推送至GitHub挥唠,現(xiàn)在,你就擁有了真正的分布式版本庫弧关!
SSH警告
當你第一次使用Git的clone
或者push
命令連接GitHub時,會得到一個警告:
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)?
這是因為Git使用SSH連接梯醒,而SSH連接在第一次驗證GitHub服務(wù)器的Key時腌紧,需要你確認GitHub的Key的指紋信息是否真的來自GitHub的服務(wù)器,輸入yes
回車即可壁肋。
Git會輸出一個警告号胚,告訴你已經(jīng)把GitHub的Key添加到本機的一個信任列表里了:
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
這個警告只會出現(xiàn)一次浸遗,后面的操作就不會有任何警告了。
如果你實在擔(dān)心有人冒充GitHub服務(wù)器跛锌,輸入yes
前可以對照GitHub的RSA Key的指紋信息是否與SSH連接給出的一致。
從遠程庫克隆
上次我們講了先有本地庫髓帽,后有遠程庫的時候,如何關(guān)聯(lián)遠程庫衡查。
現(xiàn)在,假設(shè)我們已經(jīng)創(chuàng)建了遠程庫拌牲,然后,從遠程庫克隆塌忽。
現(xiàn)在阁吝,遠程庫已經(jīng)準備好了砚婆,下一步是用命令git clone
克隆一個本地庫:
$ git clone git@github.com:fuziwang/learngit.git
Cloning into 'gitskills'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3
Receiving objects: 100% (3/3), done.
注意把Git庫的地址換成你自己的突勇,然后進入learngit
目錄看看,已經(jīng)有上述的文件了:
$ cd learngit
$ ls
LICENSE.txt readme.txt
如果有多個人協(xié)作開發(fā)甲馋,那么每個人各自從遠程克隆一份就可以了。
你也許還注意到定躏,GitHub給出的地址不止一個,還可以用https://github.com/fuziwang/learngit.git
這樣的地址垮抗。實際上,Git支持多種協(xié)議冒版,默認的git://
使用ssh,但也可以使用https
等其他協(xié)議辞嗡。
使用https
除了速度慢以外捆等,還有個最大的麻煩是每次推送都必須輸入口令续室,但是在某些只開放http端口的公司內(nèi)部就無法使用ssh
協(xié)議而只能用https
。