Git 撤销指南

Git 撤销指南

Git 撤销有三个场景
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,用命令:git reset --hard commit_id不过前提是没有推送到远程库。

场景一

在熬夜加班时,你正在赶一份代码,你在readme.txt中添加了一行:

$ cat readme.txt

Git is a distributed version control system.

Git is free software distributed under the GPL.

Git has a mutable index called stage.

Git tracks changes of files.

Git is not a good tool

在你准备提交前,突然发现发现了“Git is not a good tool”这句话是不对的!

如果用git status查看一下:

$ git status

# On branch master

# Changes not staged for commit:

# (use "git add <file>..." to update what will be committed)

# (use "git checkout -- <file>..." to discard changes in working directory)

#

# modified: readme.txt

#

no changes added to commit (use "git add" and/or "git commit -a")

Git会提示你,git checkout -- file可以丢弃工作区的修改:

$ git checkout -- readme.txt

命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,就是让这个文件回到最近一次git commit或git add时的状态。

现在,看看readme.txt的文件内容:

$ cat readme.txt

Git is a distributed version control system.

Git is free software distributed under the GPL.

Git has a mutable index called stage.

Git tracks changes of files.

文件内容果然复原了。

git checkout -- file命令中的--很重要,没有--,就变成了“创建一个新分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。

场景二

加班愈发困了,你不但写错了,还git add到暂存区了:

$ cat readme.txt

Git is a distributed version control system.

Git is free software distributed under the GPL.

Git has a mutable index called stage.

Git tracks changes of files.

My stupid boss still prefers SVN.

$ git add readme.txt

在commit之前,聪明的你发现了这个问题。用git status查看一下,修改只是添加到了暂存区,还没有提交:

$ git status

# On branch master# Changes to be committed:# (use "git reset HEAD <file>..." to unstage)## modified: readme.txt#

Git同样告诉我们,用命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区:

$ git reset HEAD readme.txt

Unstaged changes after reset:

M readme.txt

git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

再用git status查看一下,现在暂存区是干净的,工作区有修改:

$ git status

# On branch master

# Changes not staged for commit:

# (use "git add <file>..." to update what will be committed)

# (use "git checkout -- <file>..." to discard changes in working directory)

#

# modified: readme.txt

#

no changes added to commit (use "git add" and/or "git commit -a")

回顾下场景一如何丢弃工作区的修改吗?

$ git checkout -- readme.txt

$ git status

# On branch master

nothing to commit (working directory clean)

场景三

readme.txt文件一共有几个版本被提交到Git仓库里了:
版本1:wrote a readme file

Git is a version control system.

Git is free software.

版本2:add distributed

Git is a distributed version control system.

Git is free software.

版本3:append GPL

Git is a distributed version control system.

Git is free software distributed under the GPL.

在Git中,我们用git log命令查看:

$ git log

commit 3628164fb26d48395383f8f31179f24e0882e1e0

Author: f_zhou <[email protected]>

Date: Tue Aug 20 15:11:49 2013 +0800

append GPL

commit ea34578d5496d7dd233c827ed32a8cd576c5ee85

Author: f_zhou <[email protected]>

Date: Tue Aug 20 14:53:12 2013 +0800

add distributed

commit cb926e7ea50ad11b8f9e909c05226233bf755030

Author: f_zhou <[email protected]>

Date: Mon Aug 19 17:51:55 2013 +0800

wrote a readme file

git log命令显示从最近到最远的提交日志,我们可以看到3次提交,最近的一次是“append GPL”,上一次是“add distributed”,最早的一次是“wrote a readme file”。

如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:

$ git log --pretty=oneline

3628164fb26d48395383f8f31179f24e0882e1e0 append GPL

ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed

cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file

我们现在回滚版本咯
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一样),

上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

现在,我们要把当前版本“append GPL”回退到上一个版本“add distributed”,

就可以使用git reset命令:

$ git reset --hard HEAD^

HEAD is now at ea34578 add distributed

看看readme.txt的内容是不是版本“add distributed”:

$ cat readme.txt

Git is a distributed version control system.

Git is free software.

还可以继续回退到上一个版本“wrote a readme file”,不过且慢,然我们用git log再看看现在版本库的状态:

$ git log

commit ea34578d5496d7dd233c827ed32a8cd576c5ee85

Author: f_zhou <[email protected]>

Date: Tue Aug 20 14:53:12 2013 +0800

add distributed

commit cb926e7ea50ad11b8f9e909c05226233bf755030

Author: f_zhou <[email protected]>

Date: Mon Aug 19 17:51:55 2013 +0800

wrote a readme file

Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向“append GPL”:

然后顺便把工作区的文件更新了。所以你让HEAD指向哪个版本号,你就把当前版本定位在哪。

现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id怎么办?

在Git中,总有后悔药可以吃的。当你用$ git reset --hard HEAD^回退到“add distributed”版本时,再想恢复到“append GPL”,就必须找到“append GPL”的commit id。

Git提供了一个命令git reflog用来记录你的每一次命令:

$ git reflog 

ea34578 [email protected]{0}: reset : moving to HEAD^ 

