git 命令(基础篇)的本质理解
主要命令
1. 提交,git commit
- 本质:创建一个节点(node),标志了当前位置(node)与以前的node存在不同之处,如下图中的 c0 <-- c1 <-- c2 等等
图中节点保留了上一次提交之后所做的改变
- 命令:
$ git commit -m "comments" ## comments 是对当前提交的注解,备注
- 补充:git commit 产生的节点会分配SHA 唯一的hash值,可以用git format-patch 命令提出。
## git 依据SHA值 (部分SHA值也是可以的,如前7位 ) 提取文件patch
$ git format-patch -M master ## 当前分支所有超前master的提交
$ git format-patch -s SHA值 ## 此SHA值提交以后的所有PATCH
$ git format-patch -1 SHA值 ## 此SHA值的提交patch
$ git format-patch -n ## 从master售前n个提交的内容
$ git format-patch -n SHA值 ## 从SHA值开始(含SHA值当次)之前的N次提交
2. 分支 ,git branch
本质:类似指针,指向最近提交的node。 不能理解为文件夹
上图表示 master 分支指向 c1 提交commit命令:
1. 创建分支
$ git branch new_branch ## 创建了分支名称为new_branch,工作指针停留在当前分支
2. 切换分支
$ git checkout new_branch ## 工作指针切换到已有分支new_branch
3. 创建分支
$ git checkout -b new_branch ## 创建了分支名称为new_branch,工作指针切换到新的分支
4. 浏览分支
$ git branch ## 浏览所有分支, 当前工作分支 前面会有 * 号
- 补充:分支不能理解为文件夹,
- 可以理解为虚拟文件夹
- 该虚拟文件夹中,存放了自分支创建以来所有的改变
- 该分支 commit之后,这个改变就固定下来(对应与 commit的节点)
- 多个分支合并(merge)是将多个分支不同的部分合并到其中的一个分支。
3. 分支 ,git merge
- 本质:在 Git 中合并两个分支时会产生一个特殊的提交记录,它有两个父节点。翻译成自然语言相当于:“我要把这两个父节点本身及它们所有的祖先都包含进来。”
合并前:
执行:
$ git checkout master ## 切换到要合并的分支
$ git merge bugFix ## 将 bugFix 分支合并到当前分支
合并后: 图中c4 是新产生的特殊记录(merge节点)
再把master 合并到bugFix分支:如下图
注意图中两个分支都指向同一个记录节点(上一次的merge节点c4)
命令:
补充:
4. 重指向 ,git rebase destination_branch
- 本质:git rebase。Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。
Rebase 的优势就是可以创造更线性的提交历史,这听上去有些难以理解。如果只允许使用 Rebase 的话,代码库的提交历史将会变得异常清晰。
背景:还是准备了两个分支;注意当前所在的分支是 bugFix(星号标识的是当前分支),我们想要把 bugFix 分支里的工作直接移到 master 分支上。移动以后会使得两个分支的功能看起来像是按顺序开发,但实际上它们是并行开发的。咱们这次用** git rebase ** 实现此目标。
$ git rebase master ## 把bugFix分支 rebase 到目标 master 分支上
效果如下图:
现在 bugFix 分支上的工作在 master 的最顶端,同时我们也得到了一个更线性的提交序列。
注意,提交记录 C3 依然存在(树上那个半透明的节点),而 C3' 是我们 Rebase 到 master 分支上的 C3 的副本。
现在唯一的问题就是 master 还没有更新,下面咱们就来更新它吧
$ git checkout master ## 切换到了 master 上。
$ git rebase bugFix ## 把当前分支 rebase 到目标 bugFix 分支上
由于 bugFix 继承自 master,所以 Git 只是简单的把 master 分支的引用向前移动了一下而已。
- 命令:
$ git rebase destination_branch ## 将当前的提交节点,移动到destination_branch 下一节点(新建)
- 补充:
5. HEAD
- 本质: HEAD 是一个对当前检出记录的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。HEAD 总是指向当前分支上最近一次提交记录。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的。HEAD 通常情况下是指向分支名的(如 bugFix)。在你提交时,改变了 bugFix 的状态,这一变化通过 HEAD 变得可见。
比较下面2个图:
图1:(HEAD * 指向 master)
图2:(HEAD * 指向某次commit:SHA值 630ed6548)
6. 撤销, git reset HEAD & git revert HEAD
- 本质1: git reset 通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。git reset 向上移动分支,原来指向的提交记录就跟从来没有提交过一样。
如图 6.1:
执行命令:
$ git reset HEAD~1 ## HEAD 及分支, 从当前位置,向前回退一个节点
如下图 6.2:
漂亮! Git 把 master 分支移回到 C1;现在我们的本地代码库根本就不知道有 C2 这个提交了。
(注:在reset后, C2 所做的变更还在,但是处于未加入暂存区状态。)
- 本质2:虽然在你的本地分支中使用 git reset 很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效!
为了撤销更改并分享给别人,我们需要使用 ** git revert **。
前面图 6.1 执行命令之后 ,如下图 6.3
执行命令:
$ git revert HEAD ## HEAD 及分支master, 从当前位置,向前下新建了一个节点 C2' , 本质上 C2' 是**抵消** C2的操作的。
注意:在我们要撤销的提交记录后面居然多了一个新提交!这是因为新提交记录 C2' 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2' 的状态与 C1 是相同的。
revert 之后就可以把你的更改推送到远程仓库与别人分享啦。
git 命令(基础篇)的本质理解的更多相关文章
- git 命令(提高篇)的本质理解
上一篇博客:[[git 命令(提高篇)的本质理解] (http://www.cnblogs.com/juking/p/7105744.html)]介绍了Git 的基础知识 -- 提交.分支以及在提交树 ...
- git 命令(补充篇)的本质理解
1 标签, git tag tag_name SHA 本质: 在某次commit 上打上标签tag_name ,标签在代码库中起着"锚点"的作用. 注意: commit 由 SHA ...
- Git使用基础篇
Git使用基础篇 前言 Git是一个分布式的版本控制工具,本篇文章从介绍Git开始,重点在于介绍Git的基本命令和使用技巧,让你尝试使用Git的同时,体验到原来一个版 本控制工具可以对开发产生如此之多 ...
- Git使用基础篇(zz)
Git使用基础篇 您的评价: 收藏该经验 Git是一个分布式的版本控制工具,本篇文章从介绍Git开始,重点在于介绍Git的基本命令和使用技巧,让你尝试使用Git的同时,体 ...
- [转]Git使用基础篇
http://www.git-scm.com/ https://try.github.io/levels/1/challenges/1 本文转自:http://www.open-open.com/li ...
- 转战物联网·基础篇05-通俗理解MQTT协议的实现原理和异步方式
网络上搜索MQTT协议,会出现太多的解释,这里就不做官方标准释义的复制了.这一节我们从实战理解角度,通俗的将MQTT协议的作用及实现原理说一下,旨在可以快速理解MQTT协议.所以可能会出现很多看似 ...
- LINUX常用命令--基础篇(一)
1. man 对你熟悉或不熟悉的命令提供帮助解释 eg:man ls 就可以查看ls相关的用法 注:按q键或者ctrl+c退出,在linux下可以使用ctrl+c终止当前程序运行. 2. ls 查看目 ...
- 转战物联网·基础篇07-深入理解MQTT协议之控制报文(数据包)格式
在MQTT协议中,一个控制报文(数据包)的结构按照前后顺序分如下三部分: 结构名 中文名 解释说明 Fixed header 固定报头 报文的最开始部分,所有报文都包含这个部分 Variable ...
- 转战物联网·基础篇06-深入理解MQTT协议之基本术语
通过上一节我们对MQTT协议已经有了初步的印象,这一节我们开始深入的理解一下MQTT协议,介绍常用的MQTT 3.1.1版本,5.0版本后面指介绍新增部分即可.这一节我们先介绍MQTT里常用的术语 ...
随机推荐
- 1. jdk内存配置
-Xms256m -Xmx512m -XX:PermSize=256m -XX:MaxPermSize=512m
- python 的深浅copy
1.引用: A=B, 修改B后,A会被修改 2.浅拷贝:A=copy.copy(B) 3.深拷贝:A=copy.deepcopy(B) 如果希望任何改变,两个对象都不会相互影响,用深拷贝.详情参考:h ...
- 《Effective Java 第三版》新条目介绍
版权声明:本文为博主原创文章,可以随意转载,不过请加上原文链接. https://blog.csdn.net/u014717036/article/details/80588806前言 从去年的3月份 ...
- 微信小程序---setData
data:{ obj:{ name:'hello' } } 对data中obj的name字段进行重新赋值. onLoad: function (option) { var value = 'obj.n ...
- apt与apt-get命令的区别与解释
[apt与apt-get命令的区别与解释] Ubuntu 16.04 发布时,一个引人注目的新特性便是 apt 命令的引入.其实早在 2014 年,apt 命令就已经发布了第一个稳定版,只是直到 20 ...
- vue.js核心最基本的功能
Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统: , text: , text: , text: '随便其它什么人吃的东西' } ] }}) 蔬菜 奶酪 随便其 ...
- 深度学习中Dropout原理解析
1. Dropout简介 1.1 Dropout出现的原因 在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象. 在训练神经网络的时候经常会遇到过拟合的问题 ...
- 20175314 《Java程序设计》第一周学习总结
20175314 <Java程序设计>第一周学习总结 教材学习内容总结 除了学院统一购买的<Java 2 实用教程(第5版)>我还在网上买了一本<Head ...
- [leetcode]10. Regular Expression Matching正则表达式的匹配
Given an input string (s) and a pattern (p), implement regular expression matching with support for ...
- MySQL开发——【多表关系、引擎、外键、三范式】
多表关系 一对一关系 一对多或多对一关系 多对多关系 MySQL引擎 所谓的MySQL引擎就是数据的存储方式,常用的数据库引擎有以下几种: Myisam与InnoDB引擎之间的区别(面试) ①批量插入 ...