# 在分支上工作
到目前為止,我們還沒有在我們項目上使用過分支。然而你并不知道,我們實際已經工作在了一個分支上了。這是因為在 Git 上的分支功能并不是可選的,你永遠會工作在一個分支中的(當前的 “**active**”,或者 “**checked out**”,或者 “**HEAD**”分支)。
那么 Git 是如何知道你當前在哪個分支上工作的呢? “git status” 命令輸出的第一行會向我們顯示出 “在主分支(branch master)上”。
這個 “master” 分支是 Git 在建立項目的同時自動為我們建立的。盡管可以刪除或者是為它重命名,但是你很少能看到一個沒有 “master” 分支的項目,因為基本上大家都會保留它。在這里不要覺得這個 “master” 代表一個很特殊的含義,或者是它是一個與眾不同的分支,它其實就是一個和別的分支一樣普通的分支而已!
現在讓我們來在項目上開始開發一個新的功能吧!在當前的項目狀態下,我們建立一個新的分支,并且命名為 “contact-form”:
```
$ git branch contact-form
```
使用 “git branch” 命令來顯示出所有在項目中已經存在的分支,而且可以使用參數 “-v” 來顯示出很多的信息:
```
$ git branch -v
contact-form 3de33cc Implement the new login box
* master 3de33cc [ahead 1] Implement the new login box
```
你可以看到那個我們新建立的分支 “contact-form”,而且它是基于相同版本的 “master” 分支。除此之外,那個星號(*)旁邊的 “master” 代表了這個分支是我們當前的 HEAD 分支。必須強調一下 "git branch" 命令僅僅“建立”了一個新的分支,但不會“自動切換”到這個分支上去。在我們切換到那個新的分支之前,最好我們使用一個 “git status” 命令來看看當前項目的狀態:
```
$ git status
# On branch master
# 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: imprint.html
#
no changes added to commit (use "git add" and/or "git commit -a")
```
雖然現在仍然還有一些對文件 “imprint.html” 的改動在工作副本(working copy)中,但是現在我們必須馬上切換到那個新的 “contact-form” 分支上進行新功能的開發了。但這個改動并不屬于這個新定義的功能,我們該怎么做呢?一種方法就是,提交這個還未完成的工作,以后繼續來完成它。但是提交一個還未完成的工作是個很不好的習慣。
##### 黃金法則
#### #4: 不要提交一個還未完成的工作
不要提交一個還未完成的工作,但這也并不意味著在提交前你必須要完成這個功能定義的所有需求。恰恰相反,對于一個很大的功能模塊來說,要把它正確分割成小的完整的邏輯塊,用來進行頻繁的提交。但是,千萬不要為了得到一個干凈的工作副本(working copy)而提交一些不完整的改動。在這種情況下,你可以考慮使用 Git 提供的 “Stash” 功能。
- Learn Version Control with Git 中文版
- 前言
- Part 1 - 基礎知識
- 什么是版本控制?
- 為什么要使用版本控制系統?
- 準備工作
- 版本控制的基本工作流程
- 從一個未被納入版本控制的項目開始
- 從一個已被納入版本控制的項目開始
- 工作在你的項目上
- Part 2 - 分支與合并
- 分支可以改變你的生命
- 在分支上工作
- 暫時保存更改
- 切換一個本地分支
- 合并改動
- 分支的工作流程
- Part 3 - 遠程倉庫
- 關于遠程倉庫
- 連接一個遠程倉庫
- 查看遠程數據
- 整合遠程的改動
- 發布一個本地分支
- 刪除分支
- Part 4 - 高級應用
- 撤銷操作
- 用 diff 來檢查改動
- 處理合并沖突
- Rebase 代替合并
- 子模塊
- git-flow 的工作流程
- 使用 SSH 公鑰驗證
- Part 5 - 工具與服務
- 桌面應用程序
- 比較和整合工具
- 代碼托管服務
- 更多學習資源
- 附錄
- 版本控制的最佳實踐
- 命令 101
- 從 Subversion 過渡到 Git
- 為什么選擇 Git