Git入门教程(二):分支的使用

       如果你严肃对待编程,就必定会使用"版本管理系统"(Version Control System)。(见参考资料1)

       我对分支的理解是,就是单元测试。新建一个分支(主要分为:开发分支、测试分支、预发布分支、修补bug分支、临时分支),然后在分支里实现最终目标,最后再将分支合并到原有主分支(即默认的master分支)。我主要使用的是开发分支、测试分支,另外三个分支会集成到master分支上。

       在 git 版本库中创建分支的成本几乎为零,所以,不必吝啬多创建几个分支。当第一次执行git init时,系统就会创建一个名为“master”的分支。 而其它分支则通过手工创建。 
下面列举一些常见的分支策略: 
       1、创建一个属于自己的个人工作分支,以避免对主分支 master 造成太多的干扰,也方便与他人交流协作;
       2、当进行高风险的工作时,创建一个试验性的分支;
       3、合并别人的工作的时候,最好是创建一个临时的分支用来合并,合并完成后再“fetch”到自己的分支;
       4、对分支进行增、删、查等操作。 
       注意:分支信息一般在.git/refs/目录下,其中heads目录下为本地分支,remotes为对应服务器上的分支,tags为标签。 

一、分支的基本操作

       git branch (列出本地git库中的所有分支。在列出的分支中,若分支名前有*,则表示此分支为当前分支。)
       git branch –r (列出所有分支,包含本地分支和服务器分支。)
       git checout –b 分支名 (不但创建了分支,还将当前工作分支切换到了该分支上。)
       git checkout 分支名 (切换到某个分支)
       git branch –D 分支名 (删除后,发生在该分支的所有变化都无法恢复。)
        Git入门教程(二):分支的使用_第1张图片

二、分支信息查看

       git show-branch (查看当前分支的提交注释及信息) 
       git show-branch --all(查看所有分支的提交注释及信息)
       同时也可以使用git log查看当前分支的详细信息。
        Git入门教程(二):分支的使用_第2张图片
       在上述例子中,“--”之上的两行表示有两个分支dev和master,且dev分支上最后一次提交的日志是“branch dev second commit.”,master分支上最后一次提交的日志是 “Add cbc.txt”。 “--”之下的几行表示了分支演化的历史,其中 dev表示发生在dev分支上的最后一次提交,dev^表示发生在dev分支上的倒数第二次提交。

三、合并分支

      git merge -m “注释” 合并的目标分支 合并的来源分支 (如果合并有冲突,git会有提示。)
      git pull 合并的目标分支 合并的来源分支 (如果合并有冲突,git会有提示。)
       Git入门教程(二):分支的使用_第3张图片
      请注意图中“git show-branch”打印出来的信息。另外在合并过程的提示“fast-farward merge(快速式合并)”是指直接将master分支指向dev分支。可通过“--no-ff“参数后,会执行正常合并,在master分支上生成一个新节点。为了保证版本演进的清晰,我们希望采用这种做法。关于合并的更多解释,请参考Benjamin Sandofsky的 《Understanding the Git Workflow》。效果对比如下:
       Git入门教程(二):分支的使用_第4张图片  Git入门教程(二):分支的使用_第5张图片

四、分支的回退

      库的逆转与恢复除了用来进行一些废弃的研发代码的重置外,还有一个重要的作用。比如我们从远程clone了一个代码库,在本地开发后,准备提交回远程。但是本地代码库在开发时,有功能性的commit,也有出于备份目的的commit等等。总之,commit的日志中有大量无用log,我们并不想把这些 log在提交回远程时也提交到库中。 因此,要用到git reset。   
      git reset --mixed id 此为默认。取消了commit和add,即git的HEAD回退了(也就是提交记录变了),但文件并没有改变。
      git reset --soft id 实际上是git reset –mixed id 后,又做了一次git add,这时可以直接提交了。
      git reset --hard id 将git的HEAD和文件都回退了。
      另外也可以使用git revert,与git reset最大的不同是,git revert仅仅是撤销某次提交,原有HEAD(包含commit和add)都不会变。如果中途想放弃revert,可使用git revert --abort。
      下面用示例来演示效果,请注意每张图的区别。
       Git入门教程(二):分支的使用_第6张图片
       Git入门教程(二):分支的使用_第7张图片
       Git入门教程(二):分支的使用_第8张图片
       Git入门教程(二):分支的使用_第9张图片
       Git入门教程(二):分支的使用_第10张图片
      下面这张图是git revert之后的提示,意思是叫我们修改记录文件。我这里没有修改,效果见上图。
       Git入门教程(二):分支的使用_第11张图片

五、历史分支的重置

      对于git rebase,我个人的理解是分支结点(历史分支)的重置。首先进入暂存区,同时定位到HEAD的历史记录,然后我们来修改记录,最后git根据修改之后的记录更新HEAD和文件。过程中如遇到提示,请仔细阅读再做下一步操作。
       Git入门教程(二):分支的使用_第12张图片
      
       Git入门教程(二):分支的使用_第13张图片
      
       Git入门教程(二):分支的使用_第14张图片
       Git入门教程(二):分支的使用_第15张图片

六、版本的建立

     $ git tag 查看版本
     $ git tag [name] 创建版本
     $ git tag -d [name] 删除版本
     $ git tag -r 查看远程版本
     $ git tag -a [name] -m “Message” 创建带注释的tag

七、其他

     1、如果提示行有下面类似标识,表明现在正处于暂存区,可使用git  xxxx(进入暂存区前的命令类型) --abort退出暂存区,一般不会对HEAD和文件有所影响。
     
     2、 如何找回git 中丢失的提交(commit)
     3、 如何彻底删除 Git 中的提交(commit)


参考资料:
1、Git分支管理策略
2、Git常用命令解说
3、git revert 和reset的区别 
4、git修改历史提交
5、Git 常用命令详解(二)
6、如何找回git 中丢失的提交(commit)
7、如何彻底删除 Git 中的提交(commit)

你可能感兴趣的:(Git入门教程(二):分支的使用)