# 在分支上工作
到目前为止,我们还没有在我们项目上使用过分支。然而你并不知道,我们实际已经工作在了一个分支上了。这是因为在 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