您的位置:首页 > 其它

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

2013-09-08 20:01 417 查看
       如果你严肃对待编程,就必定会使用"版本管理系统"(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 show-branch (查看当前分支的提交注释及信息) 

       git show-branch --all(查看所有分支的提交注释及信息)

       同时也可以使用git log查看当前分支的详细信息。

       


       在上述例子中,“--”之上的两行表示有两个分支dev和master,且dev分支上最后一次提交的日志是“branch dev second commit.”,master分支上最后一次提交的日志是 “Add cbc.txt”。 “--”之下的几行表示了分支演化的历史,其中 dev表示发生在dev分支上的最后一次提交,dev^表示发生在dev分支上的倒数第二次提交。

三、合并分支

      git merge -m “注释” 合并的目标分支 合并的来源分支 (如果合并有冲突,git会有提示。)

      git pull 合并的目标分支 合并的来源分支 (如果合并有冲突,git会有提示。)

      


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

      

 


四、分支的回退

      库的逆转与恢复除了用来进行一些废弃的研发代码的重置外,还有一个重要的作用。比如我们从远程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 revert之后的提示,意思是叫我们修改记录文件。我这里没有修改,效果见上图。

      


五、历史分支的重置

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

      


      


      


      


      


      


六、版本的建立

     $ 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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: