5.遠程倉庫(GitHub)

Git是分佈式版本控制系統,同一個Git倉庫,可以分佈到不同的機器上。Git遠程操作命令有以下五個:
git clone
git remote
git fetch
git pull
git push

添加遠程倉庫
第1步:創建SSH Key:
在用戶主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個文件,如果已經有了,可直接跳到下一步。如果沒有,打開Shell(Windows下打開Git Bash),創建SSH Key(簡單創建):

第2步:登陸GitHub,打開“Account settings”,“SSH Keys”頁面:
然後,點“Add SSH Key”,填上任意Title,在Key文本框裏粘貼id_rsa.pub文件的內容:




GitHub需要識別出你推送的提交確實是你推送的,而不是別人冒充的,而Git支持SSH協議,所以,GitHub只要知道了你的公鑰,就可以確認只有你自己才能推送。GitHub允許你添加多個Key。
注意:在GitHub上免費託管的Git倉庫,任何人都可以看到

第3步:
現在我們已經在本地創建了一個Git倉庫後,又想在GitHub創建一個Git倉庫,並且讓這兩個倉庫進行遠程同步,這樣,GitHub上的倉庫既可以作爲備份,又可以讓其他人通過該倉庫來協作。
先在GitHub上創建一個倉庫

目前,在GitHub上的這個learngit倉庫還是空的,GitHub告訴我們,可以從這個倉庫克隆出新的倉庫,也可以把一個已有的本地倉庫與之關聯,然後,把本地倉庫的內容推送到GitHub倉庫。
把本地庫的內容推送到遠程,用git push命令,實際上是把當前分支master推送到遠程。
由於遠程庫是空的,我們第一次推送master分支時,加上了-u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在以後的推送或者拉取時就可以簡化命令。
推送成功後,可以立刻在GitHub頁面中看到遠程庫的內容已經和本地一模一樣:
從現在起,只要本地作了提交,就可以通過命令:
SSH警告:
當第一次使用Git的clone或者push命令連接GitHub時,會得到一個警告:
這是因爲Git使用SSH連接,而SSH連接在第一次驗證GitHub服務器的Key時,需要你確認GitHub的Key的指紋信息是否真的來自GitHub的服務器,輸入yes回車即可。
Git會輸出一個警告,告訴你已經把GitHub的Key添加到本機的一個信任列表裏了:
這個警告只會出現一次,後面的操作就不會有任何警告了。
如果擔心有人冒充GitHub服務器,輸入yes前可以對照GitHub的RSA Key的指紋信息是否與SSH連接給出的一致。

遠程操作
1.git clone 從遠程庫克隆
開始一個新的工作前,通常是從遠程庫克隆一個版本庫到本地。命令格式:
$ git clone <版本庫的網址>
該命令會在本地主機生成一個目錄,與遠程主機的版本庫同名。如果要指定不同的目錄名,可以將目錄名作爲git clone命令的第二個參數。
$ git clone <版本庫的網址> <本地目錄名>
此命令支持多種協議Http(s)、SSH、Git、本地文件協議。
$ git clone http[s]://example.com/path/to/repo.git/
$ git clone ssh://example.com/path/to/repo.git/
$ git clone git://example.com/path/to/repo.git/
$ git clone /opt/git/project.git
$ git clone file:///opt/git/project.git
$ git clone ftp[s]://example.com/path/to/repo.git/
$ git clone rsync://example.com/path/to/repo.git/
$ git clone [user@]example.com:path/to/repo.git/ (SSH協議的另一種寫法)
使用https除了速度慢以外,還有個最大的麻煩是每次推送都必須輸入口令,但是在某些只開放http端口的公司內部就無法使用ssh協議而只能用https。
克隆版本庫的時候,所使用的遠程主機自動被Git命名爲origin。如果想用其他的主機名,需要用git clone命令的-o選項指定。
$ git clone -o <版本名字> <版本庫網址>

2.git remote 管理主機名
爲了便於管理,Git要求每個遠程主機都必須指定一個主機名。git remote命令就用於管理主機名。
不帶選項的時候,git remote命令列出所有遠程主機。
$ git remote
使用-v選項,可以參看遠程主機的網址。
$ git remote -v
git remote show命令加上主機名,可以查看該主機的詳細信息。
$ git remote show <主機名>
git remote add命令用於添加遠程主機。
$ git remote add <主機名> <網址>
git remote rm命令用於刪除遠程主機。
$ git remote rm <主機名>
git remote rename命令用於遠程主機的改名。
$ git remote rename <原主機名> <新主機名>

