@

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

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

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

1、檢視遠端倉庫:git remote

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



你也可以指定選項 -v,會顯示需要讀寫遠端倉庫使用的 Git 儲存的簡寫與其對應的 URL



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

$ 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 [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: 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 時哪些本地分支可以與它跟蹤的遠端分支自動合併。

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

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



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

如果因為一些原因想要移除一個遠端倉庫——你已經從伺服器上搬走了或不再想使用某一個特定的映象了, 又或者某一個貢獻者不再貢獻了——可以使用 git remote removegit remote rm



一旦你使用這種方式刪除了一個遠端倉庫,那麼所有和這個遠端倉庫相關的遠端跟蹤分支以及配置資訊也會一起被刪除。