2.5 遠(yuǎn)程倉(cāng)庫(kù)的使用

2018-02-24 15:22 更新

遠(yuǎn)程倉(cāng)庫(kù)的使用

為了能在任意 Git 項(xiàng)目上協(xié)作,你需要知道如何管理自己的遠(yuǎn)程倉(cāng)庫(kù)。遠(yuǎn)程倉(cāng)庫(kù)是指托管在因特網(wǎng)或其他網(wǎng)絡(luò)中的你的項(xiàng)目的版本庫(kù)。你可以有好幾個(gè)遠(yuǎn)程倉(cāng)庫(kù),通常有些倉(cāng)庫(kù)對(duì)你只讀,有些則可以讀寫(xiě)。與他人協(xié)作涉及管理遠(yuǎn)程倉(cāng)庫(kù)以及根據(jù)需要推送或拉取數(shù)據(jù)。管理遠(yuǎn)程倉(cāng)庫(kù)包括了解如何添加遠(yuǎn)程倉(cāng)庫(kù)、移除無(wú)效的遠(yuǎn)程倉(cāng)庫(kù)、管理不同的遠(yuǎn)程分支并定義它們是否被跟蹤等等。在本節(jié)中,我們將介紹一部分遠(yuǎn)程管理的技能。

查看遠(yuǎn)程倉(cāng)庫(kù)

如果想查看你已經(jīng)配置的遠(yuǎn)程倉(cāng)庫(kù)服務(wù)器,可以運(yùn)行 git remote 命令。它會(huì)列出你指定的每一個(gè)遠(yuǎn)程服務(wù)器的簡(jiǎn)寫(xiě)。如果你已經(jīng)克隆了自己的倉(cāng)庫(kù),那么至少應(yīng)該能看到 origin - 這是 Git 給你克隆的倉(cāng)庫(kù)服務(wù)器的默認(rèn)名字:

$ git clone https://github.com/schacon/ticgit
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 | 268.00 KiB/s, done.
Resolving deltas: 100% (772/772), done.
Checking connectivity... done.
$ cd ticgit
$ git remote
origin

你也可以指定選項(xiàng) -v,會(huì)顯示需要讀寫(xiě)遠(yuǎn)程倉(cāng)庫(kù)使用的 Git 保存的簡(jiǎn)寫(xiě)與其對(duì)應(yīng)的 URL。

$ git remote -v
origin  https://github.com/schacon/ticgit (fetch)
origin  https://github.com/schacon/ticgit (push)

如果你的遠(yuǎn)程倉(cāng)庫(kù)不止一個(gè),該命令會(huì)將它們?nèi)苛谐?。例如,與幾個(gè)協(xié)作者合作的,擁有多個(gè)遠(yuǎn)程倉(cāng)庫(kù)的倉(cāng)庫(kù)看起來(lái)像下面這樣:

$ cd grit
$ git remote -v
bakkdoor  https://github.com/bakkdoor/grit (fetch)
bakkdoor  https://github.com/bakkdoor/grit (push)
cho45     https://github.com/cho45/grit (fetch)
cho45     https://github.com/cho45/grit (push)
defunkt   https://github.com/defunkt/grit (fetch)
defunkt   https://github.com/defunkt/grit (push)
koke      git://github.com/koke/grit.git (fetch)
koke      git://github.com/koke/grit.git (push)
origin    git@github.com:mojombo/grit.git (fetch)
origin    git@github.com:mojombo/grit.git (push)

這樣我們可以輕松拉取其中任何一個(gè)用戶的貢獻(xiàn)。此外,我們大概還會(huì)有某些遠(yuǎn)程倉(cāng)庫(kù)的推送權(quán)限,雖然我們目前還不會(huì)在此介紹。

注意這些遠(yuǎn)程倉(cāng)庫(kù)使用了不同的協(xié)議;我們將會(huì)在 “在服務(wù)器上搭建 Git” 中了解關(guān)于它們的更多信息。

添加遠(yuǎn)程倉(cāng)庫(kù)

我在之前的章節(jié)中已經(jīng)提到并展示了如何添加遠(yuǎn)程倉(cāng)庫(kù)的示例,不過(guò)這里將告訴你如何明確地做到這一點(diǎn)。運(yùn)行 git remote add <shortname> <url> 添加一個(gè)新的遠(yuǎn)程 Git 倉(cāng)庫(kù),同時(shí)指定一個(gè)你可以輕松引用的簡(jiǎn)寫(xiě):

