项目的分支管理
Git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针。Git 会使用 master 作为分支的默认名字。在若干次提交后,你其实已经有了一个指向最后一次提交对象的 master 分支,它在每次提交的时候都会自动向前移动。
如果你没有指定当前的分支的名字,git会自动的使用master作为当前的分支的名字,并且有个指针指向当前的工作的分支,每次提交项目后会自动的更新master指针到最新的版本中。
每次提交,都会有一个对当前版本的所有文件的快照的指针,这个指针指向当前版本的文件快照,通过这个快照,可以找到对应版本的所有的文件。而且,每个指针都有个父指针,指向上一个软件版本。通过这个版本,很容易找个以前版本的快照指针。
那么,Git 又是如何创建一个新的分支的呢?答案很简单,创建一个新的分支指针。比如新建一个 testing 分支,可以使用 git branch
命令:
$ git branch testing
这会在当前 commit 对象上新建一个分支指针(见图 3-4)。
创建新的分支以后,并不会自动的转换到新的分支上进行工作,而是还是在原来的分支中进行开发,需要手动的转换需要开发的分支。
Git 是如何知道你当前在哪个分支上工作的呢?其实答案也很简单,它保存着一个名为 HEAD 的特别指针。请注意它和你熟知的许多其他版本控制系统(比如 Subversion 或 CVS)里的 HEAD 概念大不相同。在 Git 中,它是一个指向你正在工作中的本地分支的指针。运行 git branch
命令,仅仅是建立了一个新的分支,但不会自动切换到这个分支中去,所以在这个例子中,我们依然还在 master 分支里工作
要切换到其他分支,可以执行 git checkout
命令。我们现在转换到新建的 testing 分支:
$ git checkout testing
这样 HEAD 就指向了 testing 分支
现在假设,在v0.1的基础版本上,我们的税收计算软件想要开辟欧洲市场,我们又需要充分的利用当前的软件开发的基础。所以我们从当前的v0.1的版本上拉出一个新的分支,开发用户在欧洲销售的财务软件。因为欧洲的财务软件的设置,税收比例,采用的税收算法,网络通信控制,用户界面等都不一样,所以需要拉出一个新的分支进行开发。
这里我们假设拉出的新的分支叫做europe.
watkins@watkins:~/watkins/finance$ git branch europe watkins@watkins:~/watkins/finance$ git checkout europe M funciton1 Switched to branch 'europe' watkins@watkins:~/watkins/finance$
切换到europe分支中,新建名为function3的文件,并添加些专门用于给europe分支用代码。
然后提交这些代码。
watkins@watkins:~/watkins/finance$ git add funciton3 watkins@watkins:~/watkins/finance$ git status # On branch europe # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: funciton3 # watkins@watkins:~/watkins/finance$ git commit [europe 318a182] add function3 1 file changed, 1 insertion(+) create mode 100644 funciton3 watkins@watkins:~/watkins/finance$ git push origin europe To https://github.com/weixingstudio/finance.git * [new branch] europe -> europe watkins@watkins:~/watkins/finance$
watkins@watkins:~/watkins/finance/config$ vim configuration watkins@watkins:~/watkins/finance/config$ cd .. watkins@watkins:~/watkins/finance$ git status # On branch europe # 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: config/configuration # no changes added to commit (use "git add" and/or "git commit -a") watkins@watkins:~/watkins/finance$ git add config/ watkins@watkins:~/watkins/finance$ git status # On branch europe # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: config/configuration # watkins@watkins:~/watkins/finance$ git commit [europe d2c4e14] modified the location and timezone 1 file changed, 2 insertions(+), 2 deletions(-) watkins@watkins:~/watkins/finance$ git push origin europe To https://github.com/weixingstudio/finance.git 318a182..d2c4e14 europe -> europe watkins@watkins:~/watkins/finance$
然后看一下我们的分支的图: