今天在学习Git的分支合并时,对merge命令的具体处理方法产生了思考:
分支主要有3种:
直接合并(straight merge):把两条分支上的历史轨迹合并,交汇到一起;
压合合并(squashed commits):将一条分支上的若干个提交条目牙合城一个提交条目,提交到另一条分支的末梢;
拣选合并(cherry-picking):拣选另一条分支上的某个提交条目的改动带到当前分支上。
假设当前项目有两条分支:master和develop,对应的版本演进轨迹如下(左右标识了时间顺序):
C1---->C2---->C3----->C4---------->C6 (master)
|
|
|--------------->C5------------->C7 (develop)
则checkout到master上,将develop分支合并到主分支上,得到
C1---->C2---->C3----->C4----->C5----->C6------>C7----->C8(Merge branch 'develop') (master)
那具体是如何合并的呢?
是先把C5合并进C4和C6,没问题再合并上C7,没问题之后再commit得到C8?
还是直接把develop分支的末梢和master分支的末梢进行合并,如果有冲突则先处理,然后commit得到C8呢?
后面通过合并log,我猜测应该是后者是正确的。
当然,git log是按照时间顺序组织的
注意:
使用git diff 命令查看各个commit与当前分支master的末梢的差异,会发现:
1、git diff C7:没有C4、C6两个提交的内容,跟直接与develop分支的C7比较是一样的;
2、git diff C6:没有C5提交的内容;
3、git diff HEAD:跟C8比;
4、git diff HEAD^:跟C6比,而不是C7;
5、git diff HEAD~2:跟C4比,而不是C6;
由此,可以猜测到(实践已证实):
使用git reset --hard C7:将会失去C4和C6两个commit(包括实际内容和log),得到的master分支将和develop分支一模一样。
总结:
1、合并两个分支,是把两个分支末梢的最新版本断面合并,log安实践顺序交汇到一起;
2、每个commit对应的内容与每个分支上相应commit对应的内容是完全一致的(个人理解,在.git版本库中,一个commit只有一份存储,不论是在哪个分支上做的commit),因此使用git diff和git reset命令时需要尤其注意和小心,不要搞错;
3、HEAD引用对应某个分支,即使合并后,也是对应所在分支上的commit的层级,与其他分支上commit无关。
分享到:
相关推荐
文件可能会发生冲突,需要解决一下最后结果* 85ef130 (HEAD -> master) Merge branch 'dev'可以看出,merge 有保留d
* "git merge" learned "--quit" option that cleans up the in-progress merge while leaving the working tree and the index still in a mess. * "git format-patch" learns a configuration to set the ...
*“git mergetool”学会了提供Sublime Merge(smerge)作为其中之一 它的后端。 *当磁盘索引时调用新的钩子“post-index-change” 文件更改,可以帮助例如虚拟化工作树 实现。 *“git difftool”现在可以在...
Git 学习笔记 Git Gui 上那些常用的命令,因为通常是在command line 下操作的,这样就不用经常打开界面啦 merge的一个示例 命令:git merge remotes/origin/master 其它常用功能: 查看文件修改记录 查看简单提交...
Git指令的Shell脚本,能够快速便捷地管理Git库,包括添加修改、提交修改、显示库状态、推送到远程库、从远程库更新到本地、版本恢复等操作。 使用方法: 1. 在Linux系统中,将本文件放在Git库目录下,利用Shell运行...
*“git merge”学习了“--quit”选项,可以清理正在进行中 合并,同时离开工作树和索引仍然一团糟。 *“git format-patch”学习配置以设置默认值 它的--notes = 选项。 *显示具有潜在拼写错误的args的代码 ...
在初始化项目仓库时(gitclone或gitinit),Git会在根目录下创建一个.git目录,其下存放着Git操作和存储相关的内容,该目录结构大致如下:如图中所述:HEAD文件指向当前分支;index文件存储着暂存区的内容信息;refs...
该命令显示的是head指针移动的信息。他是在本地的,而不是你仓库的一部分。不会包含在push和merge中。如果我使用git log,我得到的提交信息是我仓库的一部分。把你当前在工作区中的修改暂时保存起来。然后工作区恢复...
上手 1:新公司用 Git 管理代码,怎么快速上手? 学习时长: 15分34秒 4 上手 2:团队工作的基本工作模型 学习时长: 9分32秒 5 进阶 1:HEAD、master 与 branch 学习时长: 15分41秒 6 进阶 2:push 的本质 学习时长: ...
使用Git管理代码工程,着实方便了很多,但是当做完feature分支或者完成hotfix之后,总是忘记删除这些无用的分支,一个一个地删除着实麻烦,重复手工劳动不符合程序员的风格,于是写了一个简单的脚本。一键删除那些不...
学习git演示13-02-2021 mkdir git init git添加 git commit -m“内容” git日志 git show git diff /////// gitk:用户界面git //// git checkout-:撤消文件更改 git reset HEAD:添加错误时撤消 git reset --...
详细讲解git中相关概念和核型用法,比如pull、push、head、merge等
上手 1:新公司用 Git 管理代码,怎么快速上手? 学习时长: 15分34秒 4 上手 2:团队工作的基本工作模型 学习时长: 9分32秒 5 进阶 1:HEAD、master 与 branch 学习时长: 15分41秒 6 进阶 2:push 的本质 学习时长: ...
3.9.1.3 Starting merge from the Git Repositories View 3.9.1.4 Merge options 3.9.1.5 Possible merge results 3.9.1.5.1 Merge Result dialog 3.9.2 Resolving a merge conflict 3.9.2.1 Using Merge ...
上手 1:新公司用 Git 管理代码,怎么快速上手? 学习时长: 15分34秒 4 上手 2:团队工作的基本工作模型 学习时长: 9分32秒 5 进阶 1:HEAD、master 与 branch 学习时长: 15分41秒 6 进阶 2:push 的本质 学习时长: ...
顺便介绍一些Git命令 2015.09.03 重新改写了整个教程,SourceTree工作流程+命令行讲解 基本的提交 创建分支 解决冲突 这次的图片附带在img文件夹下,33M左右……汗……,下载下来看吧,不需要联网。 内置gif,友好...
git操作 什么是版本控制系统(VCS) 1什么是分布式版本控制系统(DVCS) 1:新公司用 Git 管理代码,怎么快速上手? 2:团队工作的基本工作模型 1:HEAD、master 与 branch 2:push 的本质 3:merge:合并 ...
导航到git存储库,然后运行一个游戏来确定拥有HEAD最多的人。 为什么 我在一次火车旅行中创建了这个游戏,以帮助我的朋友使用更快的git merge工具。 仍在进行中 如何 git clone ...