$ git remote
origin
$ git remote add pb https://github.com/paulboone/ticgit
$ git remote -v
origin  https://github.com/schacon/ticgit (fetch)
origin  https://github.com/schacon/ticgit (push)
pb  https://github.com/paulboone/ticgit (fetch)
pb  https://github.com/paulboone/ticgit (push)

現(xiàn)在你可以在命令行中使用字符串 pb 來(lái)代替整個(gè) URL。例如,如果你想拉取 Paul 的倉(cāng)庫(kù)中有但你沒(méi)有的信息,可以運(yùn)行 git fetch pb

$ git fetch pb
remote: Counting objects: 43, done.
remote: Compressing objects: 100% (36/36), done.
remote: Total 43 (delta 10), reused 31 (delta 5)
Unpacking objects: 100% (43/43), done.
From https://github.com/paulboone/ticgit
 * [new branch]      master     -> pb/master
 * [new branch]      ticgit     -> pb/ticgit

現(xiàn)在 Paul 的 master 分支可以在本地通過(guò) pb/master 訪問(wèn)到 - 你可以將它合并到自己的某個(gè)分支中,或者如果你想要查看它的話,可以檢出一個(gè)指向該點(diǎn)的本地分支。(我們將會(huì)在 Chapter?3 中詳細(xì)介紹什么是分支以及如何使用分支。)

從遠(yuǎn)程倉(cāng)庫(kù)中抓取與拉取

就如剛才所見(jiàn),從遠(yuǎn)程倉(cāng)庫(kù)中獲得數(shù)據(jù),可以執(zhí)行:

$ git fetch [remote-name]

這個(gè)命令會(huì)訪問(wèn)遠(yuǎn)程倉(cāng)庫(kù),從中拉取所有你還沒(méi)有的數(shù)據(jù)。執(zhí)行完成后,你將會(huì)擁有那個(gè)遠(yuǎn)程倉(cāng)庫(kù)中所有分支的引用,可以隨時(shí)合并或查看。

如果你使用 clone 命令克隆了一個(gè)倉(cāng)庫(kù),命令會(huì)自動(dòng)將其添加為遠(yuǎn)程倉(cāng)庫(kù)并默認(rèn)以 “origin” 為簡(jiǎn)寫(xiě)。所以,git fetch origin 會(huì)抓取克?。ɑ蛏弦淮巫ト。┖笮峦扑偷乃泄ぷ?。必須注意 git fetch 命令會(huì)將數(shù)據(jù)拉取到你的本地倉(cāng)庫(kù) - 它并不會(huì)自動(dòng)合并或修改你當(dāng)前的工作。當(dāng)準(zhǔn)備好時(shí)你必須手動(dòng)將其合并入你的工作。

如果你有一個(gè)分支設(shè)置為跟蹤一個(gè)遠(yuǎn)程分支(閱讀下一節(jié)與 Chapter?3 了解更多信息),可以使用 git pull 命令來(lái)自動(dòng)的抓取然后合并遠(yuǎn)程分支到當(dāng)前分支。這對(duì)你來(lái)說(shuō)可能是一個(gè)更簡(jiǎn)單或更舒服的工作流程;默認(rèn)情況下,git clone 命令會(huì)自動(dòng)設(shè)置本地 master 分支跟蹤克隆的遠(yuǎn)程倉(cāng)庫(kù)的 master 分支(或不管是什么名字的默認(rèn)分支)。運(yùn)行 git pull 通常會(huì)從最初克隆的服務(wù)器上抓取數(shù)據(jù)并自動(dòng)嘗試合并到當(dāng)前所在的分支。

推送到遠(yuǎn)程倉(cāng)庫(kù)

當(dāng)你想分享你的項(xiàng)目時(shí),必須將其推送到上游。這個(gè)命令很簡(jiǎn)單:git push [remote-name] [branch-name]。當(dāng)你想要將 master 分支推送到 origin 服務(wù)器時(shí)(再次說(shuō)明,克隆時(shí)通常會(huì)自動(dòng)幫你設(shè)置好那兩個(gè)名字),那么運(yùn)行這個(gè)命令就可以將你所做的備份到服務(wù)器:

