章節 ▾ 第二版

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,這些 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 訪問——你可以將其合併到你的某個分支中,如果你想檢查它,也可以在該點檢出一個本地分支。我們將在 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"

如果你想在拉取時進行變基: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

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

scroll-to-top