-
1. 開始
-
2. Git 基礎
- 2.1 取得一個 Git 倉儲
- 2.2 紀錄變更到版本庫中
- 2.3 檢視提交的歷史記錄
- 2.4 復原
- 2.5 與遠端協同工作
- 2.6 標籤
- 2.7 Git Aliases
- 2.8 總結
-
3. 使用 Git 分支
-
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 第3方 Git 託管方案
- 4.10 總結
-
5. 分散式的 Git
-
6. GitHub
- 6.1 建立帳戶及設定
- 6.2 參與一個專案
- 6.3 維護專案
- 6.4 Managing an organization
- 6.5 Scripting GitHub
- 6.6 總結
-
7. Git 工具
- 7.1 Revision Selection
- 7.2 Interactive Staging
- 7.3 Stashing and Cleaning
- 7.4 Signing Your Work
- 7.5 Searching
- 7.6 Rewriting History
- 7.7 Reset Demystified
- 7.8 Advanced Merging
- 7.9 Rerere
- 7.10 Debugging with Git
- 7.11 Submodules
- 7.12 Bundling
- 7.13 Replace
- 7.14 Credential Storage
- 7.15 總結
-
8. Customizing Git
- 8.1 Git Configuration
- 8.2 Git Attributes
- 8.3 Git Hooks
- 8.4 An Example Git-Enforced Policy
- 8.5 Summary
-
9. Git and Other Systems
- 9.1 Git as a Client
- 9.2 Migrating to Git
- 9.3 Summary
-
10. Git Internals
- 10.1 Plumbing and Porcelain
- 10.2 Git Objects
- 10.3 Git References
- 10.4 Packfiles
- 10.5 The Refspec
- 10.6 Transfer Protocols
- 10.7 Maintenance and Data Recovery
- 10.8 Environment Variables
- 10.9 Summary
-
A1. 附錄 A: Git in Other Environments
- A1.1 Graphical Interfaces
- A1.2 Git in Visual Studio
- A1.3 Git in Eclipse
- A1.4 Git in Bash
- A1.5 Git in Zsh
- A1.6 Git in Powershell
- A1.7 Summary
-
A2. 附錄 B: Embedding Git in your Applications
- A2.1 Command-line Git
- A2.2 Libgit2
- A2.3 JGit
-
A3. 附錄 C: Git Commands
- A3.1 Setup and Config
- A3.2 Getting and Creating Projects
- A3.3 Basic Snapshotting
- A3.4 Branching and Merging
- A3.5 Sharing and Updating Projects
- A3.6 Inspection and Comparison
- A3.7 Debugging
- A3.8 Patching
- A3.9 Email
- A3.10 External Systems
- A3.11 Administration
- A3.12 Plumbing Commands
2.5 Git 基礎 - 與遠端協同工作
與遠端協同工作
為了能在任意的 Git 專案上協同工作,你需要知道如何管理你的遠端版本庫。 遠端版本庫是指被託管在網際網路或其他網路中的各種專案版本庫。 你可以擁有許多遠端版本庫;通常來說,它如果不是唯讀的,就是可讀寫的。 與其它人協同工作包括了:「管理」遠端版本庫、以及將分享的資料「推送(push)」到端遠版本庫、或者從遠端版本庫「拉取(pull)」分享的資料: 管理遠端版本庫則包括了了解如何:「新增」遠端版本庫、「移除」不再有效的遠端版本庫、管理各式各樣的「遠端分支」、定義遠端分支是否被「追蹤」等等。 我們將在這一節介紹這些遠端管理技巧。
顯示你的遠端
使用 git remote
命令可以檢視你已經設定好的遠端版本庫,
它會列出每個遠端版本庫的「簡稱」。
如果你克隆(clone)了一個遠端版本庫,你至少看得到「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 用來讀寫遠端簡稱時所用的網址。
$ 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 對它有更多的說明。
新增遠端版本庫
我們在之前的章節中已經提過並給了一些範例來說明 clone
命令如何隱式地為你加入 origin
遠端;
而在這裡將說明如何「明確地」新增一個遠端。
選一個你可以輕鬆引用的簡稱,用來代表要新增的遠端 Git 版本庫,然後執行 git remote add <簡稱> <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
這個字串來代表整個網址;
例如,如果你想從 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
存取到(譯註:把 pb/master
想成 Paul 的 master 在你本地端的「分身」——實際上它被稱為「遠端追蹤分支(remote-tracking branch)」)——你可以把它合併(merge)到你的其中一個分支;或者,如果你想要檢視它的話,可以在它身上檢出(checkout)一個本地分支。
(我們將會在 [ch03-git-branching] 中詳細介紹什麼是分支以及如何使用它們。)
從你的遠端獲取或拉取
如同你剛剛所看到的,要從你的遠端專案中取得資料,你可以執行:
$ git fetch [remote-name]
這個命令會連到遠端專案,然後從遠端專案中將你還沒有的資料全部拉下來; 執行完成後,你應該會有那個遠端版本庫中所有分支的參照(reference)(譯註:再次強調,遠端的分支在本地端的分身——遠端追蹤分支),可以隨時用來合併或檢視。
如果你克隆了一個版本庫,clone
命令會自動增加一個「origin」來代表遠端版本庫;
所以,git fetch origin
會獲取(fetch)在你克隆(或者最後一次獲取)之後任何被推送到伺服器上的新的工作內容。
很重要的一點是:git fetch
命令只會下載資料到你的版本庫——它並不會自動合併你的任何工作內容,也不會自動修改你正在修改的東西;
當你準備好合併你的工作內容時,你必需用手動的方式進行合併。
如果你的目前分支被設定為「追蹤」遠端上的分支(閱讀下一節以及 [ch03-git-branching] 以了解更多資訊),你便可使用 git pull
命令來自動「獲取」並「合併」那個遠端分支到你目前的分支裡去;
由於 git clone
命令會「自動地」將本地分支 master 設定為「追蹤」遠端上的 master(無論預設分支叫什麼名稱。譯註:只要是預設分支都會自動設定追踨行為,而 master 常常是預設分支),這可能會讓你有比較輕鬆自在的工作流程:
只要執行 git pull
通常就會從你最初克隆的伺服器上獲取資料,然後試著自動合併到目前的分支。
推送到你的遠端
當你想分享你的專案成果時,你必需將它推送到上游。
推送的命令很簡單:git push [remote-name] [branch-name]
。
如果你想要將 master 分支推送到 origin
伺服器上時(再次說明,克隆時通常會自動地幫你設定好 master
和 origin
這二個名稱),那麼你可以執行這個命今將所有你完成的提交(commit)推送回伺服器上。
$ git push origin master
只有在你對克隆來源的伺服器有寫入權限,並且在這個當下還沒有其它人推送過,這個命令才會成功; 如果你和其它人同時做了克隆,然後他們先推送到上游,接著換你推送到上游,毫無疑問地你的推送會被拒絕; 你必需先獲取他們的工作內容,將其整併到你之前的工作內容,如此你才會被允許推送。 閱讀 [ch03-git-branching] 以了解更多關於「如何推送到遠端伺服器」的詳細資訊。
檢視遠端
如果你想要對一個特定遠端檢視更多資訊,你可以使用 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)
它同時列出了遠端版本庫的網址和「追蹤分支(tracking branch)」資訊。
這個命令很有用地告訴你:目前分支是 master(譯注:HEAD 意味著目前的),如果你執行 git pull
,它會在獲取所有遠端參照之後,自動將遠端的 master 合併到你的 master 分支。
它也會列出所有已抓下來的遠端參照(譯註:此例中指「master tracked」和「dev-branch tracked」)。
這是一個你很可能會遇到的簡單例子;
然而,當你更重度地使用 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
時,它將自動推送到哪一個遠端分支;
它也顯示了:哪些遠端分支是在你的本地端還沒有的(譯註:new 屬性)、哪些你曾獲取過的遠端分支已經在遠端上被移除了(譯註:stale 屬性)、哪些本地分支是有能力在執行 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