《Git小书》笔记:6 分支

还记得在食堂排队吗,假设好多同学喜欢看到认识的同学就喜欢插队,只是他的插队不是直接插入,而站在队外面,然后来了新人看到了,又插到他后面,很快我们就看到食堂窗口那里变成了一颗树了。

好的,我们先来一个人排队:

查看分支:

我们开始插队,创建一个新分支roma:

在新分支上修改文件,然后提交一下,就相当于又插队了一个人:

好的,现在roma分支上我们已经完成了插队,而master分支还只有一个人"init",现在查看一下roma分支上有几个人了:

下面是简化SAH1输出的命令格式,一般情况下我们都不需要输出SAH1的值,可以用格式化输出的方式:

因为分支roma的修改都是在init的基础上添加的,所以合并的话不存在任何冲突,就好像是从master生长出来的一样:

好了roma的工作都被合并到主线上了,如果确认没有问题,就可以把roma分支销毁了:

?
?

解决冲突

刚才是没有冲突的情况因为master上没有动作,现在我们在master上和分支上都动一动:

创建新分支roma,并且做一些修改:

然后再切换到master分支上动一动:

好了现在我们正好在master下,然后合并roma到master上:

这里直接把后两行删掉或者改掉:只要把冲突的行改成你想改的任何形式都可以:

经发现这么改不行,可以!是我的操作步骤错了:改完之后还用暂存并提价冲突解决修改:

注意要把 -a 放到 git commit -m "conflict solved" -a 的后面,而不能和-m连写

其实这里的-a表示的git add .标记冲突修改完成。

rebase

"命令git-rebase也可以合并一个分支的开发成果到另外一个分支。不同的是,被rebase的分支的历史会被整体搬移到当前分支上。"这句话该怎么理解呢?整体搬移有什么好处呢?

我想到一个好处:就是完整地保留分支的修订历史,而合并则忽略了修订历史,所以用git rebase 可能是更好的选择比git merge.

先构造一个有多分支的仓库作为实验环境:

我们切换回master分支,然后添加一个"r2"commit

再查看roma分支的修订历史:

虽然,roma分支上rI是从r1生成的,而在master分支上,r1上又生成了r2,现在我们要让rI搬到r1,虽然有些不合理啊:但是这里搬过去的rI其实是roma的rI对master的r2的一个修订:

好的现在我们修改冲突,把修改后的状体作为新的"rI"嫁接到master的"r2"上去:

好吧,这里出现问题,我原先预期是把rI嫁接到r2上的,现在乱了。原因可能出在

命令上:应该切换到roma分支上,然后运用git rebase master而不是git rebase roma,这个的意思是把当前分支的全部修订搬移到指定分支master上,两个分支的历史合并为一条单线,最后roma的修订历史会变成这样:

然后还有一步操作:

git checkout master

git merge roma

这才得到:

?
?

?
?

撤销 git rebase

这个其实类似撤销提交,也是git reset命令,准确地将是和恢复撤销类似,也用到了双层空间查看命令git reflog

git reset --hard [email protected]{4} 这样一来就回退到了这个状态

--hard的作用是告诉git-reset命令不仅修改仓库的当前修订位置,也会同时使用此修订的文件来覆盖工作区和暂存区的文件。

?
?

?
?

?
?

-----------------------------------------------------------------

分层:是为了抽取共性,便于管理,防止混乱

目录:是为了区分

分类:基于臭味相投

设计模式:到底有什么用

-----------------------------------------------------------------

如果虚拟机无法共享文件夹可以用优盘

-----------------------------------------------------------------

看到书后面还有那么多突然急躁了,感觉看书还是实验一遍自己截个图,一来避免了急躁,二来加深了印象。

时间: 2024-10-14 01:12:08

《Git小书》笔记:6 分支的相关文章

《Git小书》笔记:1 前言

? ? 在图灵社区买了本<Git小书>,以前也买了一本<GitHub入门与实践>,看完了,觉得挺好,可是现在几乎都忘了,怎么感觉杀鸡用牛刀的赶脚,我完全用不上那些功能啊,可能是没有因为没有经历团伙作案的项目吧,git几乎成了文件备份工具了,自然而然地几乎只用到了推送功能.而那些复杂的命令虽然练了不少,但终究因为缺少累积理解也都忘了. Git推送代码,因为都是代码练习片段,没有形成库的形式,加上推送的时候总是纠结commit的写法,所以也渐渐不用了. 最近对C语言有了点感觉,感觉如果

《Git小书》笔记:3 介绍

概念类比说明: 创建嫌疑人名单--git init pot--创建版本仓库 添加嫌疑人--echo line1 > file1--创建文件 第一次拍摄嫌疑人--git add file1--添加跟踪 侦探的相机--暂存区 老板--仓库区 嫌疑人--工作区 提交拍到的嫌疑人给老板--git commit -m "init"--提交修改 嫌疑人第一次作案--echo line2 >> file1--修改文件file1 侦探拍摄嫌疑人作案过程--git add file1-

《Git小书》笔记:4 暂存区

这节讲了暂存区,我觉得讲的很好啊, 之前一起奇怪暂存区怎么用来的. 还用之前的比喻吧. 暂存区就好比侦探的那个相机嘛,暂存区的本质其实不是用来暂存的,如果说用来暂存的,至少会引起误解,因为我们会说为什么要暂存呢?直接存不就好了,为啥多此一举.的确,如果某种情况你要直接存当然不需要暂存区了. 但是暂存的是什么?暂存的是文件吗?正如那个侦探拍摄到的嫌疑人,他拍摄的是整个人吗?不是,他拍摄的一个行为.同理,暂存区暂存的是什么?暂存的是修改而非文件,我们要用改动的眼光看待文件,一个文件从诞生伊始,空无一

《Git小书》笔记:2 安装

git --version 登记一下: git config --global user.name "Your Name" git config --global user.email "[email protected]" 做实验的话,用 Line1 Line2 Line3 作为测试文件内容,大写L是为了便于区分吧,也没必要怕写一个大写L,因为重要的大写L这个形式 echo Line1 > file echo go > file 紧跟之后创建内容,不对

git小技巧--如何从其他分支merge个别文件或文件夹

在实际工作中,一个大型的项目或版本迭代可能不是一次上线,可能会分好几次上线,这时候就会涉及创建多个分支,进行分别开发. 创建分支 功能分为2个分支,分别为A.B. A上面有个列表页功能 B上面有个详情页功能,还有个系统消息功能 产品经理说先上列表功能,于是我们就开发A分支,列表功能很快开发完成. 第二天按常理开发B分支,开发到一半,产品经理说目前的系统消息功能需要急着上线,要和列表功能一起上线,当时就懵逼了,然后赶紧放下详情页的开发,立马去开发系统消息功能,开发完之后需要将列表功能和系统消息功能

【Git】笔记5 分支管理2

来源:廖雪峰 通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息. 如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息. git merge --no-ff -m "merge with no-ff" dev 合并dev分支,请注意--no-ff参数,表示禁用Fast forward,因为本次合并要创建一个新的commit,所以加上-m参数,把com

【Git】笔记4 分支管理1

1.创建与合并分支 一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点: 每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长: 当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上: 你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文

Git学习笔记五--分支管理

为什么要引入分支? 分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了.如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险. 现在有了分支,就不用怕了.你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作. 查看分支:git branch 创建分

GIT & GitHub 学习笔记

SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活, 干完后,需要把自己做完的活推送到中央服务器.集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网 速慢的话,就纳闷了. Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑 上.既然每个人的电脑都有一个完整的版本库