3628164 [email protected]{ 1 }: commit : append GPL 

ea34578 [email protected]{ 2 }: commit : add distributed 

cb926e7 [email protected]{ 3 }: commit (initial): wrote a readme file 

第二行显示“append GPL”的commit id是3628164,现在,你又可以乘坐时光机回到未来了。

要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013744142037508cf42e51debf49668810645e02887691000

时间: 2024-10-06 01:56:59

Git 撤销指南的相关文章

Git使用指南

不都是SCM代码管理嘛,有很大区别么?很多svn老鸟都是抱着这样的心态去学习git,然后无一幸免地陷入"查阅过很多资料,依然掌握不好"的困境,至少我们团队是这样的. 网上的资料确实已经很多了,却没有把整个知识结构串起来.通读<git权威指南>是可行的,只是大家都急着用,没那耐性.我这里熬一碗鸡汤,整理供大家享用. 一.安装 服务器端不展开,因为主要面向搬砖的码农. 客户端可参见大神 廖雪峰 的Git教程-安装git 需要特别说明的是,在windows中,msysgit才是真

Git权威指南学习笔记(一)Git初始化

1.在Git中配置用户名和邮件地址 $ git config --global user.name "Jymn_Chen" $ git config --global user.email "[email protected]" 注意把用户名和邮件地址替换成你自己的资料. 在这里的参数global表示配置的作用范围是当前用户,如果将参数改为system,那么配置的作用范围是系统中的所有用户. 2.创建版本库 新建一个目录并cd到目录中,执行以下命令: $ git i

Git权威指南学习笔记(二)Git暂存区

如下图所示: 左侧为工作区,是我们的工作目录. 右侧为版本库,其中: index标记的是暂存区(stage),所处目录为.git/index,记录了文件的状态和变更信息. master标记的是master分支所代表的目录树.HEAD指向master分支. objects标记的是Git的对象库,所处目录为.git/objects,文件索引建立了文件和对象库中对象实体之间的映射关系. 通过该图我们可以清晰地看出add,commit等命令的转化关系.下面通过git diff和git status两条命

2017-03-10&lt;Git撤销修改&gt;

Git撤销修改 撤销修改分为两种情况: 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态: 一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态. 总之,就是让这个文件回到最近一次git commit或git add时的状态. 情况一:工作区修改还未放到暂存区 添加一条my stu........... $ cat readme.txt Git is a distributed version cont

史上最浅显易懂的Git学习指南

今天在网上搜了下Git,找到了一个很好的Git学习指南,尽然一口气把它全部刷了一遍,算是简单入门了.教程写的很好,浅显易懂,配有实例讲解,还有小视频.感觉很棒,于是我在Linux(deepin)环境下一步一步的学习,感觉效果很好.推荐一下,也作为一个学习的参考. 是技术大牛廖雪峰写的 链接地址:传送门 另外有官方文档的中文翻译 http://git.oschina.net/progit/ 可以参考一下 Git的官方网站:http://git-scm.com GitHub官网:https://gi

git 撤销提交的文件

一.问题 近期在使用git时遇到一个问题,就是在git上传文件时,将一个100兆的大文件添加到了git,并执行了push操作,这时在上传完毕后,会提示这个错误 Large files detected see http:git.io/iEPt8g for more information this is larger than GitHubs recommended maximum file size of 50MB 即git无法上传超过50M的单个文件. 如果未push,可通过git comm

小蚂蚁学习git(2)——Git撤销修改和删除,远程仓库的创建推送和克隆

接上篇(http://my.oschina.net/woshixiaomayi/blog/521265)继续写. 四.Git撤销修改和删除 1.撤销修改 场景:在readme.txt中添加了一段话"今天天气不错".在还未提交之前,发现这句话写的不对,那么有一下几种方式修改:1.直接动手删除掉那些错误的内容,然后再用add添加到暂存区,在commit提交到分支.2.按照上一篇所讲到的使用命令 git reset -hard  HEAD^ 回退到上一个版本.除了昨天说的这两个方法之外,还有

git——简易指南

Git对于我来说,只知道是一个版本控制器,类似于乌龟的svn.其中也仅仅会几个常的命令,比如说“更新git pull”.“提交git push”等等,因为记得当初使用的时候,师傅告诉我,对于你不懂这个不要紧,记住几个常用的命令就足够使用了. 师傅的话没有错,有这些命令是足够使用了,但往有时候还是很难完成我们工作中的需求,比如如何安装.分别何创建库等,这就几个命令无法实现的了.只可惜自己太懒,以致于每次使用的时候都需要去查找相关的资料,真是无颜面对江东父老呀. 今天邮件中收到一个有关于git指南的

【转】git - 简明指南

git - 简明指南 助你入门 git 的简明指南,木有高深内容 ;) 作者:罗杰·杜德勒 感谢:@tfnico, @fhd 和 Namics其他语言 english, deutsch, español, français, indonesian, italiano, nederlands, polski, português, русский, türkçe, ??????, 日本語, ??? Vietnamese 如有纰漏,请在 github 提报问题 安装 下载 git OSX 版 下载