Git分支

内容简介

  • 分支简介
  • 创建分支
  • 查看分支
  • 切换分支
  • 分支合并
  • 删除分支
  • 分支管理
  • 远程分支

分支简介

为了真正理解 Git 处理分支的方式,我们需要回顾一下 Git 是如何保存数据的。
Git 保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照。
在进行提交操作时,Git 会保存一个提交对象(commit object)。知道了 Git 保存数据的方式,我们可以很自然的想到——该提交对象会包含一个指向暂存内容快照的指针。 但不仅仅是这样,该提交对象还包含了作者的姓名和邮箱、提交时输入的信息以及指向它的父对象的指针。首次提交产生的提交对象没有父对象,普通提交操作产生的提交对象有一个父对象,而由多个分支合并产生的提交对象有多个父对象。

Git 的分支,其实本质上仅仅是指向提交对象的可变指针。 Git 的默认分支名字是 master。 在多次提交操作之后,你其实已经有一个指向最后那个提交对象的 master 分支。 它会在每次的提交操作中自动向前移动。

创建分支

创建分支其实就是在当前分支的提交快照中创建一个可以移动的新的指针。创建分支使用git branch [分支名],比如我们创建一个flowers分支。

 $ git branch flowers 

执行这个命令,我们就创建了一个名字为flowers的分支。如何知道我们是否已经创建了这个分支呢?

查看分支

查看分支使用如下命令:

$ git branch

结果如下:

查看分支

从上图我们看出,我们看到目前有两个分支。一个是我们git init的时候默认的分支master,一个是我们新创建的分支flowers。分支名称前面的*代表我们当前所在的分支。其实关于如何辨别当前分支的方法,还有一个是查看HEAD指针的指向,执行git log --oneline --decorate命令,结果如下:

--decorate查看各个分支当前所指的对象

从结果我们可以看出HEAD指针指向的是master,说明我们当前所处的分支就在master分支。

切换分支

我们创建了flowers分支,但是Git并不会自动给我们切换到所创建的分支上。执行git checkout [分支名]命令可以切换分支。

$ git checkout flowers
分支切换

执行git checkout -b [分支名]可以完成上面两步的操作,1.创建分支2.切换到该分支。

查看分叉历史

我们切换到flowers分支,并在此分支上面做些修改并提交,然后执行下面的命令,我们可以看到:

$ git log --oneline --decorate --graph --all
分叉历史

从图中我们可以看出,master分支和flowers分支所对应的提交快照的SHA值不一样,说明它们对应的不同的提交。

现在我们再切换回master分支,并在此分支上面做些修改并提交,然后执行上面同样的命令,结果如下图:

分叉历史

分支合并

分支合并的情况有两种:

  1. 快进式(Fast-forward),就是简单的指针向前移动。
  2. 递归式(recursive),就是三个快照的合并。

下面分别对这两种情况来说明。

快进式

我们在master分支的基础上新建立一个tree分支,然后在tree分支上面做些修改并提交,最后回到master分支,然后将tree分支里面的修改合并到master中。

$ git co -b tree
$ vi tree_test
$ git add tree_test
$ git ci -m "tree add tree_test"
$ git co master
$ git merge tree
快进式

命令git merge tree是将目标分支tree合并到当前分支master
从最后的结果(Fast-forward)我们可以看出master指针只是向前移动了,指针移动到了tree分支所提交的快照指针处。

递归式

递归式合并的意思就是,如果你在创建一个新分支flowers后又回到master分支做了修改并提交。然后,此时你想把flowers分支合并到master分支上。因为此时,master分支和flowers分支它们有一个共同的祖先,所以这种合并会将两个分支的末端和它们的共同祖先一起比较,最后生成一个新的快照并提交。

递归式

由于我们之前创建的flowers分支就是这样的操作,所以我们省去了很多步骤。从结果(recursive)我们可以看出就是这种三方合并。

删除分支

分支合并结束并确保分支已经没有必要存在的时候,就可以将分支删除了。git branch -d [分支名]命令删除分支。

$ git branch -d tree
分支删除

