本篇文章会对git branch
命令进行一次深度审视,其内容还包含有关git分支模式的讨论。在很多现代版本控制系统内,分支都是一项必备功能。但在其他版本控制系统内,分支操作会相当昂贵,消耗时间精力和硬盘空间。在Git中,分支是每天开发过程中自然的一部分。Git的分支仅仅是指向快照的一个指针。当新增一个功能或者修改一个BUG时——无论工作量大小——都可以派生一个分支来包含这些改变。这既阻止了不稳定的代码合入主代码分支,也提供了一个在合并进主分支之前清理提交历史记录的机会。
文章图片
上图所示是一个仓库中主分支之外有两个独立的开发分支,一个是一次小的功能开发,另一个则是包含大功能的长期开发分支。当时用独立分支进行开发时,不仅能让两个独立功能并行开发,并同时保证了主分支
内不含有这两个独立分支中未开发完成的问题代码。
相对于其他版本控制工具,Git对于分支的实现轻量很多。其他工具对待分支时,是将文件从这个目录拷贝到那个目录。与此不同,Git对分支信息的保存是通过对commit的引用。具体地说,一个分支仅表示一个一系列commits的顶部commit引用——并不是一堆commits的容器。使用对这个commit的引用,可以通过commits之间的先后关系来确定一个分支的所有内容。
它是如何工作的
一个分支代表一个独立的开发工作。分支的概念其实是对编辑、暂存、提交这一整个流程的抽象。你可以将其想象为是在请求一整块全新工作区、暂存区,以及项目历史。新的commit记录仅会保存在当前分支的提交历史中,也就会在整个项目的历史记录中产生一个分叉。
git branch
命令允许对分支进行创建、列举、重命名以及删除的操作。它不能进行切换分支或者将分叉的commit记录扔到其他分支里。因此git branch
总是与git checkout
以及git merge
命令共同出现在使用场景中。
常见选项
git branch
列举仓库中的所有分支。此命令与
git branch --list
是同义词。git branch
创建一个名为
git branch -d
删除指定分支。这是一个安全的操作,因为当分支中含有未合并的变更时,Git会阻止这一次删除操作。
git branch -D
强制删除指定分支,即便其中含有未合并的变更。该命令常见于当开发者希望永久删除某一开发过程中的所有commit。
git branch -m
对于当前分支重命名为
git branch -a
列举所有远程分支。
创建分支 对于所有分支仅是对于commit的指针这一概念的深刻理解是非常重要的。当你创建一个分支时,Git所需要做的无非是创建一个新的指针,这一过程并不会对仓库进行任何修改。比如当你对如下图所示的仓库进行创建分支的操作:
文章图片
然后执行下面的命令来创建一个分支:
git branch crazy-experiment
此时的仓库提交历史没有任何变化。你得到的仅仅是指向当前commit的一个新指针。
文章图片
要注意此时你只是
创建
了这个分支。如需开始对新分支进行提交,要先选择这个新的分支,使用git checkout
命令,然后再使用标准流程git add
、git commit
等命令。创建远程分支 截至目前,我们所展示的操作都只关于本地分支。
git branch
命令也可以用于远程分支。为了操作远程分支,让我们先为仓库添加一个远程仓库。$ git remote add new-remote-repo https://bitbucket.com/user/repo.git
# Add remote repo to local repo config
$ git push crazy-experiment~
# pushes the crazy-experiment branch to new-remote-repo
以上命令先添加了名为
new-remote-repo
的远程仓库,然后将本地分支crazy-experiment
推向远程。删除分支 一旦完成了当前分支的开发内容,并将其合并到主分支之后,就可以放心的删除该分支,而不用担心会丢失任何提交历史:
git branch -d crazy-experiment
然而,如果分支没有被合并过,以上命令则会输出下面这样的错误信息:
error: The branch 'crazy-experiment' is not fully merged. If you are sure you want to delete it, run 'git branch -D crazy-experiment'.
它在向你抗议:如此操作将会丢失当前分支上的所有工作内容。如果你确定要删除该分支(比如当前分支的开发内容是一次失败的试验),你可以使用大写D的标记:
git branch -D crazy-experiment
这样删除操作后,无论什么状况都不会再出现任何警告信息,因此请谨慎使用。
上面的命令会删除该分支在本地仓库的拷贝。但远程仓库中仍然有这个分支的内容。如需删除远程仓库上的这个分支,请使用以下命令
git push origin --delete crazy-experiment
或者
git push origin :crazy-experiment
这会将删除信号推送给远程仓库,触发远程仓库删除
crazy-experiment
分支。总结 【使用分支 -- Git branch 命令】在这篇文档中,我们讨论了Git的分支行为和
git branch
命令。git branch
命令主要用于创建、列举、重命名以及删除分支。为了对产生的分支进行操作,git branch
命令总是与其他命令一起使用,比如git checkout
命令。