1. 程式人生 > >Git的使用教程(七)遠端倉庫

Git的使用教程(七)遠端倉庫

     之前的操作我們只是把Git當做了一個倉庫,做本地的一個版本管理,這對Git來說簡直大材小用。Git作為分散式版本控制系統,分佈才是其特色,如何分佈呢?肯定要有一臺機器充當原始的版本庫,其他的機器“克隆”這個原始版本庫,其實每臺機器上的版本都一樣,沒有主次之分,之所以有原始版本庫,是為了方便多人協作時候有一個基準,讓各機器上的版本保持一致。一般情況下,原始的版本庫不會跟我們工作的電腦在一起,它對於我們來說是遠端的,所以我們可以稱之為遠端倉庫。

    既然是遠端,肯定還需要一臺機器充當伺服器(原始版本庫),而且這臺機器需要保證24小時開機,這樣才能保證其他使用者可以隨時克隆原始版本,推送提交到該伺服器,拉取別人的提交。我們目前只是為了學習Git,特意找個伺服器划不來,好在大Git地位超然,很多網站紛紛提供Git倉庫託管服務,像是國內外都著名的github.com,國內著名的git.oschina.net。雖然兩者都能夠提供託管服務,但是github免費建立的只有公倉(對所有使用者都可見),私倉(僅對自己可見)是要付費的,而oschina的公私倉都不需要付費,而且是國貨,理應支援,因此小編就選擇了oschina建立遠端倉庫。

    關於在oschina申請賬號這裡就不再複述了,假定你已經擁有了賬號並登入,那麼我們就可以建立一個遠端倉庫了。在oschina上建立一個遠端倉庫很簡單,我們點選新建專案,我們必須要填寫的只有專案名,其他的可以根據你的需要進行選擇,有一點需要提示的是,如果你已經有git專案想要直接推送到遠端倉庫,不要讓遠端倉庫初始化,也就是不要勾選“使用Readme檔案初始化這個專案”,如果你不想讓別人看見你這個專案,勾選“私有專案”。

    

    我們成功了建立了一個空的遠端倉庫,裡面什麼都沒有,於是乎給了我們友情提示,告訴我們應該怎麼做。


    雖然他們真的很用心,但是並沒有面面俱到,沒關係,就由小編來補充他們的一些不足吧。不同的兩臺電腦之間需要進行資料傳輸,肯定需要橋樑,oschina為我們提供了兩種選擇,一種是HTTPS,一種是SSH。如果使用HTTPS,倒是不用做什麼特別的事情,上述教程足以讓你把本地專案成功推送到遠端倉庫,但是每次推送都需要輸入賬號和密碼(oschina的賬號密碼),十分麻煩,因此我們可以選擇另一種方式,SSH。

    使用SSH就需要建立SSH Keys,很多人不知道如何建立,沒關係,oschina想到了這點,特意給除了教程

    

    Linux的跟著教程走就行,下面我們來看下windows的。我們使用Git Bash終端,然後同樣輸入

ssh-keygen -t rsa -C "[email protected]"
然後一路回車即可。在"C:\Documents and Settings\Administrator\.ssh"中就有我們需要的檔案id_rsa.pub。     然後開啟oschina新增SSH公鑰的地方,點選這裡,前提是你已經登陸了。然後輸入個標題,把剛才生成的id_rsa.pub中的內容拷貝一份到公鑰處,然後點選確定即可,這樣準備工作就已經完成了。
    接著我們就可以通過SSH溝通本地倉和遠端倉了。     新增遠端倉庫
git remote add osc-git [email protected]:XXXXXXX/git.git
其中git remote是告訴Git要執行遠端倉庫相關命令,add是新增,osc-git是遠端倉庫名(很多教程使用origin作為遠端倉庫名,非必須,可以根據情況進行修改),為簡化書寫遠端倉庫地址而存在,以後進行遠端相關操作的時候只需要使用遠端倉庫名即可,[email protected]……則是我們遠端倉庫實際的SSH地址,就這樣,我們便成功的添加了一個遠端倉庫。     檢視遠端倉庫
git remote     //只輸出遠端倉庫名稱
git remote -v  //輸出遠端倉庫名和地址

    刪除遠端倉庫
git remote rm osc-git
    推送到遠端倉庫     git push命令用於將本地分支的更新推送到遠端分支。
git push <遠端倉庫名> <本地分支名>:<遠端分支名>
例如我們將本地的master分支推送到遠端倉庫的master分支就可以這些書寫
git push osc-git master:master
    注意事項 1.我們在推送的時候,一定需要注意的是本地分支稱和遠端分支的位置,千萬不要搞錯了。 2.用於推送的本地分支一定要存在,否則會報錯,遠端分支可以不存在,當遠端分支名不存在的時候將會被新建。

