在分支上工作
到目前为止,我们还没有在我们项目上使用过分支。然而你并不知道,我们实际已经工作在了一个分支上了。这是因为在 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” 分支上进行新功能的开发了。但这个改动并不属于这个新定义的功能,我们该怎么做呢?一种方法就是,提交这个还未完成的工作,以后继续来完成它。但是提交一个还未完成的工作是个很不好的习惯。
黄金法则
No. 4: 不要提交一个还未完成的工作
不要提交一个还未完成的工作,但这也并不意味着在提交前你必须要完成这个功能定义的所有需求。恰恰相反,对于一个很大的功能模块来说,要把它正确分割成小的完整的逻辑块,用来进行频繁的提交。但是,千万不要为了得到一个干净的工作副本(working copy)而提交一些不完整的改动。在这种情况下,你可以考虑使用 Git 提供的 “Stash” 功能。