Git(9)– 遠程倉庫的使用

@

超詳細 Git 圖文版小白教程(持續更新)

為了能在任意 Git 項目上協作,你需要知道如何管理自己的遠程倉庫。 遠程倉庫是指託管在網際網路或其他網路中的你的項目的版本庫。 你可以有好幾個遠程倉庫,通常有些倉庫對你只讀,有些則可以讀寫。 與他人協作涉及管理遠程倉庫以及根據需要推送或拉取數據。 管理遠程倉庫包括了解如何添加遠程倉庫、移除無效的遠程倉庫、管理不同的遠程分支並定義它們是否被跟蹤等等。 在本節中,我們將介紹一部分遠程管理的技能。

遠程倉庫可以在你的本地主機上: 你完全可以在一個「遠程」倉庫上工作,而實際上它在你本地的主機上。詞語「遠程」未必表示倉庫在網路或互聯網上的其它位置,而只是表示它在別處。在這樣的遠程倉庫上工作,仍然需要和其它遠程倉庫上一樣的標準推送、拉取和抓取操作。

1、查看遠程倉庫:git remote

如果想查看你已經配置的遠程倉庫伺服器,可以運行 git remote 命令。 它會列出你指定的每一個遠程伺服器的簡寫。 如果你已經克隆了自己的倉庫,那麼至少應該能看到 origin ——這是 Git 給你克隆的倉庫伺服器的默認名字:

在這裡插入圖片描述
你也可以指定選項 -v,會顯示需要讀寫遠程倉庫使用的 Git 保存的簡寫與其對應的 URL

在這裡插入圖片描述
如果你的遠程倉庫不止一個,該命令會將它們全部列出。 例如,與幾個協作者合作的,擁有多個遠程倉庫的倉庫看起來像下面這樣:

$ cd grit
$ git remote -v
bakkdoor  //github.com/bakkdoor/grit (fetch)
bakkdoor  //github.com/bakkdoor/grit (push)
cho45     //github.com/cho45/grit (fetch)
cho45     //github.com/cho45/grit (push)
defunkt   //github.com/defunkt/grit (fetch)
defunkt   //github.com/defunkt/grit (push)
koke      git://github.com/koke/grit.git (fetch)
koke      git://github.com/koke/grit.git (push)
origin    [email protected]:mojombo/grit.git (fetch)
origin    [email protected]:mojombo/grit.git (push)

這表示我們能非常方便地拉取其它用戶的貢獻。我們還可以擁有向他們推送的許可權。

2、添加遠程倉庫:git remote add <shortname> <url>

我們在之前的章節中已經提到並展示了 git clone 命令是如何自行添加遠程倉庫的, 不過這裡將告訴你如何自己來添加它。 運行 git remote add <shortname> <url> 添加一個新的遠程 Git 倉庫,同時指定一個方便使用的簡寫:

在這裡插入圖片描述
現在你可以在命令行中使用字元串 tf 來代替整個 URL。如果你想拉取testfirst 的倉庫中有但你沒有的資訊,可以運行 git fetch tf

在這裡插入圖片描述
現在 testfirstmain分支可以在本地通過 tf/main 訪問到——你可以將它合併到自己的某個分支中, 或者如果你想要查看它的話,可以檢出一個指向該點的本地分支。

3、從遠程倉庫中抓取與拉取:git fetchgit pull

就如剛才所見,從遠程倉庫中獲得數據,可以執行:

git fetch <remote>

這個命令會訪問遠程倉庫,從中拉取所有你還沒有的數據。 執行完成後,你將會擁有那個遠程倉庫中所有分支的引用,可以隨時合併或查看。

如果你使用 clone 命令克隆了一個倉庫,命令會自動將其添加為遠程倉庫並默認以 「origin」 為簡寫。 所以,git fetch origin 會抓取克隆(或上一次抓取)後新推送的所有工作。 必須注意 git fetch 命令只會將數據下載到你的本地倉庫——它並不會自動合併或修改你當前的工作。 當準備好時你必須手動將其合併入你的工作。

如果你的當前分支設置了跟蹤遠程分支, 那麼可以用 git pull 命令來自動抓取後合併該遠程分支到當前分支。 這或許是個更加簡單舒服的工作流程。默認情況下,git clone 命令會自動設置本地 master 分支跟蹤克隆的遠程倉庫的 master 分支(或其它名字的默認分支)。 運行 git pull 通常會從最初克隆的伺服器上抓取數據並自動嘗試合併到當前所在的分支。

4、推送到遠程倉庫:git push <remote> <branch>

當你想分享你的項目時,必須將其推送到上游。 這個命令很簡單:git push <remote> <branch>。 當你想要將 master 分支或main分支推送到 origin 伺服器時(再次說明,克隆時通常會自動幫你設置好那兩個名字), 那麼運行這個命令就可以將你所做的備份到伺服器:

git push origin mastergit push origin main

只有當你有所克隆伺服器的寫入許可權,並且之前沒有人推送過時,這條命令才能生效。 當你和其他人在同一時間克隆,他們先推送到上游然後你再推送到上游,你的推送就會毫無疑問地被拒絕。 你必須先抓取他們的工作並將其合併進你的工作後才能推送。
在這裡插入圖片描述

5、查看某個遠程倉庫:git remote show <remote>

如果想要查看某一個遠程倉庫的更多資訊,可以使用 git remote show <remote> 命令。 如果想以一個特定的縮寫名運行這個命令,例如 origin,會得到像下面類似的資訊:
在這裡插入圖片描述
它同樣會列出遠程倉庫的 URL 與跟蹤分支的資訊。 這些資訊非常有用,它告訴你正處於 main 分支,並且如果運行 git pull, 就會抓取所有的遠程引用,然後將遠程 main 分支合併到本地 main 分支。 它也會列出拉取到的所有遠程引用。

這是一個經常遇到的簡單例子。 如果你是 Git 的重度使用者,那麼還可以通過 git remote show 看到更多的資訊。

$ git remote show origin
* remote origin
  URL: //github.com/my-org/complex-project
  Fetch URL: //github.com/my-org/complex-project
  Push  URL: //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 時哪些本地分支可以與它跟蹤的遠程分支自動合併。

6、遠程倉庫的重命名與移除:git remote renamegit remote rm

你可以運行 git remote rename 來修改一個遠程倉庫的簡寫名。 例如,想要將 tf 重命名為 ak,可以用 git remote rename 這樣做:

在這裡插入圖片描述
值得注意的是這同樣也會修改你所有遠程跟蹤的分支名字。 那些過去引用 tf/main 的現在會引用 ak/main

如果因為一些原因想要移除一個遠程倉庫——你已經從伺服器上搬走了或不再想使用某一個特定的鏡像了, 又或者某一個貢獻者不再貢獻了——可以使用 git remote removegit remote rm
在這裡插入圖片描述
一旦你使用這種方式刪除了一個遠程倉庫,那麼所有和這個遠程倉庫相關的遠程跟蹤分支以及配置資訊也會一起被刪除。

在這裡插入圖片描述