遠程倉庫的使用
要參與任何一個 Git 項目的協作,必須要了解該如何管理遠程倉庫。遠程倉庫是指托管在網絡上的項目倉庫,可能會有好多個,其中有些你只能讀,另外有些可以寫。同他人協作開發某個項目時,需要管理這些遠程倉庫,以便推送或拉取數據,分享各自的工作進展。 管理遠程倉庫的工作,包括添加遠程庫,移除廢棄的遠程庫,管理各式遠程庫分支,定義是否跟蹤這些分支,等等。本節我們將詳細討論遠程庫的管理和使用。
?
查看當前的遠程庫
要查看當前配置有哪些遠程倉庫,可以用?git remote
?命令,它會列出每個遠程庫的簡短名字。在克隆完某個項目后,至少可以看到一個名為 origin 的遠程庫,Git 默認使用這個名字來標識你所克隆的原始倉庫:
$ git clone git://github.com/schacon/ticgit.git Cloning into 'ticgit'... remote: Reusing existing pack: 1857, done. remote: Total 1857 (delta 0), reused 0 (delta 0) Receiving objects: 100% (1857/1857), 374.35 KiB | 193.00 KiB/s, done. Resolving deltas: 100% (772/772), done. Checking connectivity... done. $ cd ticgit $ git remote origin
?
也可以加上?-v
?選項(譯注:此為?--verbose
?的簡寫,取首字母),顯示對應的克隆地址:
$ git remote -v origin git://github.com/schacon/ticgit.git (fetch) origin git://github.com/schacon/ticgit.git (push)
如果有多個遠程倉庫,此命令將全部列出。比如在我的 Grit 項目中,可以看到:
$ cd grit $ git remote -v bakkdoor git://github.com/bakkdoor/grit.git cho45 git://github.com/cho45/grit.git defunkt git://github.com/defunkt/grit.git koke git://github.com/koke/grit.git origin git@github.com:mojombo/grit.git
這樣一來,我就可以非常輕松地從這些用戶的倉庫中,拉取他們的提交到本地。請注意,上面列出的地址只有 origin 用的是 SSH URL 鏈接,所以也只有這個倉庫我能推送數據上去(我們會在第四章解釋原因)。
添加遠程倉庫
要添加一個新的遠程倉庫,可以指定一個簡單的名字,以便將來引用,運行?git remote add [shortname] [url]
:
$ git remote origin $ git remote add pb git://github.com/paulboone/ticgit.git $ git remote -v origin git://github.com/schacon/ticgit.git pb git://github.com/paulboone/ticgit.git
現在可以用字符串?pb
?指代對應的倉庫地址了。比如說,要抓取所有 Paul 有的,但本地倉庫沒有的信息,可以運行?git fetch pb
:
$ git fetch pb remote: Counting objects: 58, done. remote: Compressing objects: 100% (41/41), done. remote: Total 44 (delta 24), reused 1 (delta 0) Unpacking objects: 100% (44/44), done. From git://github.com/paulboone/ticgit* [new branch] master -> pb/master* [new branch] ticgit -> pb/ticgit
現在,Paul 的主干分支(master)已經完全可以在本地訪問了,對應的名字是?pb/master
,你可以將它合并到自己的某個分支,或者切換到這個分支,看看有些什么有趣的更新。
從遠程倉庫抓取數據
正如之前所看到的,可以用下面的命令從遠程倉庫抓取數據到本地:
$ git fetch [remote-name]
此命令會到遠程倉庫中拉取所有你本地倉庫中還沒有的數據。運行完成后,你就可以在本地訪問該遠程倉庫中的所有分支,將其中某個分支合并到本地,或者只是取出某個分支,一探究竟。(我們會在第三章詳細討論關于分支的概念和操作。)
如果是克隆了一個倉庫,此命令會自動將遠程倉庫歸于 origin 名下。所以,git fetch origin
?會抓取從你上次克隆以來別人上傳到此遠程倉庫中的所有更新(或是上次 fetch 以來別人提交的更新)。有一點很重要,需要記住,fetch 命令只是將遠端的數據拉到本地倉庫,并不自動合并到當前工作分支,只有當你確實準備好了,才能手工合并。
如果設置了某個分支用于跟蹤某個遠端倉庫的分支(參見下節及第三章的內容),可以使用?git pull
?命令自動抓取數據下來,然后將遠端分支自動合并到本地倉庫中當前分支。在日常工作中我們經常這么用,既快且好。實際上,默認情況下?git clone
?命令本質上就是自動創建了本地的 master 分支用于跟蹤遠程倉庫中的 master 分支(假設遠程倉庫確實有 master 分支)。所以一般我們運行?git pull
,目的都是要從原始克隆的遠端倉庫中抓取數據后,合并到工作目錄中的當前分支。
推送數據到遠程倉庫
項目進行到一個階段,要同別人分享目前的成果,可以將本地倉庫中的數據推送到遠程倉庫。實現這個任務的命令很簡單:?git push [remote-name] [branch-name]
。如果要把本地的 master 分支推送到?origin
?服務器上(再次說明下,克隆操作會自動使用默認的 master 和 origin 名字),可以運行下面的命令:
$ git push origin master
只有在所克隆的服務器上有寫權限,或者同一時刻沒有其他人在推數據,這條命令才會如期完成任務。如果在你推數據前,已經有其他人推送了若干更新,那你的推送操作就會被駁回。你必須先把他們的更新抓取到本地,合并到自己的項目中,然后才可以再次推送。有關推送數據到遠程倉庫的詳細內容見第三章。
查看遠程倉庫信息
我們可以通過命令?git remote show [remote-name]
?查看某個遠程倉庫的詳細信息,比如要看所克隆的?origin
?倉庫,可以運行:
$ git remote show origin * remote originURL: git://github.com/schacon/ticgit.gitRemote branch merged with 'git pull' while on branch mastermasterTracked remote branchesmasterticgit
除了對應的克隆地址外,它還給出了許多額外的信息。它友善地告訴你如果是在 master 分支,就可以用?git pull
?命令抓取數據合并到本地。另外還列出了所有處于跟蹤狀態中的遠端分支。
上面的例子非常簡單,而隨著使用 Git 的深入,git remote show
?給出的信息可能會像這樣:
$ git remote show origin * remote originURL: git@github.com:defunkt/github.gitRemote branch merged with 'git pull' while on branch issuesissuesRemote branch merged with 'git pull' while on branch mastermasterNew remote branches (next fetch will store in remotes/origin)cachingStale tracking branches (use 'git remote prune')libwalkerwalker2Tracked remote branchesaclapiv2dashboard2issuesmasterpostgresLocal branch pushed with 'git push'master:master
它告訴我們,運行?git push
?時缺省推送的分支是什么(譯注:最后兩行)。它還顯示了有哪些遠端分支還沒有同步到本地(譯注:第六行的?caching
?分支),哪些已同步到本地的遠端分支在遠端服務器上已被刪除(譯注:Stale tracking branches
?下面的兩個分支),以及運行?git pull
?時將自動合并哪些分支(譯注:前四行中列出的?issues
?和?master
?分支)。
遠程倉庫的刪除和重命名
在新版 Git 中可以用?git remote rename
?命令修改某個遠程倉庫在本地的簡稱,比如想把?pb
?改成?paul
,可以這么運行:
$ git remote rename pb paul
$ git remote
origin
paul
注意,對遠程倉庫的重命名,也會使對應的分支名稱發生變化,原來的?pb/master
?分支現在成了?paul/master
。
碰到遠端倉庫服務器遷移,或者原來的克隆鏡像不再使用,又或者某個參與者不再貢獻代碼,那么需要移除對應的遠端倉庫,可以運行?git remote rm
?命令:
$ git remote rm paul
$ git remote
origin
?