# 版本控制的基本工作流程
在我們開始搞明白 Git 命令之前,你有必要先了解一下版本控制的基本流程。這本書會向你一步步地詳細闡述各種不同的工作流程。但是首先還是讓我們先來一起了解一下版本控制的最基本的流程。
版本控制中的最基本的模塊就是 “倉庫(Repository)”。
##### 名詞解釋
#### 倉庫(Repository)
你可以把一個倉庫想象成一個數據庫,在那里你的版本控制系統存儲了項目積攢的所有版本和元數據(metadata)。在 Git 中,倉庫只是一個在你項目的根目錄下名為 “.git” 的隱藏文件夾。你只要知道有這個文件夾存在就足夠了。你沒有必要也不需要去接觸或是搞明白這個文件夾。
你有兩種方法可以來獲取一個本地倉庫到你的計算機上:
* (a) 如果在本地計算機中已經存在了一個項目,但是尚未納入版本控制系統中,你可以為這個項目初始化一個新的倉庫。
* (b) 如果你需要得到一個已經納入版本控制系統中的項目,而且它已經存放在一個遠程服務器中 (比如在互聯網或者是你的局域網中)。你只需要知道這個倉庫的 URL 地址,然后克隆 (下載/拷貝) 到你的本地計算機中就可以了。
**(1)** 只要你有了一個本地倉庫,你就可以在任何一個你常用的應用程序中 (例如:你最經常使用的編輯器,文件瀏覽器……) 開始你的工作了:修改、刪除、添加、拷貝、重命名或者是移動文件。在這里你不須要考慮任何其它的事情,完成項目所要求的改動就行了。
**(2)** 當你已經確定完成了這次改動或者操作,你就需要開始來再次考慮版本控制了。因為是時候打包并提交你的這些改動了。
##### 名詞解釋
#### 提交(Commit)
一次提交包含了一組特定的變化。提交的作者必須為這個變化做一個簡短的 "注釋(commit message)"。這將有助于別人或者改動者本人在以后的時間里很好地了解和明白這次提交的意圖,以及什么時間做了什么改動。
對于每組這樣的更改,版本控制系統都會為你的項目缺省的創建一個新的版本。也就是說,會為每次提交創建一個單獨的版本。這就是項目在這個特定時間點的快照(snapshot),版本控制系統會很有效的把這信息記錄下來,而不是簡單地對整個項目進行一次備份。并且提交也能非常準確的知道你的文件以及目錄的狀態和關系,并對它們進行有效的操作,例如:恢復項目到某些狀態。
**(3)** 然而在提交之前,如果你需要一個到目前這個時間點的詳細改動概況,那么在 Git 中,你可以使用 “status” 命令來得到一個與上一次提交對比之后的改動列表,比如哪些文件你做了改動,是否新建了一些新的文件,或者刪除了一些已存在的文件。
**(4)** 下一步,你需要告訴 Git ,在本地項目中你想打包哪些被改動的文件到下次的提交中。一個文件被改動了之后,并不意味著它會被自動打包在下次提交中。相反,你必須明確地指出你需要打包哪些文件。這就是說你必須要把它們添加到所謂的 “暫存區(Staging Area)”。
**(5)** 現在,在暫存區(Staging Area)中已經存在了一些改動過的文件,現在是時間真正的提交它們了。但是在這之前你還必須為它添加一個既簡短又明確的注釋(commit message),用來描述這次改動到底做了什么。提交完成后本地倉庫會被更新,然后為這個項目建立一個新的版本。
**(6)** 如果你想要查看一下整個項目的開發狀況(特別是處于團隊開發中),使用 "log" 命令就能看到按時間順序列出的所有提交的改動。這時你就可以看到有哪些改動以及那些改動的一些細節,從而更好的幫助你了解你的項目的發展狀況。
**(7)** 此外,當你處于團隊協作開發時,你需要和其它的開發團隊成員共享你的改動,同時也想了解其它成員所作的改動,這時一個在服務端的遠程倉庫(remote repository) 就可以用來進行這些數據交換。
##### 名詞解釋
#### 本地和遠程倉庫(Local & Remote Repositories)
兩種不同的倉庫類型:
* "本地" 倉庫(local repository) 是放置在你的本地計算機中的,它以一個隱藏文件夾的形式存儲在項目的根目錄(root folder) 中。你是唯一個有權通過提交改動來操作這個倉庫的用戶。
* "遠程" 倉庫(remote" repository)則相反,它通常是位于一個遠程服務器上的,比如在互聯網上或在你的局域網絡上。沒有任何工作文件與遠程倉庫相關聯:它沒有工作目錄(working directory),而是完全由 “.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