程序员与Github之间的暧昧-分支管理(一)

许多人都希望长生不老,却不知道如何度过一个无聊的周末。

这是我的第四篇原创文章

前两篇我们了解了github的本地使用和远程服务器使用。然而这并不是github的核心和亮点。很多工具都能实现前两篇讲述的功能,github的亮点在于分支的管理和多人协同开发的功能。这篇我们就讲讲git的分支管理的具体操作。

git的分支可以实现多人开发的伟大模式,从而提高生产效率。在整个GIT中,主分支(master)主要作为程序的发布使用,一般而言很少会在主分支上进行代码开发,都会在各自的分支上进行,然后在整合到master分支。可以用一个例子来说明分支,就是在开发中一般用主分支给客户做展示,用子分支做开发。

这篇文章有点长,耐心点看完,就一定会对git的理解更进一步。

准备工作:我们得先了解分支的基本原理。

master分支

以上的操作属于项目的发布执行顺序,因为最终版本就是master分支。但是对于其他的开发者,不应该在master分支进行。所以应该建立子分支,而子分支最起码建立的时候应该是当前master分支状态,而子分支一旦建立后,HEAD指针就会发生变化。

分支操作

在整个过程中,发现HEAD的指针发生变化,因为HEAD永远都要指向当前的分支,一旦创建了分支,那么一定需要针对于代码进行新的修改提交。

分支提交

那么此时master分支的版本号就落后于子分支了,但是不管子分子再怎么开发,也不是最新的发布版本,所有的发布版本都保存在master分支上,所以就必须将子分支与master分支进行合并。

当分支合并之后,实际上就相当于master的分支的提交点修改为了子分支的提交点,而后这个合并应该在master分支上完成,而后HEAD需要修改指针,断开brh分支,而指向原本的master分支。

删除分支

分支删除掉之后,所有的内容也就都取消了。

上面的是github的分支基本工作原理。下面来做学习前的文件准备:

1.新建版本库,添加文件 :

git init

git add .

2.提交本地仓库

git commit -a -m 'add some file'

