-
1. 起步
-
2. Git 基礎
-
3. Git 分支
-
4. 伺服器上的 Git
- 4.1 協議
- 4.2 在伺服器上部署 Git
- 4.3 生成 SSH 公鑰
- 4.4 架設伺服器
- 4.5 Git Daemon
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 第三方託管服務
- 4.10 小結
-
5. 分散式 Git
-
A1. 附錄 A: Git 在其他環境
- A1.1 圖形介面
- A1.2 Visual Studio 中的 Git
- A1.3 Visual Studio Code 中的 Git
- A1.4 IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine 中的 Git
- A1.5 Sublime Text 中的 Git
- A1.6 Bash 中的 Git
- A1.7 Zsh 中的 Git
- A1.8 PowerShell 中的 Git
- A1.9 小結
-
A2. 附錄 B: 在應用程式中嵌入 Git
-
A3. 附錄 C: 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,這些 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 版本開始,如果未設定 如果你想要 Git 的預設行為(如果可能則快進,否則建立合併提交): 如果你想在拉取時進行變基: |
推送到你的遠端倉庫
當你的專案達到你想要分享的程度時,你需要將其推送到上游。該命令很簡單: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 remove
或 git remote rm
。
$ git remote remove paul
$ git remote
origin
一旦你以這種方式刪除對遠端倉庫的引用,所有與之相關的遠端跟蹤分支和配置設定也將被刪除。