當然我們還可以簡寫為
git push osc-git master
其中master代表的是本地分支,這樣同樣能夠達到推送本地master分支到遠端master分支的效果。 帶:的時候,我們可以用於推送不同名稱的分支,例如git push osc-git master:dev,此時我們就把本地master分支推送到了遠端的dev分支上。不帶:的時候我們只能用於推送本地master分支到遠端master分支。建議同名分支之間進行推送,因此我們常用簡寫形式。 有時候我們會在教程上看到遠端倉庫名的前面有一個-u引數,例如
git push -u osc-git master
    加上-u跟不加-u有什麼區別呢?     區別一:加上-u,我們在git status的時候會發現多了一行,“Your branch is up-to-date with 'osc-git/master'”,這有何用?為了說明其作用,我們使用git push -u osc-git master推送之後在新建一個檔案,然後git add和git commit,此時本地倉就比遠端倉多了一個提交。然後我們再次git status,你看到了什麼,看到了什麼,沒錯就是提示,Git再提示我們本地倉的分支比'osc-git/master'領先了一個提交,說白了就是告訴我們,本地倉和遠端倉不同步了,我們應該git push了。如果沒有-u,那麼使用git status的時候不會得到任何提示。可見-u的作用就是讓本地倉分支和遠端倉分支關聯起來,當然這種操作只做一次即可,之後進行git push的時候就不必加-u了,因為Git已經知道這兩個分支的關係。是不是覺得Git太友好了,當然這種友好還是有些缺陷,因為它是單向的,只有當本地倉的提交超出了遠端倉的提交的時候,git status才有提示,但是遠端倉提交超出本地倉提交的時候,git status不會有任何提示,這點一定需要注意。     區別二:一會我們會講到git pull命令,是用於拉取遠端分支內容的命令,使用-u之前,我們必須使用完整的命令git pull osc-git master來拉取遠端分支內容,直接使用git pull的時候會報錯的,但是使用過-u之後,我們可以直接使用git pull來拉取遠端master分支的內容,當然也只能拉取遠端的master分支(這裡只是以master分支為例,實際能夠拉取的分支以你在使用-u的時候繫結的遠端分支為準)。
    首次進行推動的時候,會得到一個警告,這是因為Git使用SSH連線,而SSH首次連線oschina伺服器的key時,需要確認oschina的key是否真的來自oschina,輸入yes即可。然後Git會輸出一個警告,告訴你已經把oschina的key新增到本機信任列表裡了,下次再進行連線的時候就不會出現警告了。
The authenticity of host 'git.oschina.net (xxx.xxx.xxx.xxx)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxxxx.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'git.oschina.net,xxx.xxx.xxx.xxx' (ECDSA) to the list of known hosts.
此時我們再來看下那個遠端倉庫,原來的空倉庫是不是已經有資料了,而且跟我們的本地倉庫的目錄結構是一致的,就這樣我們完成了Git的第一次推送。     從遠端倉庫克隆     剛才我們是假設遠端倉庫為空倉,把本地倉庫通過git push推送到了遠端倉庫,如果遠端倉庫本來就有內容,我們需要拉取到本地應該如何做呢?其實很簡單,通過git clone輕而易舉就能做到。
git clone [email protected]:xxxxxxxx/git.git
有一點需要注意的是,使用git clone拉取的是帶有專案名稱的資料夾,例如上述操作拉取的就是git資料夾,並非直接拉取專案下的檔案和資料夾,因此選擇本地倉庫位置的時候需要注意。
    從遠端倉庫拉取     當遠端倉庫的分支超出了本地分支的提交,git push將不能推送,此時我們就需要首先拉取遠端分支內容,然後和本地分支合併後才能git push。    方法一:git fetch+git merge
git fetch osc-git master
git merge osc-git/master
    git fetch用於獲取遠端倉庫的分支內容到本地,git merge則用於合併遠端分支內容到本地分支,此時遠端分支就和本地分支同步了。         方法二:git pull
git pull osc-git master
    git pull是git fetch和git merge兩個命令的合體狀態,只需要一個命令就能完成上述兩步操作,如果在git push的使用-u綁定了一個分支,例如git push -u osc-git master,此時連後面的osc-git master都可以省略,我們只需要git pull就能拉取遠端倉庫osc-git的master分支,當然該寫法只能拉取預設關聯的分支,上述例子中就只能拉取osc-git的master分支。     雖然方便了,但是也存在著弊端,尤其是在多分支的情況下。例如現在本地有兩個分支,一個master分支,一個dev分支,對應遠端倉庫的osc-git/master和osc-git/dev,我們本想拉取osc-git/dev到dev分支,但是沒注意現在使用的是master分支,直接使用了git pull osc-git dev,杯具了,Git直接合並了master和osc-git/dev,這不是我們想要的,發現了錯誤及時彌補,git reset --hard  xxxxxx,好了master終於回到了原來的狀態。雖然存在補救措施,但是同時也告訴了我們git pull可能會帶來的隱患,因此我們應該避免使用git pull,儘量使用git fetch和git merge,雖然這樣做仍然可能會犯上述錯誤,不過幾率一定會大大降低。