Git(11)-cherry-pick、reset、rebase
更改提交,版本回退
- 1.get reset 重置HEAD指针的指向
- 2.git cherry-pick
- 3.git revert
- 4.git commit --amend修改提交
- 5.git rebase 变基提交
- 5.1 git rebase --onto
- 5.2rebase 产生冲突,解决冲突/终止变基
- 5.3git rebase -i
- 6. rebase Vs merge
git 提供了【修改】【完善】版本库中提交的机制。有很多需要让你去修改或返工某个提交的情况,例如:在某个问题编程器遗留问题前修复它。
【注意事项】如果一个分支已经公开,就不应该重写、修改、更改该分支的任何部分。应该使用git revert命令产生新的提交。
命令概览
git reset commit_flag # --soft、--mixed、--hard 三个选项, 移动HEAD指向的提交git checkout branch1 # 转移一个分支上的提交->另一个分支上
git cherry-pick commit_flag git revert commit_x # 撤销某些内容,产生一个新的提交git checkout topic # 改变topic分支的基础为master分支上的最新提交
git rebase master # 等价于git rebase master topicgit rebase --continue # 解决冲突后变基操作
git rebase --skip # 跳过某些会产生冲突提交,以避免某些冲突。
git rebase --abort # 可以终止变基础操作,使版本库恢复到变基前的状态
git rebase -i [startpoint] [endpoint] # 和并多次提交并变基
git rebase -i合并多次提交
1.get reset 重置HEAD指针的指向
git reset 调整HEAD引用指向给定的提交,默认情况下会更新索引以匹配该提交。该命令的三个选项对应对HEAD、索引和工作目录的影响记录于下表。
git reset 命令将原来的HEAD存放在ORIG_HEAD 中。
选项 | HEAD | 索引 | 工作目录 |
---|---|---|---|
git reset --soft | yes | no | no |
git reset --mixed | yes | yes | no |
git reset --hard | yes | yes | yes |
git reset HEAD --废弃最新提交的入库状态,可以重新编辑废弃提交中新加的文件,添加全新文件,产生新的添加哦。
git reset --soft --仅仅调整提交消息,You can, but you don’t it. 提倡用git commit --amend.
git reset --hard --完全废弃最新提交。改变工作目录,原有的未保存修改将丢失,新文件被删除 。
注意事项:如果将reset 命令应用在分支名上,会造成很多没必要的问题。
2.git cherry-pick
[有趣的程序员,挑樱桃呢]。
- 转移一个提交:用于 将一个分支的 特定提交 引入 一个不同的分支中,常见用法是将 开发分支的提交 移植到 维护分支 上。
git checkout master # 需要引入新提交的目标分支
git cherry-pick commit-id1 # 在master 分支上新建一个提交,提交的内容是 commit-id1相对于commit_id0的新增内容【commit_id0 是 commit-id1 的上一个提交】
# 可能伴随着解决冲突 # 没有冲突的话,就会直接复用原有的提交信息,直接在当前分支上产生一个新的提交
- 转移一批提交:另一个常见用途 用于重建一系列提交, 即从一个提分支中选一批提交,然后把他们引入新的提交中。
git checkout master
git cherry-pick commit-id1..commit-id3
3.git revert
与git cherry-pick 命令作用相反:引用一个新的提交,消除给定提交的内容。(我想:git revert 无需解决冲突,但是如果某个提交基于需撤销的提交,撤销该提交后可能会出现问题)记得在提交日志中记录相关的撤销信息。
git revert commit_x
4.git commit --amend修改提交
当最新的提交 需要 小范围的修改,可以使用git commit --amend 补救一下最新提交。 (其实它可以修改任意提交,但是一般情况下不推荐),对于普通git commit --amend 会弹出编辑会话,可在里面修改提交信息。
5.git rebase 变基提交
每一个在编辑的准提交都是基于某个父亲提交进行的,可以改变准提交的基础,即使用rebase操作。
一个常见的用途是–保持你正在开发的一系列提交相对于另一个分支(master)的最新提交进行的。
git checkout topic # 切换到topic分支, topic 分支是基于 master 分支的某个提交建立的
git rebase master # 变基础操作, topic分支基于master分支的最新提交建立。
# 以上两个命令等价于
git rebase master topic
5.1 git rebase --onto
一条分支上的开发线 整个 移植到不同的分支上
git rebase --onto master maint^ feature # feature分支基于maint^, 将feature 提交的基础变为master分支。
5.2rebase 产生冲突,解决冲突/终止变基
变基操作一次只迁移一个提交,从原始提提交迁移到新的提交基础。因此每个移动提交都可能产生冲突。
如果在rebase 的过程中发生了冲突,git 会自动挂起 rebase进程,当你手动解决冲突后,使用git rebase --continue命令恢复变基操作。
git rebase --continue命令提交解决冲突后的内容,继续处理需要变基的下一个提交。
git rebase --skip 命令可以跳过某些提交,以避免某些冲突。但是这是非常不提倡的,产生的问题可能会像滚雪球一样。
git rebase --abort 可以终止变基础操作,使版本库恢复到变基前的状态(后面半句是否需要配合其他命令)
5.3git rebase -i
重新排序、编辑、删除、把多个提交合并成一个、把一个提交分离成多个
git rebase -i master~3 # 会自动打开编辑器,编辑重新排序文件。
# 提交默认按照最老->最新的顺序排列, 每个提交都有前都有一个pick, 放在最前面的提交将最先被拾起应用到目标分支
# 修改提交顺序后,保存退出。
# squash 提交会合并的前一个提交中,(自动弹出)合并提交信息模版,是两个提交信息的简单合并
6. rebase Vs merge
把在branch1上的一系列提交rebase branch2的头部 与 合并两个分支 产生的效果是一致的,即在branch2 的新头是两个分支内容的组合。rebase 还是 merge 需要依据实际情况而言。具体技巧希望后续会说
要记住的重要概念:
- 变基础操作会把提交重新线性化成新的提交。如果想要保留分支和合并结构需要使用
git rebase --preserve-merges master dev
- 不可达的旧提交会消失
- 如果有分支2基于 变基提交1,很有可能需要对2也进行相应的变基操作。
Git(11)-cherry-pick、reset、rebase相关推荐
- Git 回滚 checkout、reset、revert
Git 回滚 checkout.reset.revert 首先看一下 Git 的工作流程 checkout 是检出的意思,作用是将某次 commit 的状态检出到工作区,它的过程是先将 HEAD 指向 ...
- jquery表单选择器input、:text、:password、:radio、:checkbox、:submit、:reset、:image、:button、:file、:hidden
全栈工程师开发手册 (作者:栾鹏) jquery系列教程1-选择器全解 jquery表单选择器 jquery表单选择器,包括:input.input.:text.:password.:radio.:c ...
- R语言EG(Engle-Granger)两步法协整检验、RESET、格兰杰因果检验、VAR模型分析CPI和PPI时间序列关系...
全文链接:http://tecdat.cn/?p=31108 作为衡量通货膨胀的基本指标,消费者价格指数CPI和生产者价格指数PPI的作用关系与传导机制一直是宏观经济研究的核心问题.(点击文末&quo ...
- Git撤销修改场景及对应指令(checkout、reset、revert)详解
场景一:撤销工作区的修改(未执行git add) 指令:git checkout [目录或文件名] 实例: 1.修改了test.txt文档,git status 会出现如下提示: 2.git chec ...
- java rewind()_Java NIO Buffer的clear()、reset()、rewind()、flip()方法的区别
Buffer是一个抽象类,位于java.nio包中,主要用作缓冲区.注意:Buffer是非线程安全类.capacity一旦初始化后就不会改变,其值一直为常量.在使用中我们一般使用Buffer的抽象子类 ...
- 前端、数据库、Django简单的练习
一.前端 1.前端页面由哪几层构成,分别是什么,作用是什么? 分为:结构层(html),表示层(css),行为层(js). 结构层 超文本标记语言.由HTML或XHTML之类的标记语言负责创建.标签, ...
- HTML、CSS、JavaScript学习总结
网站开发的主要原则是: – 用标签元素HTML描述网页的内容结构: – 用CSS描述网页的排版布局: – 用JavaScript描述网页的事件处理,即鼠标或键盘在网页元素上的动作后的程序 HTML(H ...
- JQuery入门总结(三)【选择器、方法、Json】
l两种方式:[index]和.get(index) l1.JQuery对象内部包含一个数组对象,可以通过[index]的方法,来得到相应的DOM对象 var $txtName=$("#txt ...
- HTML笔记、案例、可下载原件
预备内容:--软件安装 1.记笔记工具:--typora 文件名:基本文件扩展名 eg:SDN.docx 销售统计表.xlsx 备注:显示/隐藏栏目中选中文件扩展名即可 备注:取消勾选隐藏已知文件类型 ...
最新文章
- 还是来说class,什么鬼,类会生宝宝
- python介绍和用途-Python --- Python的简介
- syslog(),closelog()与openlog()--日志操作函数
- 一个css和js结合的下拉菜单,支持主流浏览器
- 百万奖金!交通事件、医学病理、广告检测,江苏大数据开发与应用大赛报名...
- TFT_LCD液晶屏驱动设计与验证
- 深圳观澜机房(云计算数据中心)
- python爬房源信息_用python爬取链家网的二手房信息
- CentOS 编译 Nginx 服务
- string与StringBuilder之性能比较
- 使用jquery做一个动态简历
- LaTeX排版学习资源汇总
- 伟大的数学家,怎么都诞生在法国?
- 从单一服务到多元化服务,智能机器人JIMI的架构改造及逐步开放的过程
- 我们已经开发好了Magento的Ctopay(收汇宝)非3D网关
- 桃词典 Peach Dictionary 简易英语词典app开发 安卓软件开发 Part 9
- PDF Cookbook by Eric
- 线程、进程、多线程、多进程 和 多任务
- 怎样安装linux系统
- 2016年福建两化深度融合与新型CIO创新发展 论坛圆满落幕
热门文章
- 如何在asterisk中限制呼叫路数?
- 增加RIL组件时编辑出现的问题
- 进程控制3--signal
- 考公专业科目计算机,2017国考中国证监会专业科目考试大纲(计算机类)
- 【转】Windows消息传递机制详解
- 【转】2:C#TPL探秘
- 【转】OData – the best way to REST–实例讲解ASP.NET WebAPI OData (V4) Service Client
- 一步步编写操作系统 29 cpu缓存简介
- 一步步编写操作系统 08 bios跳转到神奇的内存地址0x7c00
- 【Python CheckiO 题解】Correct Sentence