# 查看遠程數據
在我們新建了與某個遠程倉庫的連接之后,它到底改變了什么?現在讓我們來看看分支列表:
```
$ git branch -va
contact-form 56eddd1 Add new contact form page
* master 56eddd1 Add new contact form page
remotes/origin/HEAD -> origin/master
remotes/origin/master 2b504be Change headlines for about and imprint
```
顯然并沒有太大的變化,始終是我們那兩個本地分支(“master” 和 “contact-form”)以及兩個在 “origin” 上的遠程分支(“remotes/origin/HEAD” 和 “remotes/origin/master”)。為什么我們沒有看到那個新的遠程鏈接 “crash-course-remote” 呢?因為通過命令 “git remote add”,我們僅僅建立了一種關系,還沒有進行任何數據交換。
##### 概念
#### 遠程數據是一個快照(Snapshot)
Git 會在你的本地倉庫中保存遠程數據的信息(例如分支,提交等等)。但是它并不是 “實時地” 連接到你的遠程倉庫上的。例如,其他團隊成員在這個遠程倉庫中所提交的新改動或是發布的分支,是不能自動地與你分享的,因為你必須**明確地**告訴 Git 去升級你的本地倉庫!
關于遠程的分支,遠程的提交等等信息只會按照你的要求更新到最新的一個快照。Git 不會在后臺 “自動” 升級這些信息。
要更新有關遠程的信息,你必須明確地請求這個數據。在這里可以使用最為常用的,“抓取(Fetch)” 操作來完成:
```
$ git fetch crash-course-remote
From https://github.com/gittower/git-crash-course-remote
* [new branch] faq-content -> crash-course-remote/faq-content
* [new branch] master -> crash-course-remote/master
```
“抓取” 操作不會改動你任何的本地分支或是在你工作副本中的文件。這個操作僅僅為你從一個特定遠程倉庫下載你所需要的數據,并設置為可見。你可以在之后決定是否需要整合這些新的改動本地項目中來。
在我們完成了關于 “crash-course-remote” 升級后,讓我們一起來看一下現在發生了什么變化:
```
$ git branch -va
contact-form 56eddd1 Add new contact form page
* master 56eddd1 Add new contact form page
remotes/crash-course-remote/faq-content e29fb3f Add FAQ questions
remotes/crash-course-remote/master 2b504be Change headlines f...
remotes/origin/HEAD -> origin/master
remotes/origin/master 2b504be Change headlines for about and imprint
```
很好,我們看到了這個遠程分支的 “crash-course-remote” 的信息了。
現在準備開始在分支 “faq-content” 上工作吧!但是現在它只是一個遠程分支的指針。為了能夠真正地在這個分支上工作,并且切換當前工作副本(working copy)的內容,我們需要創建一個基于這個遠程的本地分支。執行 “git checkout” 命令來切換到這個遠程分支:
```
$ git checkout --track crash-course-remote/faq-content
Branch faq-content set up to track remote branch faq-content from crash-course-remote.
Switched to a new branch 'faq-content'
$ git branch -va
contact-form 56eddd1 Add new contact form page
* faq-content e29fb3f Add FAQ questions
master 56eddd1 Add new contact form page
remotes/crash-course-remote/faq-content e29fb3f Add FAQ questions
remotes/crash-course-remote/master 2b504be Change headlines f...
remotes/origin/HEAD -> origin/master
remotes/origin/master 2b504be Change headlines for about and imprint
```
這個命令完成了一系列的操作:
* (a) 它創建了一個同名的本地分支(“faq-content”)。
* (b) 它簽出(check out)了這個新建的的分支,把它設置成當前的本地 HEAD ,然后更新了你的工作副本,并且關聯到分支文件的最新版本上去。
* (c) 由于我們使用了 “--track” 參數,它會在新的本地分支和它所位于的遠程分支之間創建一個跟蹤聯系 “tracking relationship”。
#### 跟蹤分支
一般來說,分支之間并無任何關系。然而我們可以定義一個本地分支去 “跟蹤 (track)” 一個遠程分支。這樣 Git 就會通知你,如果那個被跟蹤的遠程分支發生了一些新的提交,而它們并不存在于這個關聯的本地分支中時:
* 如果在你的本地分支上提交了一些改動,而且你也并沒有發布它和推送到遠程倉庫中。相對于這些提交來說你的本地分支就 “**領先(ahead)**” 于那些它所對應的遠程分支。
* 如果團隊的其他開發人員提交并且發布了一些改動到遠程倉庫中,這時遠程倉庫就擁有了那些你還沒有下載到本地倉庫的提交。你的本地倉庫就 “**落后(behind)**” 于它所關聯的遠程倉庫。

