美文网首页
Git Branch —— 实现多路并行作业

Git Branch —— 实现多路并行作业

作者: 浩明_c79b | 来源:发表于2017-08-06 17:37 被阅读0次

        在进行多路并行作业时,我们会用到分支。在并行开发的过程中,往往同时存在多个最新代码状态。如图1所示,从master分支创建A分支和B分支后,每个分支中都有自己的最新代码。master分支是Git默认创建的分支,因此基本上所有开发都是以这个分支为中心进行的。

    图1

        不同分支中,可以同时进行完全不同的作业。等该分支的作业完成之后再与master分支合并。通过灵活运用分支,可以让多人同时高效地进行并行开发。下面为大家介绍与分支相关的Git操作。


                                                 

     温馨提示:本文中用作演示的新分支名称均为"test ",并非命令的一部分



    git branch —— 显示分支一览表

        git branch 命令可以将分支名列表显示,同时可以确认当前所在分支。

    图2

        如图2,可以看到master分支左侧标有 “ * ”,这表示当前所在的分支。



    git branch + git checkout = git checkout -b —— 创建并切换到新分支

        先说一下 git checkout -b ,该命令以当前的master分支为基础创建一个新分支并立即切换到该新分支上,如图3,执行成功时返回一条信息。

    图3

        git checkout -b 命令实际上是两条Git命令的结合,如果只是想创建一个新分支但并不想要马上切换到该分支进行操作,或者想从新分支上切回到master分支,你需要了解以下两条命令:

    git branch 后面如果有字符功能则是创建一个新分支

        git branch 和 git checkout 的连续执行可以获得跟 git check out -b 同样的效果,其中 git branch 的功能是创建一个新分支git checkout 的功能是切换到某个已创建的分支上。

        输入格式: git branch 新分支名称

                           git checkout 要切换的目标分支名称



        我们已经成功创建了新的分支并切换到了该分支,但这些操作没有对本地工作产生什么实质性的改变,至少现在看来输入这几条命令似乎还浪费了我们一些时间,但当你开始新的工作并提交到仓库,你很快就能体会到 git branch 的美妙。

        下面让我们看一下 git branch 能为我们的工作带来什么变化

        首先输入 git branch ,检查一下我们的branch小屋:

    分支列表,现在位于test分支

        ok,看来新的分支和主人相处的很好,前面说到git branch 是以当前分支为基础创建一个新的分支,这有点像Java里子对象对父对象的继承,实际上两者有很多相似的地方,子对象无论怎么重写也不会对父对象产生改变对吧,新的分支和它的基础分支也是如此,我们来看一个例子。

        现在我们位于test分支,我在仓库目录下创建一个名为"abc"的文档文件,写入一句话:"我是以master分支为基础创建的新分支test",点击保存,然后在test分支上将它git add 并 git commit 提交。现在test分支上提交了一个新的文档。然后使用git checkout 切回master分支,这时奇怪的事发生了,abc从目录下"消失"了。

    test分支上创建一个文档并写入一句话保存,然后在test分支上 add&commit

        输入 git checkout master 回到master分支后,文件消失了

    输入git checkout master后,之前创建的文档文件不见了

        当你第一次执行这个操作时,你也许会跟我一样以为系统误删了文件,实际上只要我再次 git checkout 回 test 分支,被"删除"的文件马上又会被还原,这正是git branch 神奇的一个地方,在test分支上我对仓库目录下所做的任何操作 提交到仓库后 不会对其他分支有任何影响。

        运用git branch这个特性,你不仅可以实现一个文件夹多个版本,还可以实现一个文件多个版本。比如我创建一个文档文件,创建几个分支,先把这个空白文档在任意一个分支上提交一次,然后使用git merge命令将该文档搬运到其他分支上,随后你可以在任何一个分支上对这个文档内容做随意修改,这些修改提交后都会被锁定在提交时当前所处分支上,当你切换到其他分支上时,文档的内容都会是你在该分支上最后一次提交时的内容,这样就实现了一个文件多个版本,并且版本之间互不干扰(除非你再次使用 git merge 将两个分支合并)。




    git merge —— 合并分支

        上面我提到了 git merge ,这是一个用来将两个分支合并的命令,当你在两条分支上进行同样的工作,最后需要做一下整合的时候,git merge马上就能帮你又快又好的完成任务。

    输入格式:git merge 合并分支名称

        需要说明一下的是合并的结果,举个例子,你现在在A分支上,输入git merge B,就会把B分支合并到A分支上,合并后的结果会存储在A分支上,整个过程对B分支没有影响。

        使用git merge合并后会启动编辑器要求录入合并提交的信息,可不做任何更改,直接离开。然后会返回合并结果。



    git log --graph —— 以图表形式查看分支

    非常直观

        运用该命令可以非常直观地看到分支的创建和合并,这里不做详细介绍,大家可以自己尝试。


     

    git reset --hard & git reflog —— 回溯历史版本,灵活创建分支

    没错就是有这种操作

        你是否幻想过图中这样的操作?有时master分支更新的太急,不小心在某个历史版本忘记了创建分支,想使用git reset回去却担心丢掉master分支进度。git reset --hard 和 git reflog 可以帮助你解决烦恼完成操作。

    输入格式: git reset --hard 目标时间点哈希值

        git reset --hard 指令可以通过某个时间点的哈希值将分支恢复至该时间点的状态,哈希值可以通过 git log 和 git reflog 查询,这里我们必须使用一次 git reflog ,原因稍后说明。

        首先输入 git reflog(这一步有时使用git log 亦可,git reflog 更详细但也更繁琐,自己取舍)

    由于git reflog的信息非常详细,图只截一小部分作演示

        如图,历史日志中显示我的最后一次操作 merge test 已经把test分支提交的内容合并到了master分支上,假设这时我突然想起来合并之前应该在master分支上创建一个分支B,但master分支已经被合并改变了,因此我们先使用 git reset --hard 回到merge操作的上一个时间点

    使用时间点哈希值进行回滚

        ok,我们完成了一次时光倒流的魔法,被合并到master分支上的那些来自test分支的"碍事"文件已经统统消失了,这时我们回到了想要的master分支版本,可以使用 git branch 创建一个新分支B了。

        问题总是一个接一个,我们已经成功从master分支的历史版本创建出了B分支。但我们可不能一直待在过去啊,哆啦a梦的时光机每次都能把他和大雄从过去带回到现在,我们的master分支又该怎么从时光旅行中回来呢。

        其实很简单,再次输入 git reflog(这回真的必须用 git reflog 了)

    多了一次reset操作

        简单说明一下这里为什么必须用 git reflog : git log 命令只能查看以当前状态为终点的历史日志,而 git reflog 能够查看全部时间下的历史日志,不受当前状态影响,别忘了,我们现在可还在过去, git reflog 会给我们一个重返"未来"的机会。

        观察一下历史日志,可以看到对比上一次输入 git reflog 时历史日志中的最后一次操作从 merge test 变成了 reset,这也是因为我们刚才已经进行过一次reset操作了,接下来只要再次使用 git reset --hard 命令,我们就能回到最初 master 分支的最新版本了。

    让master分支回到最新版本

        现在我们的master分支又回到了开始的最新版本,而以master分支的历史版本为基础的B分支也成功建立了,又可以继续开始多路并行作业了。



    本地分支与远程分支

        我们已经可以在本地创建分支并进行多路并行开发了,但如果是多人团队开发的话,我们依然要学会如何在远程仓库上也实现多分支,接下来简单介绍一下对多分支远程仓库的基本操作。


    1.git push —— 推送至master之外的其他分支

        除了master分支之外,远程仓库也可以创建其他分支。

    输入格式: git push -u origin 本地分支名:要创建的新分支名称

        注意:本地分支名和远程新分支名可以不一样,但中间一定要注意加":"(冒号)。

        git push 命令除了将本地分支的内容推送到远程仓库已有分支之外也可以用来在远程仓库中创建新的远程分支。

        执行后,若此名称分支不存在,会新建一个远程分支并将当前所在本地分支的内容推送到该远程分支上。

    2.git checkout -b —— 获取远程分支

        远程仓库有了多个分支后,有时会出现想取回其中一个分支的情况,这在多人团队开发中是常有的情况。

        使用 git checkout -b 命令可以完成远程分支取回本地的操作。

    输入格式:git checkout -b 本地仓库新建分支名称 远程仓库名称/要取回的远程分支名称

        举个例子: git checkout -b A origin/B 的执行结果是以名为origin的远程仓库(默认远程仓库)的B分支为来源,在本地仓库中创建分支A。

        从远程仓库获取远程分支,在本地仓库中提交更改,再将该分支推送回远程仓库,通过这一系列操作,就可以与其他开发者相互合作,共同培育该分支,实现某些功能。

    3.git pull —— 获取最新的远程仓库分支

        在上一节里我们用 git checkout -b 把远程分支拉回到了本地,现在我们要考虑到整个团队的开发过程了,想象一下,团队中的一位伙伴对一个远程分支做了一次提交排除了一个你们头疼了很久的bug,现在所有人都要和远程分支再次同步保证在没有这个bug的基础上继续开发,这时 git pull 能让你从远程仓库取回最新版本的分支。

    输入格式: git pull 远程仓库名称 远程分支名称

        使用该明令时请务必保证当前所处本地分支是和远程分支对应的,使远程分支更新能正确拉回对应本地分支。

        另外,如果在一个团队中两个人修改了同一部分的源代码,push时就很容易发生冲突,因此当多名开发者在同一个分支中工作时,为减少冲突发生,频繁的pull 和 push是很有必要的。

    相关文章

      网友评论

          本文标题:Git Branch —— 实现多路并行作业

          本文链接:https://www.haomeiwen.com/subject/ugsvlxtx.html