赞
踩
这还是第一次写关于git的文章,让我不由的想起了大学那会还没有接触到git时的如噩梦般的版本控制。
每次如果代码要有大的改动都要提前copy一份出来,最后以至于有多少次大的改动就有多少分文件,而且每一个都不敢删,写到这好想配个图,虽然我不造配哪个图合适啊,反正就是类似于1,2,3,4,5...。
言归正传,我们要说的是后悔药。
在工作中我们一定都发生过这种情况,希望把代码会滚到某个节点中,git有多中代码的回滚方式,这里做一个总结。
首先我们到区分几个概念,工作区,暂存区,版本库,。
工作区
所谓工作区,即我们电脑中所看到的目录。
版本库
在工作区有一个隐藏目录.git,这是Git的版本库。
暂存区
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
下图显示了三者之间的关系,这是我们了解git的基础
图中左侧为工作区,右侧为版本库。在版本库中左侧区域是暂存区(stage),右侧标记为 "master / other" 的是 master 分支或其他分支所代表的目录树。
当对工作区修改(或新增)的文件执行 "git add" 命令时,暂存区的目录树被更新。
当执行提交操作(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不同的是:
revert不会舍弃原来的提交记录,而是生成了一次新的提交。
reset是撤回到某个指定的版本,而revert则是将某个指定的版本撤销,也就是撤回到指定版本之前的一个版本上。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。