04 时间机穿梭——版本回退

03节的时候我们已经成功地添加并提交了一个readme.txt文件,现在,我们继续修改readme.txt文件。运行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

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        .classpath
        .project
        .settings/
        bin/
        src/

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

git status命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,readme.txt被修改过了,但还没有准备提交的修改。Untracked files列出还没有跟踪的文件。

虽然Git告诉我们readme.txt被修改了,但如果能看看具体修改了什么内容,自然是很好的。比如你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的readme.txt,所以,需要用git diff这个命令看看:

图中可看到很多乱码,这是readme.txt编码问题,可以用Notepad++等工具把它变成UTF8,这时可以看到:

知道了对readme.txt作了什么修改后,再把它提交到仓库就放心多了,提交修改和提交新文件是一样的两步,第一步是git add readme.txt

执行完之后再执行git status,便可看到:

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   readme.txt

此时可以看到readme.txt文件在待提交中,第二步是git commit -m xxxx。

这是正常的提交,但有时候我们会不小心删错了文件或改坏了文件,此时,我们还是可以恢复到修改前的某个commit状态的,首先通过git log命令查看提交的历史。

$ git log
commit cd7519f910527bea01181226d83bd59c03d9e159 (HEAD -> master)
Author: wudiyong <774695423@qq.com>
Date:   Sun Nov 25 15:18:40 2018 +0800

    第6次提交

commit 425a952a81acf2e2bd549b40519af3be021debf0
Author: wudiyong <774695423@qq.com>
Date:   Sun Nov 25 15:17:47 2018 +0800

    第5次提交

首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交cd7519f910527bea01181226d83bd59c03d9e159 

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

注意,这里是本地版本库(本地仓库)的回退,并不是工作区修改撤销,也不是远程仓库的回退。假设我们要把本地仓库从第6次提交回退到第5次提交,则可以执行git reset --hard HEAD^命令,执行该命令后,HEAD便指向第5次提交的位置,工作区的内容也恢复到第5次提交的内容。如果执行git reset --hard HEAD,则HEAD指向位置不变,但工作区还是会恢复到HEAD指向的位置内容。我们还可以继续执行git reset --hard HEAD^继续往前回退。

回退到第5次提交后,再执行git log命令查看提交历史,此时第6次提交的记录已经不在了,假如我们回退错了,想恢复到第6次提交,怎么办?

如果命令窗口还没关掉的话,可以往前滚,找到第6次提交的id,也就是cd7519f910527bea01181226d83bd59c03d9e159,

然后执行命令:git reset --hard cd7519f

版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。此时第6次提交的内容又回来了。

假如窗口已经关了,找不到要恢复的提交的id,这种情况也是可以恢复的,Git提供了一个命令git reflog用来记录你的每一次命令,里面可以看到每一次操作的记录:

$ git reflog
425a952 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
cd7519f HEAD@{1}: reset: moving to cd7519f91
425a952 (HEAD -> master) HEAD@{2}: reset: moving to HEAD
425a952 (HEAD -> master) HEAD@{3}: reset: moving to HEAD^
cd7519f HEAD@{4}: reset: moving to HEAD
cd7519f HEAD@{5}: reset: moving to HEAD
cd7519f HEAD@{6}: reset: moving to HEAD
cd7519f HEAD@{7}: commit: 第6次提交
425a952 (HEAD -> master) HEAD@{8}: commit: 第5次提交
3b985ac HEAD@{9}: commit: xsss
a597a2e HEAD@{10}: commit: xxxxx
2f8dd17 HEAD@{11}: commit (initial): 首次提交

上面的操作只提交到本地仓库,还需要用命令git push推送到远程仓库,如果还没配置远程仓库地址,执行git push会报错:

$ git push
fatal: No configured push destination.
Either specify the URL from the command-line or configure a remote repository using

    git remote add <name> <url>

and then push using the remote name

    git push <name>

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值