如果分支間存在 “跟蹤” 聯系,當你使用 “git status” 命令時,Git 顯示出所有關聯分支上的差異:
```
$ git status
# On branch dev
# Your branch and 'origin/dev' have diverged,
# and have 1 and 2 different commits each, respectively.
#
nothing to commit (working directory clean)
```
當在一個已存在的遠程分支的基礎上來建立本地分支時,創建這個 “跟蹤” 聯系是很簡單的,可以使用 “git checkout” 命令加 “--track” 參數來完成。
在切換到那個新創建的本地分支 “faq-content” 后, 我們已經自動擁有了這個 “跟蹤” 聯系。來讓我們對這個工作副本中的文件 “faq.html” 進行一些修改吧!(如何更改這個文件就不詳細介紹了,發揮你的想象力吧):
```
$ git status
# On branch faq-content
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working
# directory)
#
# modified: faq.html
#
no changes added to commit (use "git add" and/or "git commit -a")
$ git add faq.html
$ git commit -m "Add new question"
[faq-content 814927a] Add new question
1 file changed, 1 insertion(+)
```
現在,是時候把這些新的改動共享給其他開發人員了:
```
$ git push
```
##### 注釋
在你的本地計算機上,這個 “git push” 命令將會被遠程倉庫**拒絕**掉,因為你現在還沒有獲得這個遠程倉庫的修改權限。如果你想要繼續的嘗試這個操作,我建議你建立一個自己的遠程倉庫,例如:[GitHub](http://www.github.com) 或者 [Beanstalk](http://beanstalkapp.com/pricing?ad=tower)。
“git push” 命令將會把當前 HEAD 分支上所有新的提交上傳到它所關聯的遠程分支上去。
##### 概念
#### 回顧 “跟蹤” 聯系
“git push” 命令默認地要求我們為它提供兩個信息:
* (a) 你想要推送到哪一個遠程倉庫上去?
* (b) 你想要推送到那個遠程倉庫上的哪一個分支上去?
這個完整的命令應該是這樣的: `$ git push crash-course-remote faq-content` 我們已經設置了 “跟蹤” 聯系,也就是說我們已經為那個本地分支定義了一個 “ 遠程對應的(remote counterpart)” 分支。在我們使用 “git push” and “git pull” 命令時,我們不需要特別地給出那些參數, Git 會自動地使用這些已經定義好的 “跟蹤” 信息。
- Learn Version Control with Git 中文版
- 前言
- Part 1 - 基礎知識
- 什么是版本控制?
- 為什么要使用版本控制系統?
- 準備工作
- 版本控制的基本工作流程
- 從一個未被納入版本控制的項目開始
- 從一個已被納入版本控制的項目開始
- 工作在你的項目上
- Part 2 - 分支與合并
- 分支可以改變你的生命
- 在分支上工作
- 暫時保存更改
- 切換一個本地分支
- 合并改動
- 分支的工作流程
- Part 3 - 遠程倉庫
- 關于遠程倉庫
- 連接一個遠程倉庫
- 查看遠程數據
- 整合遠程的改動
- 發布一個本地分支
- 刪除分支
- Part 4 - 高級應用
- 撤銷操作
- 用 diff 來檢查改動
- 處理合并沖突
- Rebase 代替合并
- 子模塊
- git-flow 的工作流程
- 使用 SSH 公鑰驗證
- Part 5 - 工具與服務
- 桌面應用程序
- 比較和整合工具
- 代碼托管服務
- 更多學習資源
- 附錄
- 版本控制的最佳實踐
- 命令 101
- 從 Subversion 過渡到 Git
- 為什么選擇 Git