“ 产品说这个功能我们不要了。——编程三分钟”
第 7 篇
撤销暂存文件与任意切换文件版本
有时候我们想把暂存区的文件取出来。
一、暂存区到工作区
假如我们刚刚执行了git reset --soft
或者add
等的操作,把一些东西加到了我们的暂存区,比如日志文件,我们就要把他们从暂存区拿出来。
-
git status
查看暂存区,里面有一个mysql.log被放进去了 -
git reset -- mysql.log
把mysql.log
取出来 -
git status
可以看到真的取出来了 然后如果不要想这个文件的话再rm掉就好啦,但是如果这些文件每次自动生成都要用这种方式取出暂存区真的好累,我们可以用 git忽略不想提交的文件(后续技巧篇详细描述)
二、回滚文件到某个提交
当我们想要把某个文件任意的回滚到某次提交上,而不改变其他文件的状态我们要怎么做呢? 我们有两种情况,一种是,只是想在工作区有修改的文件,直接丢弃掉他现在的修改;第二种是想把这个文件回滚到以前的某一次提交。我们先来说第一种
1. 取消文件在工作区的修改
- 更新
time.txt
的内容,可以status
看到他发生了变化 -
git checkout -- time.txt
, 取消这次在工作区的修改,如果他已经被add
加到了暂存区,那么这个命令就没有用了,他的意思是取消本次在工作区的修改,去上一次保存的地方。如果没有add
就回到和版本库一样的状态;如果已经加到了暂存区,又做了修改,那么就回加到暂存区后的状态
2. 将文件回滚到任意的版本
我们这里说的把文件回滚到以前的某个版本的状态,完整的含义是保持其他文件的内容不变,改变这个文件到以前的某个版本,然后修改到自己满意的样子和做下一次的提交。
核心命令
git checkout [<options>] [<branch>] -- <file>...
我们还是用time.txt
这个文件来做试验,先搞三个版本出来,在这里我已经搞好了,来看看: 版本1,time.txt内容00:50
版本2,time.txt内容18:51
版本3,time.txt内容10:41
现在的是版本1,我们把版本3检出试试。达到下图的状态
- 使用
checkout
+commit id
+-- filename
的组合,横跨版本2把历史版本3的time.txt
搞出来了 - 查看状态,time.txt被改变了
我们来把time.txt恢复到版本1,同样的方法,因为版本1是上一次提交我们可以省略掉版本号
看到了吧!只要用git checkout commit_id -- filename
的组合,想搞出哪个文件历史版本就搞出哪个。
到了这里,你可能会很懵比,reset
和checkout
命令真的好像啊!都可以用来做撤消
-
checkout
语义上是把什么东西取出来,所以此命令用于从历史提交(或者暂存区域)中拷贝文件到工作目录,也可用于切换分支。 -
reset
语义上是重新设置,所以此命令把当前分支指向另一个位置,并且有选择的变动工作目录和索引。也用来在从历史仓库中复制文件到索引,而不动工作目录。
小小小小结
取出暂存区的文件:git reset -- 文件名
取消这次在工作区的修改: git checkout -- 文件名
把文件回滚到以前的某个版本的状态:git checkout
+commit id
+-- filename