Git 遠(yuǎn)程倉(cāng)庫(kù)的管理和使用 |
發(fā)布時(shí)間: 2012/9/8 18:57:02 |
要參與任何一個(gè) Git 項(xiàng)目的協(xié)作,必須要了解該如何管理遠(yuǎn)程倉(cāng)庫(kù)。遠(yuǎn)程倉(cāng)庫(kù)是指托管在網(wǎng)絡(luò)上的項(xiàng)目倉(cāng)庫(kù),可能會(huì)有好多個(gè),其中有些你只能讀,另外有些可以寫(xiě)。同他人協(xié)作開(kāi)發(fā)某 個(gè)項(xiàng)目時(shí),需要管理這些遠(yuǎn)程倉(cāng)庫(kù),以便推送或拉取數(shù)據(jù),分享各自的工作進(jìn)展。管理遠(yuǎn)程倉(cāng)庫(kù)的工作,包括添加遠(yuǎn)程庫(kù),移除廢棄的遠(yuǎn)程庫(kù),管理各式遠(yuǎn)程庫(kù)分 支,定義是否跟蹤這些分支,等等。本節(jié)我們將詳細(xì)討論遠(yuǎn)程庫(kù)的管理和使用。 查看當(dāng)前的遠(yuǎn)程庫(kù) 要查看當(dāng)前配置有哪些遠(yuǎn)程倉(cāng)庫(kù),可以用 git remote 命令,它會(huì)列出每個(gè)遠(yuǎn)程庫(kù)的簡(jiǎn)短名字。在克隆完某個(gè)項(xiàng)目后,至少可以看到一個(gè)名為 origin 的遠(yuǎn)程庫(kù),Git 默認(rèn)使用這個(gè)名字來(lái)標(biāo)識(shí)你所克隆的原始倉(cāng)庫(kù): $ git clone git://github.com/schacon/ticgit.git Initialized empty Git repository in /private/tmp/ticgit/.git/ remote: Counting objects: 595, done. remote: Compressing objects: 100% (269/269), done. remote: Total 595 (delta 255), reused 589 (delta 253) Receiving objects: 100% (595/595), 73.31 KiB | 1 KiB/s, done. Resolving deltas: 100% (255/255), done. $ cd ticgit $ git remote origin 也可以加上 -v 選項(xiàng)(譯注:此為 –verbose 的簡(jiǎn)寫(xiě),取首字母),顯示對(duì)應(yīng)的克隆地址: $ git remote -v origin git://github.com/schacon/ticgit.git 如果有多個(gè)遠(yuǎn)程倉(cāng)庫(kù),此命令將全部列出。比如在我的 Grit 項(xiàng)目中,可以看到: $ 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 這樣一來(lái),我就可以非常輕松地從這些用戶(hù)的倉(cāng)庫(kù)中,拉取他們的提交到本地。請(qǐng)注意,上面列出的地址只有 origin 用的是 SSH URL 鏈接,所以也只有這個(gè)倉(cāng)庫(kù)我能推送數(shù)據(jù)上去(我們會(huì)在第四章解釋原因)。 添加遠(yuǎn)程倉(cāng)庫(kù) 要添加一個(gè)新的遠(yuǎn)程倉(cāng)庫(kù),可以指定一個(gè)簡(jiǎn)單的名字,以便將來(lái)引用,運(yùn)行 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 現(xiàn)在可以用字串 pb 指代對(duì)應(yīng)的倉(cāng)庫(kù)地址了。比如說(shuō),要抓取所有 Paul 有的,但本地倉(cāng)庫(kù)沒(méi)有的信息,可以運(yùn)行 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 現(xiàn)在,Paul 的主干分支(master)已經(jīng)完全可以在本地訪問(wèn)了,對(duì)應(yīng)的名字是 pb/master,你可以將它合并到自己的某個(gè)分支,或者切換到這個(gè)分支,看看有些什么有趣的更新。 從遠(yuǎn)程倉(cāng)庫(kù)抓取數(shù)據(jù) 正如之前所看到的,可以用下面的命令從遠(yuǎn)程倉(cāng)庫(kù)抓取數(shù)據(jù)到本地: $ git fetch [remote-name] 此命令會(huì)到遠(yuǎn)程倉(cāng)庫(kù)中拉取所有你本地倉(cāng)庫(kù)中還沒(méi)有的數(shù)據(jù)。運(yùn)行完成后,你就可以在本地訪問(wèn)該遠(yuǎn)程倉(cāng)庫(kù)中的所有分支,將其中某個(gè)分支合并到本地,或者只是取出某個(gè)分支,一探究竟。(我們會(huì)在第三章詳細(xì)討論關(guān)于分支的概念和操作。) 如果是克隆了一個(gè)倉(cāng)庫(kù),此命令會(huì)自動(dòng)將遠(yuǎn)程倉(cāng)庫(kù)歸于 origin 名下。所以,git fetch origin 會(huì)抓取從你上次克隆以來(lái)別人上傳到此遠(yuǎn)程倉(cāng)庫(kù)中的所有更新(或是上次 fetch 以來(lái)別人提交的更新)。有一點(diǎn)很重要,需要記住,fetch 命令只是將遠(yuǎn)端的數(shù)據(jù)拉到本地倉(cāng)庫(kù),并不自動(dòng)合并到當(dāng)前工作分支,只有當(dāng)你確實(shí)準(zhǔn)備好了,才能手工合并。(說(shuō) 明:事先需要?jiǎng)?chuàng)建好遠(yuǎn)程的倉(cāng)庫(kù),然后執(zhí)行:git remote add [倉(cāng)庫(kù)名] [倉(cāng)庫(kù)url],git fetch [遠(yuǎn)程倉(cāng)庫(kù)名],即可抓取到遠(yuǎn)程倉(cāng)庫(kù)數(shù)據(jù)到本地,再用git merge remotes/[倉(cāng)庫(kù)名]/master就可以將遠(yuǎn)程倉(cāng)庫(kù)merge到本地當(dāng)前branch。這種分支方式比較適合獨(dú)立-整合開(kāi)發(fā),即各自開(kāi)發(fā)測(cè)試好后 再整合在一起。比如,Android的Framework和AP開(kāi)發(fā)。 可以使用--bare 選項(xiàng)運(yùn)行g(shù)it init 來(lái)設(shè)定一個(gè)空倉(cāng)庫(kù),這會(huì)初始化一個(gè)不包含工作目錄的倉(cāng)庫(kù)。 $ cd /opt/git $ mkdir project.git $ cd project.git $ git --bare init 這時(shí),Join,Josie 或者Jessica 就可以把它加為遠(yuǎn)程倉(cāng)庫(kù),推送一個(gè)分支,從而把第一個(gè)版本的工程上傳到倉(cāng)庫(kù)里了。) 如果設(shè)置了某個(gè)分支用于跟蹤某個(gè)遠(yuǎn)端倉(cāng)庫(kù)的分支(參見(jiàn)下節(jié)及第三章的內(nèi)容),可以使用 git pull 命令自動(dòng)抓取數(shù)據(jù)下來(lái),然后將遠(yuǎn)端分支自動(dòng)合并到本地倉(cāng)庫(kù)中當(dāng)前分支。在日常工作中我們經(jīng)常這么用,既快且好。實(shí)際上,默認(rèn)情況下 git clone 命令本質(zhì)上就是自動(dòng)創(chuàng)建了本地的 master 分支用于跟蹤遠(yuǎn)程倉(cāng)庫(kù)中的 master 分支(假設(shè)遠(yuǎn)程倉(cāng)庫(kù)確實(shí)有 master 分支)。所以一般我們運(yùn)行 git pull,目的都是要從原始克隆的遠(yuǎn)端倉(cāng)庫(kù)中抓取數(shù)據(jù)后,合并到工作目錄中當(dāng)前分支。 推送數(shù)據(jù)到遠(yuǎn)程倉(cāng)庫(kù) 項(xiàng)目進(jìn)行到一個(gè)階段,要同別人分享目前的成果,可以將本地倉(cāng)庫(kù)中的數(shù)據(jù)推送到遠(yuǎn)程倉(cāng)庫(kù)。實(shí)現(xiàn)這個(gè)任務(wù)的命令很簡(jiǎn)單: git push [remote-name] [branch-name]。如果要把本地的 master 分支推送到 origin 服務(wù)器上(再次說(shuō)明下,克隆操作會(huì)自動(dòng)使用默認(rèn)的 master 和 origin 名字),可以運(yùn)行下面的命令: $ git push origin master 只有在所克隆的服務(wù)器上有寫(xiě)權(quán)限,或者同一時(shí)刻沒(méi)有其他人在推數(shù)據(jù),這條命令才會(huì)如期完成任務(wù)。如果在你推數(shù)據(jù)前,已經(jīng)有其他人推送了若干更新,那 你的推送操作就會(huì)被駁回。你必須先把他們的更新抓取到本地,并到自己的項(xiàng)目中,然后才可以再次推送。有關(guān)推送數(shù)據(jù)到遠(yuǎn)程倉(cāng)庫(kù)的詳細(xì)內(nèi)容見(jiàn)第三章。 查看遠(yuǎn)程倉(cāng)庫(kù)信息 我們可以通過(guò)命令 git remote show [remote-name] 查看某個(gè)遠(yuǎn)程倉(cāng)庫(kù)的詳細(xì)信息,比如要看所克隆的origin 倉(cāng)庫(kù),可以運(yùn)行: $ git remote show origin * remote origin URL: git://github.com/schacon/ticgit.git Remote branch merged with 'git pull' while on branch master master Tracked remote branches master ticgit 除了對(duì)應(yīng)的克隆地址外,它還給出了許多額外的信息。它友善地告訴你如果是在 master 分支,就可以用git pull 命令抓取數(shù)據(jù)合并到本地。另外還列出了所有處于跟蹤狀態(tài)中的遠(yuǎn)端分支。 實(shí)際使用過(guò)程中,git remote show 給出的信息可能會(huì)像這樣: $ git remote show origin * remote origin URL: git@github.com:defunkt/github.git Remote branch merged with 'git pull' while on branch issues issues Remote branch merged with 'git pull' while on branch master master New remote branches (next fetch will store in remotes/origin) caching Stale tracking branches (use 'git remote prune') libwalker walker2 Tracked remote branches acl apiv2 dashboard2 issues master postgres Local branch pushed with 'git push' master:master 它告訴我們,運(yùn)行 git push 時(shí)缺省推送的分支是什么(譯注:最后兩行)。它還顯示了有哪些遠(yuǎn)端分支還沒(méi)有同步 到本地(譯注:第六行的 caching 分支),哪些已同步到本地的遠(yuǎn)端分支在遠(yuǎn)端服務(wù)器上已被刪除(譯注:Stale tracking branches 下面的兩個(gè)分支),以及運(yùn)行 git pull 時(shí)將自動(dòng)合并哪些分支(譯注:前四行中列出的 issues 和 master 分支)。(此命令也可以查看到本地分支和遠(yuǎn)程倉(cāng)庫(kù)分支的對(duì)應(yīng)關(guān)系。) 遠(yuǎn)程倉(cāng)庫(kù)的刪除和重命名 在新版 Git 中可以用 git remote rename 命令修改某個(gè)遠(yuǎn)程倉(cāng)庫(kù)的簡(jiǎn)短名稱(chēng),比如想把 pb 改成 paul,可以這么運(yùn)行: $ git remote rename pb paul $ git remote origin paul 注意,對(duì)遠(yuǎn)程倉(cāng)庫(kù)的重命名,也會(huì)使對(duì)應(yīng)的分支名稱(chēng)發(fā)生變化,原來(lái)的 pb/master 分支現(xiàn)在成了paul/master。 碰到遠(yuǎn)端倉(cāng)庫(kù)服務(wù)器遷移,或者原來(lái)的克隆鏡像不再使用,又或者某個(gè)參與者不再貢獻(xiàn)代碼,那么需要移除對(duì)應(yīng)的遠(yuǎn)端倉(cāng)庫(kù),可以運(yùn)行 git remote rm 命令: $ git remote rm paul $ git remote origin 本文出自:億恩科技【mszdt.com】 服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |