参考:如何在 Git 中重置、恢复,返回到以前的状态

使用git时,如果对刚刚提交的后悔了怎么办,如何撤销?

方法一:手动修改

你把新增的文件删了 或者 更改过的文件再改回来,然后再commit一次。这种方式不推荐,当修改量大的时候根本法没法搞,虽然git diff可以帮助我们在最近两次提交上做对比,但依然很难操作

方法二:使用reset命令

实际上,可以将reset其视为rollback(回滚”)- 将你的local environment指向以前的commit。 “本地环境”包括:local repository(本地存储库), staging area(暂存区域), and working directory(工作目录)。

下图是Git中的一系列提交记录。 Git中的分支可以想象成一个指向特定提交命名的可移动指针。 在这种情况下,我们的主分支指向commit链中最新的提交。

查看提交历史记录

$ git log --oneline
b764644 File with three lines
7c709f0 File with two lines
9ef9173 File with one line

试想如果我们回滚到先前的提交会发生什么? 简单 - 我们只需移动branch pointer(分支指针),Git提中reset命令就是为我们执行此操作的。 例如,如果我们想要将master重置为指向当前提交的两个提交,我们可以使用以下任一方法:

$ git reset 9ef9173

或者

$ git reset current~

下图显示此操作的结果。 在此之后,如果我们在当前分支(master)上执行git log命令,我们将只看到一个提交。

$ git log --oneline
9ef9173 File with one line

git reset命令还包括一些列参数,这些参数允许你使用最终提交的内容更新本地环境的其他部分。 这些选项包括:

hard:重置repository中branch pointer的指向,使用commit的内容填充working directory ,以及重置staging area(暂存区域)。

soft:仅重置repository中branch pointer的指向。

mixed:(默认值)重置repository中branch pointer的指向。重置staging area(暂存区域)。

使用这些选项在目标环境中非常有用,例如git reset --hard <commit sha1 | reference>。 这会覆盖您尚未提交的任何本地更改。 实际上,它会重置(清除)staging area,并使用使用commit的内容填充working directory 。 在使用hard选项之前,请确保这是您真正想要做的事情,因为该命令会覆盖任何未提交的更改。

方法三:使用revert命令

git revert命令的净效果类似于reset,但其方法不同。 通常,reset的做法是移动分支指针到commit链其他位置,进而实现撤销更改。revert命令会在链的末尾添加新的提交以“取消”更改。 见下图,返回到只有两行的版本的一种方法是reset当前提交,即git reset HEAD~1。另一种转到两行版本的方法是添加一个删除三行版本的新提交 - 效果上等价于取消三行那个版本。 这可以使用git revert命令完成,例如:

$ git revert HEAD

由于这会添加一个新的提交,Git会提示commit消息:

Revert "File with three lines"
This reverts commit b764644bad524b804577684bf74e7bca3117f554.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
# modified: file1.txt
#

下图为revert操作后的commit链情况

如果我们执行git log,会看到之前的提交记录

$ git log --oneline
11b7712 Revert "File with three lines"
b764644 File with three lines
7c709f0 File with two lines
9ef9173 File with one line

当前工作目录内容是

$ cat <filename>
Line
Line

选择revert还是reset?

如果您已经将commit链推送到远端仓库(其他人可能已经提取代码并开始使用它),则revert是一种让他人获取更改的非常友好的方式。这是因为Git工作流很适合在分支结束时获取额外的提交,这是因为 Git 工作流可以非常好地在分支的末端添加提交,但是当有人 reset 分支指针之后,会导致一些分支再也看不见(如果你记得住那些分支的sha1,是可以在reset回来的。但是怎么可能有人记得住那么多sha1)。

使用Git时的一个基本规则:在本地存储库中进行这些类型的更改,reset、revert都没关系。但是,如果提交已经被推送到远程仓库而其他人可能正在使用它们的话,则不要做影响commit历史纪录的更改。

简而言之,如果你rollback,undo或rewrite其他人正在使用的commit链的历史记录,那么当他们尝试根据他们提取的原始链合并更改时,他们将会很头疼。 如果您必须对已经被推送并且正由其他人使用的代码进行更改,请在进行更改之前考虑进行通知,让他人有机会合并自己的更改。 然后他们可以在侵权操作后提取新的副本而无需合并。

你可能已经注意到,在我们完成reset后,原始提交链仍然存在。 我们移动分支指针并将代码重置为先前的commit,但它没有删除任何提交。 这意味着,只要我们知道分支指针的sha1,我们还能指回来。

git reset <sha1 of commit>

