版本分支

在本教程中,我们将了解git版本控制系统中最重要的一个功能 - 分支。

为什么需要分支?

到目前为止,我们只在一个分支上工作 - master分支,它是我们创建新存储库时的默认分支。

一般来说,master分支代表着代码的稳定版本,它一般是可以发布的代码。出于这个原因,我们真的不想在主分支上进行新功能的代码开发,以防它把代码搞乱。

我们真正想要做的是,如果我们想为我们的应用程序添加一个新功能,那我们就来创建一个隔离的环境来试验这个新功能,直到它最后完成并且测试通过,我们可以将这个新功能合并到master分支。

我们不向主分支添加更多提交,而是将新分支作为隔离环境工作并测试新功能。

创建新分支

$ git branch test_branch

当我们创建test_branch分支时,我们做的是其实是将master分支的代码状态复制到新分支的开始,然后我们可以在这个test_branch分支中工作。

你可以通过git branch列出工作区上的可用分支,

$ git branch
* master
  test_branch

此处列出了新创建的test_branch,以及master主分支。

但是现在,工作区仍然在主分支上,尽管你刚刚创建了新分支。*号后面的分支是当前的工作分支。

你需要切换到新分支才能开始在此分支上工作,

$ git checkout test_branch
Switched to branch 'test_branch'
D       test1_rename.txt

它说现在它被切换到test_branch分支,如果你再做一次git branch

$ git branch
  master
* test_branch

然后我们将看到我们现在在test_branch分支,因为星号*已经在test_branch之前而不再是master之前。

让我们添加一些文本到文件test3.txt中,比如This is the added line in branch test_branch.

现在,如果我们来查看git status,你会发现git已经发现了此文件修改。

$ git status
On branch test_branch
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:   test3.txt

no changes added to commit (use "git add" and/or "git commit -a")

我们可以将这些更改提交到版本库中,具体的方法我们已经在上节中介绍过了。

我们所做的是我们创建了这个新分支并进行了一些与master分支隔离的更改。master分支中的代码保持不变

删除分支

在我们对添加到分支的新功能感到满意之后,我们可以将其删除。

$ git checkout master
$ git branch -d test_branch
error: The branch 'test_branch' is not fully merged.
If you are sure you want to delete it, run 'git branch -D test_branch'.

branch后面的-d参数表示它将删除指定的分支。

在这里,我们会看到一个错误说The branch 'test_branch' is not fully merged. If you are sure you want to delete it, run 'git branch -D test_branch'.。小写d仅在我们已经合并分支后才起作用,但大写D可以强制删除分支。我们将在接下来的章节中介绍如何合并分支,但是现在,让我们使用大写 D来强制删除这个分支。

$ git branch -D test_branch
Deleted branch test_branch (was 7d6bca6).

如果你现在检查工作区的可用分支,它显示只有master分支了。

$ git branch
* master

同时创建并切换成新分支

上面介绍的工作流程是首先通过git branch来创建分支,然后使用git checkout来将工作区切换成此分支。

我们还有一种更快捷的方法将这两个步骤合二为一。

$ git checkout -b new_test_branch
Switched to a new branch 'new_test_branch'
M       test3.txt

它的作用是创建一个分支并自动切换成此分支。因此,我们不必单独执行上面的两步走。