(上述讲解图片来源:优拓教育的李兴华老师课件

1

新建分支

git checkout -b xxx(分支名)

这句指令的意思是新建分支并切换到新建的分支上。

也可以分段使用指令:

git branch xxx(分支名) 新建分支

git checkout xxx(分支名) 切换分支

因为大多数情况下,我们新建分支是为了切换到那个分支上进行开发。

2

查看分支

git branch

输入指令后会发现,你所在操作的分支前有一个'*'。

3

修改分支名

git branch -m xxx(原名) xxx(修改名)

有时候在做开发的时候,发现分支名字取得不太合理,重新新建一个分支没多大必要,所以会考虑换一个分支名。

4

推送远程服务器

git push origin xxx(待提交的分支名)

提交服务器的前提是,本地必须有自己的分支,才能提交。只有第一次提交要加 '-u' 参数,之后提交并不用加这个参数。

5

查看所有分支

git branch –a 查看全部分支(远程、本地)

git branch –r 查看远程分支

git branch –l 查看本地分支

可以看的出来输入 :

git branch

默认是查看本地分支。

6

分支的合并

git merge xxx(要合并的分支)

讲解原理的时候,说过,最终版本一定是master分支上所以要进行分支的合并。要合并分支前,必须先用指令:

git chechout master

回到master分支,然后在进行合并。

上面介绍原理的时候说过,实际上修改master指针为brh 分支的指针信息。所以此时的合并方式为“Fast-forword”,表示是快速合并方式,快速的合并方式并不会产生任何的commit id.他只是利用了合并子分支的commit id 继续操作。后面在讲解“no fast-forword”方法和这种方式的区别。

7

删除分支(本地)

git branch -d xxx(待删除的分支)

强制删除分支:

git branch -D xxx(待删除的分支)

我们合并完分支后,这个分支其实已经没有什么用,我们这会儿就可以删除。

如果有一种情况,当我们在在分支开发着正开心,但是发现这个分支开发的功能并没有什么软用,我们最想做的是删除这个分支,并返回上最开始的地址。这个时候如果在分支上提交过,一般情况下用普通的删除是无法操作的,要用'-D'参数,代表强制删除。

8

删除分支(远程)

git push origin --delete xxx(远程分支名)

本地分支删除完,也要删除远程分支,表示同步。

我们也可以登陆git上查看分支是否被删除。

9

冲突自动解决

分支可以很好的实现多人开发的互操作,但是有可能出现这样的情况:

(1)现在建立了一个新的分支brh,并且有一位开发者再次分支上修改了Demo.c文件。

(2)但是这个开发者由于不小心的失误,又将分支切换回master分支上,并且在master分支上也对文件修改。

现在等于有两个分支对同一个文件进行了修改,那么在进行提交的时候一定会出现一个冲突。因为系统不知道现在应该提交那一份分支的文件。

解决冲突

上图表示子分支提交了,但是主分支也进行了修改提交。

我们可以做一个实验:

(1)创建一个分支,并修改分支某一个文件内容

git checkout -b brh

(2)提交内容

git commit -a -m 'modified some file'

(3)切换回master分支

git checkout master

(4)修改同一个文件内容,并提交修改

git commit -a -m 'master brach change'

现在是在两个分支上都进行了修改,而且修改同一个文件(简单的添加或者删除),显然现在合并是无法合并的。

(5)合并分支

git merge brh

这个时候的冲突的是git自动给你解决的,其实它解决只能是简单的合并删除,有很大的局限性。正式写代码的时候,我们是会在代码内部修修改改,并不会只是添加和删除文件,这时候,git就无能为力了。只能手动解决冲突,就是我们下面要讲解的内容。

10

冲突手动解决

以上的由于代码修改的比较有规律,程序并没有发现不能够操作的冲突,那么下面进行一个更加严格冲突产生代码。

(1) 先把brh分支删除

git branch -D brh

(2)创建并切换一个新的分支

git checkout -b brh

(3)修改文件,随意修改,并提交

git commit -a -m 'modified young.c file'

(4)切换为master分支

git checkout master

(5) 在master分支上任意修改文件,并提交

git commit -a -m 'master:modified some file'

(6)合并分支

git merge brh

这时候,我们会发现 直接冲突了,这时候,需要我们手动修改冲突。

(7)查看冲突状态

git status

我们点开"young.c"这个文件,会发现这个文件冲突的地方,git已经给你标记出来了,告诉你哪里是你修改过的,我们只需要把不需要的删除(包括标记符)即可。

(8)删除标记和手动修改文件,并提交

(9)提交服务器

git push origin master

(10) 查看历史分支合并情况

git log --graph -pretty=oneline

这个指令的意思是说,用绘图的形式,一行打印log数据。所以我们能在左侧看到完整的分支。

(11) 删除分支

git branch -d brh

11

分支管理

在之前进行的分支合并时候全部使用的是“fast forward”方式完成的,而这种方式只是改变了master指针,没有commit id。可是在分支合并的时候也可以不用这种方式快速合并,即:增加一个“—no-ff”参数,这表示合并之后会自动生成新的commit id ,从而保证了合并数据的完整性,因为有commit id 就有了阶段性的数据。

“—no-ff 进行合并”

我们来做一个实验:

(1)创建一个分支

git checkout -b brh

(2)创建或者修改文件并提交

git add .

git commit -a -m 'add some file'

(3)切换会master分支

git checkout master

(4)使用非快速方式进行代码合并

git merge --no-ff -m 'merge brh'

(5)查看提交日志

git log --graph --pretty=oneline

分支策略

12

分支暂存

现在有一个场景,你正在一个分支上进行代码的开发,但是突然你的领导给你一个新的任务,并且要求半小时内完成,怎么办?

难道那开发一半的分支要提交吗?不可能的,因为对于版本控制的基本道德方式:不能把所有有问题的代码提交上去,你所提交的代码一定是正确的,那么为了这样的一个问题,git中提供了一个分支的暂存机制,可以将开发一半的分支进行保持,而后在适当的时候进行代码恢复。

那么下面来创建一个基本的开发场景。

(1) 创建并切换到一个新的分支

git checkout –b brh

(2) 在分支上添加文件,将文件保存在暂存区中

git add .

(3) 将工作暂存

git stash

(4)查看工作区中的内容

git status

这里我只是添加了文件并没有提交,本该有提示信息,但是暂时保存了分支的工作状态。所以没有任何提示信息。

(5)返回master新建一个分支,修改并提交

git checkout master

git commit -a -m "change file"

那么现在假设创建一个新的分支,用于完成老板的要求,假设这个分支为”dev”(也可能是bug调试)

(6)新建一个分支

git checkout -b dev

我们在新建分支上进行修改,巴拉巴拉的。假装下,我们现在已经修改完了老板的要求。但是代码只是在dev这个分支,所以我们必须与master合并。

(7)切换回master分支

git checkout master

(8)合并dev分支,使用no fast forword方法

git merge --no-ff -m "merge dev branch" dev

(9)删除dev分支

git branch -dev

现在这个突发状态已经解决,就可以删除刚新建的分支(dev)。

(10)查看所有的暂存状态

git stash list

因为现在需要回到刚才的工作状态,但是这会儿可能存在多个暂存的状态,我们需要查看现在有的暂存状态有哪些。

(11)从暂存区进行恢复

暂存区恢复之后那么所暂存的操作将没有存在的意义,但是也有人会认为他又意义。所以恢复有两种形式:

·形式一:先恢复,然后手工删除暂存

git stash apply

git stash drop

·形式二:恢复的同时也将stash内容删除

git stash pop

现在下面的任务就可以想之前一样的方式修改,提交,而后删除分支。

git commit -a -m 'chang file'

git branch -d young

这篇文章有点长,先写这么多吧。剩下的一部分:git的补丁和如何进行多人协同开发部分,就放到下一篇文章来说明吧。

学习本来就不是一个容易的事儿,慢慢来,一切都还来得及。

总结

在整个git中,分支的管理是最麻烦但是这个是最重要的操作,所以这部分可以反复查看,分支是进行开发使用的,最终必须都在master上,这点最重要,切记。

-END-

转载是一种动力 分享是一种美德

感谢您抽出·来阅读此文

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180714G12IRW00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券