更改提交,版本回退

  • 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

[有趣的程序员,挑樱桃呢]。

  1. 转移一个提交:用于 将一个分支的 特定提交 引入 一个不同的分支中,常见用法是将 开发分支的提交 移植到 维护分支 上。
git checkout master              # 需要引入新提交的目标分支
git cherry-pick commit-id1       # 在master 分支上新建一个提交,提交的内容是 commit-id1相对于commit_id0的新增内容【commit_id0 是 commit-id1 的上一个提交】
# 可能伴随着解决冲突                # 没有冲突的话,就会直接复用原有的提交信息,直接在当前分支上产生一个新的提交
  1. 转移一批提交:另一个常见用途 用于重建一系列提交, 即从一个提分支中选一批提交,然后把他们引入新的提交中。
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 需要依据实际情况而言。具体技巧希望后续会说

要记住的重要概念:

  1. 变基础操作会把提交重新线性化成新的提交。如果想要保留分支和合并结构需要使用

git rebase --preserve-merges master dev

  1. 不可达的旧提交会消失
  2. 如果有分支2基于 变基提交1,很有可能需要对2也进行相应的变基操作。

Git(11)-cherry-pick、reset、rebase相关推荐

  1. Git 回滚 checkout、reset、revert

    Git 回滚 checkout.reset.revert 首先看一下 Git 的工作流程 checkout 是检出的意思,作用是将某次 commit 的状态检出到工作区,它的过程是先将 HEAD 指向 ...

  2. jquery表单选择器input、:text、:password、:radio、:checkbox、:submit、:reset、:image、:button、:file、:hidden

    全栈工程师开发手册 (作者:栾鹏) jquery系列教程1-选择器全解 jquery表单选择器 jquery表单选择器,包括:input.input.:text.:password.:radio.:c ...

  3. R语言EG(Engle-Granger)两步法协整检验、RESET、格兰杰因果检验、VAR模型分析CPI和PPI时间序列关系...

    全文链接:http://tecdat.cn/?p=31108 作为衡量通货膨胀的基本指标,消费者价格指数CPI和生产者价格指数PPI的作用关系与传导机制一直是宏观经济研究的核心问题.(点击文末&quo ...

  4. Git撤销修改场景及对应指令(checkout、reset、revert)详解

    场景一:撤销工作区的修改(未执行git add) 指令:git checkout [目录或文件名] 实例: 1.修改了test.txt文档,git status 会出现如下提示: 2.git chec ...

  5. java rewind()_Java NIO Buffer的clear()、reset()、rewind()、flip()方法的区别

    Buffer是一个抽象类,位于java.nio包中,主要用作缓冲区.注意:Buffer是非线程安全类.capacity一旦初始化后就不会改变,其值一直为常量.在使用中我们一般使用Buffer的抽象子类 ...

  6. 前端、数据库、Django简单的练习

    一.前端 1.前端页面由哪几层构成,分别是什么,作用是什么? 分为:结构层(html),表示层(css),行为层(js). 结构层 超文本标记语言.由HTML或XHTML之类的标记语言负责创建.标签, ...

  7. HTML、CSS、JavaScript学习总结

    网站开发的主要原则是: – 用标签元素HTML描述网页的内容结构: – 用CSS描述网页的排版布局: – 用JavaScript描述网页的事件处理,即鼠标或键盘在网页元素上的动作后的程序 HTML(H ...

  8. JQuery入门总结(三)【选择器、方法、Json】

    l两种方式:[index]和.get(index) l1.JQuery对象内部包含一个数组对象,可以通过[index]的方法,来得到相应的DOM对象 var $txtName=$("#txt ...

  9. HTML笔记、案例、可下载原件

    预备内容:--软件安装 1.记笔记工具:--typora 文件名:基本文件扩展名 eg:SDN.docx 销售统计表.xlsx 备注:显示/隐藏栏目中选中文件扩展名即可 备注:取消勾选隐藏已知文件类型 ...

最新文章

  1. 还是来说class,什么鬼,类会生宝宝
  2. python介绍和用途-Python --- Python的简介
  3. syslog(),closelog()与openlog()--日志操作函数
  4. 一个css和js结合的下拉菜单,支持主流浏览器
  5. 百万奖金!交通事件、医学病理、广告检测,江苏大数据开发与应用大赛报名...
  6. TFT_LCD液晶屏驱动设计与验证
  7. 深圳观澜机房(云计算数据中心)
  8. python爬房源信息_用python爬取链家网的二手房信息
  9. CentOS 编译 Nginx 服务
  10. string与StringBuilder之性能比较
  11. 使用jquery做一个动态简历
  12. LaTeX排版学习资源汇总
  13. 伟大的数学家,怎么都诞生在法国?
  14. 从单一服务到多元化服务,智能机器人JIMI的架构改造及逐步开放的过程
  15. 我们已经开发好了Magento的Ctopay(收汇宝)非3D网关
  16. 桃词典 Peach Dictionary 简易英语词典app开发 安卓软件开发 Part 9
  17. PDF Cookbook by Eric
  18. 线程、进程、多线程、多进程 和 多任务
  19. 怎样安装linux系统
  20. 2016年福建两化深度融合与新型CIO创新发展 论坛圆满落幕

热门文章

  1. 如何在asterisk中限制呼叫路数?
  2. 增加RIL组件时编辑出现的问题
  3. 进程控制3--signal
  4. 考公专业科目计算机,2017国考中国证监会专业科目考试大纲(计算机类)
  5. 【转】Windows消息传递机制详解
  6. 【转】2:C#TPL探秘
  7. 【转】OData – the best way to REST–实例讲解ASP.NET WebAPI OData (V4) Service Client
  8. 一步步编写操作系统 29 cpu缓存简介
  9. 一步步编写操作系统 08 bios跳转到神奇的内存地址0x7c00
  10. 【Python CheckiO 题解】Correct Sentence