git代码回滚的几种方式

这仍是第一次写关于git的文章,让我不禁的想起了大学那会尚未接触到git时的如噩梦般的版本控制。
每次若是代码要有大的改动都要提早copy一份出来,最后以致于有多少次大的改动就有多少分文件,并且每个都不敢删,写到这好想配个图,虽然我不造配哪一个图合适啊,反正就是相似于1,2,3,4,5...。
言归正传,咱们要说的是后悔药。
在工做中咱们必定都发生过这种状况,但愿把代码会滚到某个节点中,git有多中代码的回滚方式,这里作一个总结。
首先咱们到区分几个概念,工做区,暂存区,版本库,。git

工做区

所谓工做区,即咱们电脑中所看到的目录。app

版本库

在工做区有一个隐藏目录.git,这是Git的版本库。spa

暂存区

Git的版本库里存了不少东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为咱们自动建立的第一个分支master,以及指向master的一个指针叫HEAD。版本控制

下图显示了三者之间的关系,这是咱们了解git的基础
图片描述
图中左侧为工做区,右侧为版本库。在版本库中左侧区域是暂存区(stage),右侧标记为 "master / other" 的是 master 分支或其余分支所表明的目录树。指针

当对工做区修改(或新增)的文件执行 "git add" 命令时,暂存区的目录树被更新。code

当执行提交操做(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会作相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。对象

而咱们这里所谓的后悔药就是要讲代码会滚到某个提交历史的方法,下面就针对各类不一样状况一一讲解。索引

丢弃还没有被提交到暂存区的代码

1.git co -- file
其中 “--” 参数是必须的,不然就会变成切换分支。图片

2.git stash 储藏
git stash操做适用于,当你的工做进行到一半,此时还不想要提交,可是又必须切换到其余分支工做的时候。
执行命令同步

git stash

stash 命令就会将你此时工做区的代码存起来,待你想继续工做时,执行

git stash apply

你就能够从新应用你最后一次stash的内容了。此时的代码就回到了你上次到一半的内容上了。

已经提交到暂存区

1.git reset

git reset HEAD~1

暂存区的目录树会被重写,最后一次提交的内容会被丢弃,可是工做区不受影响。
可是加上 “--hard” 参数后,暂存区和工做目录都同步到你指定的提交。也就是HEAD~1.

git reset --hard HEAD~1

2.git rm --cached file
改命令会直接从暂存区删除文件,工做区则不作出改变。

已经提交到分支上的代码

1.git checkout HEAD . / git checkout HEAD file

当执行该命令时,会用 HEAD 指向的 master 分支中的所有或者部分文件,替换暂存区和以及工做区中的文件。这个命令是极具危险性的,由于不但会清除工做区中未提交的改动,也会清除暂存区中未提交的改动。

2.git reset --hard
其使用方法与上面讲的git reset同样,都是改变了暂存区的HEAD索引。

已经提交到远程的代码

1.git revert

git revert HEAD 撤销前一次 commit

git revert HEAD^ 撤销前前一次 commit

git revert fa042ce57 撤销指定的版本,撤销也会做为一次提交进行保存。

与reset不一样的是:

  1. revert不会舍弃原来的提交记录,而是生成了一次新的提交。

  2. reset是撤回到某个指定的版本,而revert则是将某个指定的版本撤销,也就是撤回到指定版本以前的一个版本上。

相关文章
相关标签/搜索