Git
章節 ▾ 第二版

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 <簡稱> <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