在分支上工作

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

Get our popular Git Cheat Sheet for free!

About Us

As the makers of Tower, the best Git client for Mac and Windows, we help over 100,000 users in companies like Apple, Google, Amazon, Twitter, and Ebay get the most out of Git.

Just like with Tower, our mission with this platform is to help people become better professionals.

That's why we provide our guides, videos, and cheat sheets (about version control with Git and lots of other topics) for free.