删除分支可能遇到分支不能删除的情况。原因一种可能就是你的分支的修改内容没有同步到master分支,另外一种可能就是你删除的分支是在当前的分支(被删除的分支不能是当前分支)。

冲突解决

合并有时候并不是那么一帆风顺的,如果遇到冲突了怎么办。如下:

合并冲突

此时 Git 做了合并,但是没有自动地创建一个新的合并提交。 Git 会暂停下来,等待你去解决合并产生的冲突。 你可以在合并冲突后的任意时刻使用git status命令来查看那些因包含合并冲突而处于未合并(unmerged)状态的文件:

冲突时的状态

从提示中我们可以看出Git给了我们两种方式。1.修复冲突文件,然后提交;2.运行git merge --abort 中止本次提交。
我们使用第一种来解决问题。首先查看一下冲突的文件:

冲突文件的内容

=======这个分隔开的上下两部分分别是当前分支HEAD(master)和合并时的目标分支road对应的该文件的修改。此时,我们可以手动修改这个文件的内容,然后把对应不需要的内容删除(<<<<<<< HEAD>>>>>>> road 以及 =======这三行的内容),最后保存,然后提交即可。

分支管理

git branch参数说明
-v
如果需要查看每个分支的最后一次提交,可以运行git branch -v

查看每个分支的最后一次提交情况

--merged
这个参数可以查看哪些分支已经合并到当前分支

分支合并情况

--no-merged
这个参数可以查看哪些分支没有合并到当前分支

分支未合并情况

远程分支

查看远程库信息

$ git remote
远程仓库名

获取详细的远程库信息

$ git remote -v
更详细的远程库信息

从图中看出,我们可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。

推送分支

推送分支,就是把该分支的本地提交都上传的远程库。推送时,要指定本地分支,这样,Git就好把该分支推送到远程库对应的分支上。

$ git push origin road
推送分支到远程库

抓取分支

如果你是运行git clone [url]获取到的仓库的时候,本地只有只有一个master分支。你可以运行git branch命令查看。如果你想获取其他的分支,那么需要主动去获取远程分支到本地。

$ git co -b dog origin/dog
获取远程分支(失败)

从图中我们看出获取失败了,这个是因为获取的远程分支不存在导致的。

获取远程分支(成功)

从图中我们可以看出,我们获取到了远程分支road并且从master分支切换到了road分支

然后我们更新该分支的某个文件内容,然后提交并推送到远程库中。

提交修改到远程库

这是如果另外一人也修改了该分支的相同文件的相同代码行。此时如何这个人提交的话,那么就会出现推送失败,因为发生了冲突。

推送时的冲突情况

如果发生这样的情况,那么我们可以根据提示,运行git pull命令,把远程库该分支的最新的提交给下载到本地。

下载远程库该分支最新的提交

此时发现,Git提示我们没有本地的road分支与远程的origin/road分支的链接,再次失败了。解决这个失败的方法有两种:1.git pull <remote> <branch>把远程分支下载到本地,然后关联;2. git branch --set-upstream-to=origin/<branch> road关联本地分支到远程分支。第二种情况需要再运行git pull才可以把远程库该分支最新的内容下载到本地。所以我采用第一种方法:

关联远程分支并更新最新内容

此时我们发现又冲突了,这个时候就像解决分支冲突一样去解决这个冲突就可以了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容

  • 四、 分支开发工作流 现在你已经学会新建和合并分支,那么你可以或者应该用它来做些什么呢? 在本节,我们会介绍一些常...
    常大鹏阅读 2,069评论 3 24
  • Git 分支 Git命令大全 对于任何一个文件,在Git内都只有三种状态:已提交(committed),已修改(m...
    carrey001阅读 803评论 0 4
  • 纯手工打造每一篇开源资讯与技术干货,数十万程序员和Linuxer已经关注 1 Git 分支 - 分支简介 有人把 ...
    尘世不扰阅读 687评论 0 3
  • 一、 Git 分支简介 几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分...
    常大鹏阅读 2,917评论 2 41
  • 今天是农历二月初二龙抬头的日子。 早上泡艾叶浴. 喝淮山豆腐姜汤. 洗头发,剪头发。 下午洗牙。 睇花。
    蓝姑娘花果山阅读 411评论 0 0