$ git push origin master

只有當(dāng)你有所克隆服務(wù)器的寫(xiě)入權(quán)限,并且之前沒(méi)有人推送過(guò)時(shí),這條命令才能生效。當(dāng)你和其他人在同一時(shí)間克隆,他們先推送到上游然后你再推送到上游,你的推送就會(huì)毫無(wú)疑問(wèn)地被拒絕。你必須先將他們的工作拉取下來(lái)并將其合并進(jìn)你的工作后才能推送。閱讀 Chapter?3 了解如何推送到遠(yuǎn)程倉(cāng)庫(kù)服務(wù)器的詳細(xì)信息。

查看遠(yuǎn)程倉(cāng)庫(kù)

如果想要查看某一個(gè)遠(yuǎn)程倉(cāng)庫(kù)的更多信息,可以使用 git remote show [remote-name] 命令。如果想以一個(gè)特定的縮寫(xiě)名運(yùn)行這個(gè)命令,例如 origin,會(huì)得到像下面類似的信息:

$ git remote show origin
* remote origin
  Fetch URL: https://github.com/schacon/ticgit
  Push  URL: https://github.com/schacon/ticgit
  HEAD branch: master
  Remote branches:
    master                               tracked
    dev-branch                           tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

它同樣會(huì)列出遠(yuǎn)程倉(cāng)庫(kù)的 URL 與跟蹤分支的信息。這些信息非常有用,它告訴你正處于 master 分支,并且如果運(yùn)行 git pull,就會(huì)抓取所有的遠(yuǎn)程引用,然后將遠(yuǎn)程 master 分支合并到本地 master 分支。它也會(huì)列出拉取到的所有遠(yuǎn)程引用。

這是一個(gè)經(jīng)常遇到的簡(jiǎn)單例子。如果你是 Git 的重度使用者,那么還可以通過(guò) git remote show 看到更多的信息。

$ git remote show origin
* remote origin
  URL: https://github.com/my-org/complex-project
  Fetch URL: https://github.com/my-org/complex-project
  Push  URL: https://github.com/my-org/complex-project
  HEAD branch: master
  Remote branches:
    master                           tracked
    dev-branch                       tracked
    markdown-strip                   tracked
    issue-43                         new (next fetch will store in remotes/origin)
    issue-45                         new (next fetch will store in remotes/origin)
    refs/remotes/origin/issue-11     stale (use 'git remote prune' to remove)
  Local branches configured for 'git pull':
    dev-branch merges with remote dev-branch
    master     merges with remote master
  Local refs configured for 'git push':
    dev-branch                     pushes to dev-branch                     (up to date)
    markdown-strip                 pushes to markdown-strip                 (up to date)
    master                         pushes to master                         (up to date)

這個(gè)命令列出了當(dāng)你在特定的分支上執(zhí)行 git push 會(huì)自動(dòng)地推送到哪一個(gè)遠(yuǎn)程分支。它也同樣地列出了哪些遠(yuǎn)程分支不在你的本地,哪些遠(yuǎn)程分支已經(jīng)從服務(wù)器上移除了,還有當(dāng)你執(zhí)行 git pull 時(shí)哪些分支會(huì)自動(dòng)合并。

遠(yuǎn)程倉(cāng)庫(kù)的移除與重命名

如果想要重命名引用的名字可以運(yùn)行 git remote rename 去修改一個(gè)遠(yuǎn)程倉(cāng)庫(kù)的簡(jiǎn)寫(xiě)名。例如,想要將 pb 重命名為 paul,可以用 git remote rename 這樣做:

$ git remote rename pb paul
$ git remote
origin
paul

值得注意的是這同樣也會(huì)修改你的遠(yuǎn)程分支名字。那些過(guò)去引用 pb/master 的現(xiàn)在會(huì)引用 paul/master。

如果因?yàn)橐恍┰蛳胍瞥粋€(gè)遠(yuǎn)程倉(cāng)庫(kù) - 你已經(jīng)從服務(wù)器上搬走了或不再想使用某一個(gè)特定的鏡像了,又或者某一個(gè)貢獻(xiàn)者不再貢獻(xiàn)了 - 可以使用 git remote rm

$ git remote rm paul
$ git remote
origin
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)