3.git fetch 把遠程庫更新到本地
當遠程的版本庫有了更新後,需要將這些更新取回本地。
$ git fetch <遠程主機名>
git fetch命令通常用來查看其他人的進程,因爲它取回的代碼對本地的開發代碼沒有影響。
默認情況下,git fetch取回所有分支(branch)的更新。如果只想取回特定分支的更新,可以指定分支名。
$ git fetch <遠程主機名> <分支名>
取回的更新,在本地主機上要用"遠程主機名/分支名"的形式讀取。
git branch命令的-r選項,可以用來查看遠程分支,-a選項查看所有分支。
$ git branch -r
$ git branch -a
對於取回本地的分支,可以在其基礎上新建分支繼續開發
$ git checkout -b <新的分支名> <取回的遠程分支名>
也可以將其與本地的分支合併
$ git merge <取回的遠程分支名>
或者
$ git rebase <取回的遠程分支名>

4.git pull 取回遠程某分支的更新並於本地指定分支合併
取回遠程主機某個分支的更新,再與本地的指定分支合併。它的格式如下:
$ git pull <遠程主機名> <遠程分支名>:<本地分支名>
如果遠程分支是與當前分支合併,則冒號後面的部分可以省略。這個命令等效於:
$ git fetch
$ git merge
在某些時候,Git會自動在本地分支與遠程分支之間,建立一種追蹤關係(tracking)。比如,在git clone的時候,所有本地分支默認與遠程主機的同名分支,建立追蹤關係,也就是說,本地的master分支自動"追蹤"origin/master分支。
Git也允許手動建立追蹤關係。
$ git branch --set-upstream <本地分支名> <遠程分支名>
如果當前分支與遠程分支存在追蹤關係,git pull就可以省略遠程分支名。
$ git pull <遠程主機名>
如果當前分支只有一個追蹤分支,連遠程主機名都可以省略。
$ git pull
如果合併需要採用rebase模式,可以使用--rebase選項。
$ git pull --rebase <遠程主機名> <遠程分支名>:<本地分支名>
如果遠程主機刪除了某個分支,默認情況下,git pull 不會在拉取遠程分支的時候,刪除對應的本地分支。這是爲了防止,由於其他人操作了遠程主機,導致git pull不知不覺刪除了本地分支。
但是,可以改變這個行爲,加上參數 -p 就會在本地刪除遠程已經刪除的分支。
$ git pull -p
等同於下面的命令
$ git fetch --prune <遠程主機名>
$ git fetch -p

5.git push 推送本地更新到遠程庫
用於將本地分支的更新,推送到遠程主機。
$ git push <遠程主機名> <本地分支名>:<遠程分支名>
注意,分支推送順序的寫法是<來源地>:<目的地>,所以git pull是<遠程分支>:<本地分支>,而git push是<本地分支>:<遠程分支>。
如果省略遠程分支名,則表示將本地分支推送與之存在"追蹤關係"的遠程分支(通常兩者同名),如果該遠程分支不存在,則會被新建。
$ git push <遠程主機名> <本地分支名>
如果省略本地分支名,則表示刪除指定的遠程分支,因爲這等同於推送一個空的本地分支到遠程分支。
$ git push <遠程主機名> :<遠程分支名>
等同於
$ git push <遠程主機名> --delete <遠程分支名>
如果當前分支與遠程分支之間存在追蹤關係,則本地分支和遠程分支都可以省略。
$ git push <遠程主機名>
如果當前分支只有一個追蹤分支,那麼主機名都可以省略。
$ git push
如果當前分支與多個主機存在追蹤關係,則可以使用-u選項指定一個默認主機,這樣後面就可以不加任何參數使用git push。例如:
$ git push -u origin master
上面命令將本地的master分支推送到origin主機,同時指定origin爲默認主機,後面就可以不加任何參數使用git push了。不帶任何參數的git push,默認只推送當前分支,這叫做simple方式。
此外,還有一種matching方式,會推送所有有對應的遠程分支的本地分支。Git 2.0版本之前,默認採用matching方法,現在改爲默認採用simple方式。如果要修改這個設置,可以採用git config命令。
$ git config --global push.default matching
或者
$ git config --global push.default simple
還有一種情況,就是不管是否存在對應的遠程分支,將本地的所有分支都推送到遠程主機,這時需要使用--all選項。
$ git push --all <遠程主機名>
注意:
如果遠程主機的版本比本地版本更新,推送時Git會報錯,要求先在本地做git pull合併差異,然後再推送到遠程主機。這時,如果一定要推送,可以使用--force選項。
$ git push --force <遠程主機名>
這樣導致遠程主機上更新的版本被覆蓋,謹慎使用。
git push不會推送標籤(tag),除非使用--tags選項。
$ git push <遠程主機名> --tags
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章