章節 ▾ 第二版

2.5 Git基礎 - 使用遠端倉庫

使用遠端倉庫

為了能夠協作開發任何 Git 專案,您需要了解如何管理您的遠端倉庫。遠端倉庫是您專案託管在網際網路或網路上的版本。您可以擁有多個遠端倉庫,每個倉庫通常對您來說要麼是隻讀的,要麼是讀寫兼備的。與他人協作涉及到管理這些遠端倉庫,並在需要共享工作時將資料推送到這些倉庫或從中拉取資料。管理遠端倉庫包括如何新增遠端倉庫、刪除不再有效的遠端倉庫、管理各種遠端分支並將它們定義為跟蹤或非跟蹤狀態,等等。在本節中,我們將介紹其中一些遠端管理技巧。

注意
遠端倉庫可以位於您的本地機器上。

完全有可能您正在處理一個“遠端”倉庫,但實際上它就在您所在的同一臺主機上。“遠端”一詞不一定意味著倉庫位於網路的另一端或網際網路上,只表示它在別處。處理這樣一個遠端倉庫仍然會涉及與任何其他遠端倉庫一樣的標準推送、拉取和獲取操作。

顯示您的遠端倉庫

要檢視您配置了哪些遠端伺服器,您可以執行 git remote 命令。它會列出您指定的每個遠端控制代碼的短名稱。如果您克隆了您的倉庫,至少應該會看到 origin — 這是 Git 預設給您克隆來源伺服器起的名稱。

$ 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

您還可以指定 -v,它會顯示 Git 為短名稱儲存的用於讀寫該遠端倉庫的 URL。

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

如果您有多個遠端倉庫,該命令會列出所有。例如,一個與多個協作者協作的倉庫可能看起來像這樣。

$ 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)

這意味著我們可以很方便地拉取任何一位使用者的貢獻。我們可能還有許可權推送到其中一個或多個倉庫,儘管這裡無法得知。

請注意,這些遠端倉庫使用了各種協議;我們將在 在伺服器上獲取 Git 中更詳細地介紹。

新增遠端倉庫

我們已經提到並演示了 git clone 命令如何為您隱式地新增 origin 遠端倉庫。以下是如何顯式新增新遠端倉庫的方法。要新增一個新的遠端 Git 倉庫併為其指定一個易於引用的短名稱,請執行 git remote add <shortname> <url>

$ 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)

現在您可以在命令列中使用字串 pb 而不是整個 URL。例如,如果您想獲取 Paul 所擁有的、但您倉庫中還沒有的所有資訊,您可以執行 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

Paul 的 master 分支現在可以在本地透過 pb/master 訪問 — 您可以將其合併到您的一個分支中,或者如果您想檢查它,可以 checkout 到該點的一個本地分支。我們將在 Git 分支 中更詳細地介紹分支是什麼以及如何使用它們。

從遠端倉庫獲取和拉取

正如您剛才看到的,要從您的遠端專案獲取資料,您可以執行:

$ git fetch <remote>

該命令會連線到遠端專案,並將您還沒有的該遠端專案的所有資料拉取下來。完成此操作後,您應該會有對該遠端所有分支的引用,您可以隨時合併或檢查它們。

如果您克隆了一個倉庫,該命令會自動將該遠端倉庫新增為名為“origin”的遠端。因此,git fetch origin 會獲取自您克隆(或上次獲取)以來推送到該伺服器的任何新工作。需要注意的是,git fetch 命令只將資料下載到您的本地倉庫 — 它不會自動與您的任何工作合併,也不會修改您當前正在進行的工作。準備好後,您需要手動將其合併到您的工作中。

如果您的當前分支設定為跟蹤遠端分支(有關更多資訊,請參閱下一節和 Git 分支),您可以使用 git pull 命令自動獲取然後將該遠端分支合併到您的當前分支。這可能對您來說是一種更簡單或更方便的工作流程;預設情況下,git clone 命令會自動設定您的本地 master 分支以跟蹤您克隆來源伺服器上的遠端 master 分支(或任何預設分支名)。執行 git pull 通常會從您最初克隆的伺服器獲取資料,並嘗試將其自動合併到您當前正在處理的程式碼中。

注意

從 Git 版本 2.27 開始,如果 pull.rebase 變數未設定,git pull 將會發出警告。Git 將會一直警告您,直到您設定該變數。

如果您想要 Git 的預設行為(如果可能則快進,否則建立合併提交):git config --global pull.rebase "false"

如果您想在拉取時進行 rebase:git config --global pull.rebase "true"

推送到您的遠端倉庫

當您的專案達到可以共享的點時,您需要將其推送到上游。用於此目的的命令很簡單:git push <remote> <branch>。如果您想將您的 master 分支推送到您的 origin 伺服器(再次強調,克隆通常會自動為您設定這兩個名稱),那麼您可以執行此命令將您已完成的任何提交推送到伺服器。

$ git push origin master

此命令僅在您從您具有寫入許可權的伺服器克隆,並且在此期間沒有人推送時才有效。如果您和另一個人同時克隆,他們先推送到上游,然後您再推送到上游,您的推送將被正確拒絕。您需要先獲取他們的工作並將其合併到您的工作之後,才允許您推送。有關如何推送到遠端伺服器的詳細資訊,請參閱 Git 分支

檢查遠端倉庫

如果您想檢視特定遠端倉庫的更多資訊,可以使用 git remote show <remote> 命令。如果您使用特定的短名稱(例如 origin)執行此命令,您會看到類似這樣的輸出:

$ 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)

它列出了遠端倉庫的 URL 以及跟蹤分支資訊。該命令還會很有用地告訴您,如果您當前在 master 分支上並執行 git pull,它將在獲取遠端的 master 分支後自動將其合併到本地分支。它還會列出它已拉取的所有遠端引用。

這是一個您很可能會遇到的簡單示例。然而,當您更深入地使用 Git 時,您可能會從 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)

此命令顯示當您在特定分支上執行 git push 時會自動推送到哪個分支。它還顯示您在伺服器上尚未擁有的遠端分支,您擁有但已從伺服器刪除的遠端分支,以及當您執行 git pull 時可以自動與遠端跟蹤分支合併的多個本地分支。

重新命名和刪除遠端倉庫

您可以透過執行 git remote rename 來更改遠端倉庫的短名稱。例如,如果您想將 pb 重新命名為 paul,您可以使用 git remote rename 來完成。

$ git remote rename pb paul
$ git remote
origin
paul

值得一提的是,這也會更改您所有的遠端跟蹤分支名稱。以前以 pb/master 引用的內容,現在以 paul/master 引用。

如果您因為某種原因想刪除一個遠端倉庫 — 比如伺服器已移動、不再使用某個映象,或者某個貢獻者不再貢獻 — 您可以使用 git remote removegit remote rm

$ git remote remove paul
$ git remote
origin

一旦您以這種方式刪除了對遠端倉庫的引用,所有與該遠端倉庫相關的遠端跟蹤分支和配置設定也會被刪除。