# 遠程倉庫的使用
為了能在任意 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 remote add <shortname> <url>` 添加一個新的遠程 Git 倉庫,同時指定一個你可以輕松引用的簡寫:
~~~
$ 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` 訪問到 - 你可以將它合并到自己的某個分支中,或者如果你想要查看它的話,可以檢出一個指向該點的本地分支。(我們將會在 [Chapter?3](#) 中詳細介紹什么是分支以及如何使用分支。)
## 從遠程倉庫中抓取與拉取
就如剛才所見,從遠程倉庫中獲得數據,可以執行:
~~~
$ git fetch [remote-name]
~~~
這個命令會訪問遠程倉庫,從中拉取所有你還沒有的數據。執行完成后,你將會擁有那個遠程倉庫中所有分支的引用,可以隨時合并或查看。
如果你使用 `clone` 命令克隆了一個倉庫,命令會自動將其添加為遠程倉庫并默認以 “origin” 為簡寫。所以,`git fetch origin` 會抓取克隆(或上一次抓取)后新推送的所有工作。必須注意 `git fetch` 命令會將數據拉取到你的本地倉庫 - 它并不會自動合并或修改你當前的工作。當準備好時你必須手動將其合并入你的工作。
如果你有一個分支設置為跟蹤一個遠程分支(閱讀下一節與 [Chapter?3](#) 了解更多信息),可以使用 `git pull` 命令來自動的抓取然后合并遠程分支到當前分支。這對你來說可能是一個更簡單或更舒服的工作流程;默認情況下,`git clone` 命令會自動設置本地 master 分支跟蹤克隆的遠程倉庫的 master 分支(或不管是什么名字的默認分支)。運行 `git pull` 通常會從最初克隆的服務器上抓取數據并自動嘗試合并到當前所在的分支。
## 推送到遠程倉庫
當你想分享你的項目時,必須將其推送到上游。這個命令很簡單:`git push [remote-name] [branch-name]`。當你想要將 master 分支推送到 `origin` 服務器時(再次說明,克隆時通常會自動幫你設置好那兩個名字),那么運行這個命令就可以將你所做的備份到服務器:
~~~
$ git push origin master
~~~
只有當你有所克隆服務器的寫入權限,并且之前沒有人推送過時,這條命令才能生效。當你和其他人在同一時間克隆,他們先推送到上游然后你再推送到上游,你的推送就會毫無疑問地被拒絕。你必須先將他們的工作拉取下來并將其合并進你的工作后才能推送。閱讀 [Chapter?3](#) 了解如何推送到遠程倉庫服務器的詳細信息。
## 查看遠程倉庫
如果想要查看某一個遠程倉庫的更多信息,可以使用 `git remote show [remote-name]` 命令。如果想以一個特定的縮寫名運行這個命令,例如 `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 分支合并到本地 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 rm` :
~~~
$ git remote rm paul
$ git remote
origin
~~~
- 前言
- Scott Chacon 序
- Ben Straub 序
- 獻辭
- 貢獻者
- 引言
- 1. 起步
- 1.1 關于版本控制
- 1.2 Git 簡史
- 1.3 Git 基礎
- 1.4 命令行
- 1.5 安裝 Git
- 1.6 初次運行 Git 前的配置
- 1.7 獲取幫助
- 1.8 總結
- 2. Git 基礎
- 2.1 獲取 Git 倉庫
- 2.2 記錄每次更新到倉庫
- 2.3 查看提交歷史
- 2.4 撤消操作
- 2.5 遠程倉庫的使用
- 2.6 打標簽
- 2.7 Git 別名
- 2.8 總結
- 3. Git 分支
- 3.1 分支簡介
- 3.2 分支的新建與合并
- 3.3 分支管理
- 3.4 分支開發工作流
- 3.5 遠程分支
- 3.6 變基
- 3.7 總結
- 4. 服務器上的 Git
- 4.1 協議
- 4.2 在服務器上搭建 Git
- 4.3 生成 SSH 公鑰
- 4.4 配置服務器
- 4.5 Git 守護進程
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 第三方托管的選擇
- 4.10 總結
- 5. 分布式 Git
- 5.1 分布式工作流程
- 5.2 向一個項目貢獻
- 5.3 維護項目
- 5.4 總結
- 6. GitHub
- 6.1 賬戶的創建和配置
- 6.2 對項目做出貢獻
- 6.3 維護項目
- 6.4 管理組織
- 6.5 腳本 GitHub
- 6.6 總結
- 7. Git 工具
- 7.1 選擇修訂版本
- 7.2 交互式暫存
- 7.3 儲藏與清理
- 7.4 簽署工作
- 7.5 搜索
- 7.6 重寫歷史
- 7.7 重置揭密
- 7.8 高級合并
- 7.9 Rerere
- 7.10 使用 Git 調試
- 7.11 子模塊
- 7.12 打包
- 7.13 替換
- 7.14 憑證存儲
- 7.15 總結
- 8. 自定義 Git
- 8.1 配置 Git
- 8.2 Git 屬性
- 8.3 Git 鉤子
- 8.4 使用強制策略的一個例子
- 8.5 總結
- 9. Git 與其他系統
- 9.1 作為客戶端的 Git
- 9.2 遷移到 Git
- 9.3 總結
- 10. Git 內部原理
- 10.1 底層命令和高層命令
- 10.2 Git 對象
- 10.3 Git 引用
- 10.4 包文件
- 10.5 引用規格
- 10.6 傳輸協議
- 10.7 維護與數據恢復
- 10.8 環境變量
- 10.9 總結
- A. 其它環境中的 Git
- A1.1 圖形界面
- A1.2 Visual Studio 中的 Git
- A1.3 Eclipse 中的 Git
- A1.4 Bash 中的 Git
- A1.5 Zsh 中的 Git
- A1.6 Powershell 中的 Git
- A1.7 總結
- B. 將 Git 嵌入你的應用
- A2.1 命令行 Git 方式
- A2.2 Libgit2
- A2.3 JGit
- C. Git 命令
- A3.1 設置與配置
- A3.2 獲取與創建項目
- A3.3 快照基礎
- A3.4 分支與合并
- A3.5 項目分享與更新
- A3.6 檢查與比較
- A3.7 調試
- A3.8 補丁
- A3.9 郵件
- A3.10 外部系統
- A3.11 管理
- A3.12 底層命令