`
haifengyulu
  • 浏览: 14824 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

Git学习之Merge命令,HEAD应用的理解

    博客分类:
  • Git
阅读更多

今天在学习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无关。

 

分享到:
评论

相关推荐

    ZhongJinHacker#notes#git_merge和git_rebase总结1

    文件可能会发生冲突,需要解决一下最后结果* 85ef130 (HEAD -> master) Merge branch 'dev'可以看出,merge 有保留d

    Git-2.21.0-64-bit.zip

    * "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-2.22.0-2019-06-07更新.rar

    *“git mergetool”学会了提供Sublime Merge(smerge)作为其中之一 它的后端。 *当磁盘索引时调用新的钩子“post-index-change” 文件更改,可以帮助例如虚拟化工作树 实现。 *“git difftool”现在可以在...

    gitLearn:git常用的命令

    Git 学习笔记 Git Gui 上那些常用的命令,因为通常是在command line 下操作的,这样就不用经常打开界面啦 merge的一个示例 命令:git merge remotes/origin/master 其它常用功能: 查看文件修改记录 查看简单提交...

    Git指令的Shell脚本

    Git指令的Shell脚本,能够快速便捷地管理Git库,包括添加修改、提交修改、显示库状态、推送到远程库、从远程库更新到本地、版本恢复等操作。 使用方法: 1. 在Linux系统中,将本文件放在Git库目录下,利用Shell运行...

    Git-2.23.0/win64/32/mac 多文件

    *“git merge”学习了“--quit”选项,可以清理正在进行中 合并,同时离开工作树和索引仍然一团糟。 *“git format-patch”学习配置以设置默认值 它的--notes = 选项。 *显示具有潜在拼写错误的args的代码 ...

    Git由浅入深之存储原理

    在初始化项目仓库时(gitclone或gitinit),Git会在根目录下创建一个.git目录,其下存放着Git操作和存储相关的内容,该目录结构大致如下:如图中所述:HEAD文件指向当前分支;index文件存储着暂存区的内容信息;refs...

    Git学习札记——进阶

    该命令显示的是head指针移动的信息。他是在本地的,而不是你仓库的一部分。不会包含在push和merge中。如果我使用git log,我得到的提交信息是我仓库的一部分。把你当前在工作区中的修改暂时保存起来。然后工作区恢复...

    6进阶 3:merge:合并 commits.md

    上手 1:新公司用 Git 管理代码,怎么快速上手? 学习时长: 15分34秒 4 上手 2:团队工作的基本工作模型 学习时长: 9分32秒 5 进阶 1:HEAD、master 与 branch 学习时长: 15分41秒 6 进阶 2:push 的本质 学习时长: ...

    Ruby实现的删除已经合并的git分支脚本分享

    使用Git管理代码工程,着实方便了很多,但是当做完feature分支或者完成hotfix之后,总是忘记删除这些无用的分支,一个一个地删除着实麻烦,重复手工劳动不符合程序员的风格,于是写了一个简单的脚本。一键删除那些不...

    Dog-Cat-Mouse:学习-git-github

    学习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 核心用法和概念详解-讲义.pdf

    详细讲解git中相关概念和核型用法,比如pull、push、head、merge等

    10高级 1:不喜欢 merge 的分叉?用 rebase 吧(1).md

    上手 1:新公司用 Git 管理代码,怎么快速上手? 学习时长: 15分34秒 4 上手 2:团队工作的基本工作模型 学习时长: 9分32秒 5 进阶 1:HEAD、master 与 branch 学习时长: 15分41秒 6 进阶 2:push 的本质 学习时长: ...

    EGit用户指南

    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 ...

    4进阶 1:HEAD、master 与 branch(1).md

    上手 1:新公司用 Git 管理代码,怎么快速上手? 学习时长: 15分34秒 4 上手 2:团队工作的基本工作模型 学习时长: 9分32秒 5 进阶 1:HEAD、master 与 branch 学习时长: 15分41秒 6 进阶 2:push 的本质 学习时长: ...

    15minGit:SourceTreeGit轻指南(15分钟学会Git增强版)

    顺便介绍一些Git命令 2015.09.03 重新改写了整个教程,SourceTree工作流程+命令行讲解 基本的提交 创建分支 解决冲突 这次的图片附带在img文件夹下,33M左右……汗……,下载下来看吧,不需要联网。 内置gif,友好...

    git原理详解及实用指南,分为18章md和pdf版本都有

    git操作 什么是版本控制系统(VCS) 1什么是分布式版本控制系统(DVCS) 1:新公司用 Git 管理代码,怎么快速上手? 2:团队工作的基本工作模型 1:HEAD、master 与 branch 2:push 的本质 3:merge:合并 ...

    git-soccer:您与其他程序员一起玩的Git球类游戏

    导航到git存储库,然后运行一个游戏来确定拥有HEAD最多的人。 为什么 我在一次火车旅行中创建了这个游戏,以帮助我的朋友使用更快的git merge工具。 仍在进行中 如何 git clone ...

Global site tag (gtag.js) - Google Analytics