在替换commit时,我们在Git中执行的大多数其他操作中都会发生类似的事情。 创建新提交,并将分支指针移动到新的commit。 但旧的commit仍然存在。

git命令——revert、reset的更多相关文章

  1. 常用 Git 命令清单

    我每天使用 Git ,但是很多命令记不住. 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60-100个命令. 下面是我整理的常用 Git 命令清单.几个专用名词的译名如下 ...

  2. 常look的Git命令

    常用的Git命令   命令  简要说明 git add 添加至暂存区 git add–interactive 交互式添加 git apply   应用补丁 git am  应用邮件格式补丁 git a ...

  3. 简明 Git 命令速查表(中文版)

    原文引用地址:https://github.com/flyhigher139/Git-Cheat-Sheet/blob/master/Git%20Cheat%20Sheet-Zh.md在Github上 ...

  4. 常用 Git 命令清单 转

    我每天使用 Git ,但是很多命令记不住. 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60-100个命令. 下面是我整理的常用 Git 命令清单.几个专用名词的译名如下 ...

  5. 常用 Git 命令清单(摘录)

    来源:阮一峰的网络日志 网址:http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html 我每天使用 Git ,但是很多命令记不住. 一般来 ...

  6. [转]常用 Git 命令清单

    作者: 阮一峰 我每天使用 Git ,但是很多命令记不住. 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60-100个命令. 下面是我整理的常用 Git 命令清单.几个专 ...

  7. 常用Git命令

    Git教程:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 一般来说,日常使用只要 ...

  8. 熟练使用git命令

    git工作流程图: 下面是我整理的常用 Git 命令清单.几个专用名词的译名如下: Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remo ...

  9. 我 Git 命令列表 (2)【转】

    转自:http://www.microsofttranslator.com/bv.aspx?from=en&to=zh-CHS&a=http%3A%2F%2Fvincenttam.gi ...

随机推荐

  1. OpenGL程序无法启动此应用程序,因为计算机中丢失glut32.dll(转))

    今天打开一个OpenGL源码,各种修改之后想要运行看一下效果,结果在我的开发环境下出现缺少相应的dll库: Windows7 64位+VS2010 提示:程序无法启动此应用程序,因为计算机中丢失glu ...

  2. C# WinForm程序中使用Unity3D控件 (转)

    https://www.cnblogs.com/cnxkey/articles/5394378.html 最近在自学Unity3D,打算使用这个时髦.流行.强大的游戏引擎开发一个三维业务展示系统,不过 ...

  3. JS的slice、substring、substr字符串截取

    JS中截取一个字符串的三种方法:字符串.slice(开始索引,结束索引)字符串.substring(开始索引,结束索引)字符串.substr(开始索引,截取的长度) 如果需要截取到该字符串的最后,可以 ...

  4. CTF 资源

    1.<CTF 工具集>包括web工具.渗透环境.隐形工具.逆向工具.漏洞扫描工具.sql注入工具.暴力破解工具.加解密工具等等. 参考地址:https://www.ctftools.com ...

  5. web端自动化——Remote应用

    Selenium Grid允许同时并行地.在不同的环境上运行多个测试任务.这里主要演示一下怎么使用Selenium Grid. 准备: 1. 需要两台机子 2.两台机子分别安装好JDK环境 3.两台机 ...

  6. 捕捉AVPlayerViewController 系统原生工具栏的出现、隐藏事件

    需求前提 1. app内轻量级的视频播放功能,故不希望引入“过度开发.过度封装”的第三方控件组,使用原生的AVPlayerViewController 2. 工具栏有新增控件需求,如下载按钮 等 3. ...

  7. React项目使用Redux

    ⒈创建React项目 初始化一个React项目(TypeScript环境) ⒉React集成React-Router React项目使用React-Router ⒊React集成Redux Redux ...

  8. java并发知识点

    前言 先列出java并发涉及的知识点,后面再慢慢补. java并发 1 常见概念 进程/线程 进程:程序执行的实体,操作系统资源调度资源分配的基本单元 线程:程序执行的最小单元,拥有独立的堆栈和局部变 ...

  9. vim 常用命令总结(排版精良,内容优质)

    1. 格式说明 <xxx>:尖括号的含义表示这是一个占位参数,也就是必须有的参数,实际输入的内容是 xxx [xxx]:方括号的含义表示这是一个可选参数,也就是可有可无,实际输入的内容是 ...

  10. javascript加超链接

    JavaScript link 方法:给字符串加上超链接JavaScript link 方法link 方法返回使用 HTML a 标签属性定义的(斜体)字符串.其语法如下:str_object.lin ...