Git 如何回退代码
前言
现在工作中用的最多的版本管理工具就是 git,相信大家在互联网公司都在使用它。故今天对于 git 的使用方法和常用命令做一个简短的介绍,一个是用来自己作为学习记录,另一个作为工作的备忘。当然有需要的小伙伴也可以当做搜索问题的一个答案参考项。好了,话不多说,下面就来介绍一下今天的主题 git 是如何回退代码的?
我们下面分三种情况来介绍:
一个是代码已经还没提交到暂存区
另一个是代码已经提交到暂存区
最后一个就是代码已经 push 到远程仓库
下面先对暂存区这个名词做一个解释:
暂存区:Git 的版本库里存了很多东西,其中最重要的就是称为 stage(或者叫 index)的暂存区,还有 Git 为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
一、代码已经还没提交到暂存区
Git 会告诉你,git checkout -- file
可以丢弃工作区的修改:
$ git checkout -- readme.txt
命令git checkout -- readme.txt
意思就是,把readme.txt
文件在工作区的修改全部撤销,这里有两种情况:
一种是
readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;一种是
readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
git checkout -- file
命令中的--
很重要,没有--
,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout
命令。
二、代码已经提交到暂存区
Git 同样告诉我们,用命令git reset HEAD <file>
可以把暂存区的修改撤销掉(unstage),重新放回工作区:
$ git reset HEAD readme.txt Unstaged changes after reset: M readme.txt
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本
三、代码已经 push 到远程仓库
在实际工作中,我们脑子里怎么可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统干什么。版本控制系统肯定有某个命令可以告诉我们历史记录,在 Git 中,我们用git log
命令查看:
git log
命令显示从最近到最远的提交日志
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline
参数
首先,Git 必须知道当前版本是哪个版本,在 Git 中,用HEAD
表示当前版本
上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上 100 个版本写 100 个^
比较容易数不过来,所以写成HEAD~100
。
以使用git reset
命令:
$ git reset --hard HEAD^
可以指定回到未来的某个版本:
$ git reset --hard commitId
现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id
怎么办?
在 Git 中,总是有后悔药可以吃的。当你用$ git reset --hard HEAD^
回退到x
xx 版本时,再想恢复到 yyy,就必须找到x
xx 的 commit id。Git 提供了一个命令git reflog
用来记录你的每一次命令:
$ git reflog
总结一下:
HEAD
指向的版本就是当前版本,因此,Git 允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。穿梭前,用
git log
可以查看提交历史,以便确定要回退到哪个版本。要重返未来,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本。
版权声明: 本文为 InfoQ 作者【秋天】的原创文章。
原文链接:【http://xie.infoq.cn/article/1f27697f0b9a1036a07461eac】。文章转载请联系作者。
评论