乐趣区

关于git:git的撤销删除和版本回退

备注:

本文参考于廖雪峰的博客 Git 教程。按照其博客进行学习和记录,感激其自私分享,也欢送各位查看原文。

知识点:

1、git status,查看 git 仓库的状态

2、git diff 查看 git 批改了的内容

3、HEAD指向的版本就是以后版本,应用 git reset --hard commit_id 命令能够回到指定版本

4、通过 git log 查看提交历史和 git reflog 查看命令历史,确定回退或复原到某一版本。

查看 git 仓库的状态

咱们批改一下 readme 文件的内容,增加一行内容。

  • 运行 git status 查看状态
liu@liu-virtual-machine:~/gitTest$ git status
位于分支 master
尚未暂存以备提交的变更:(应用 "git add < 文件 >..." 更新要提交的内容)(应用 "git checkout -- < 文件 >..." 抛弃工作区的改变)批改:readme.txt

批改尚未退出提交(应用 "git add" 和 / 或 "git commit -a")

git status命令能够查看仓库以后的状态,下面显示,readme.txt 文件被批改过,但还没有退出提交批改的内容。

  • git diff能够查看批改了什么内容,这样就能够分明的晓得上次批改的内容是什么,如下
liu@liu-virtual-machine:~/gitTest$ git diff
diff --git a/readme.txt b/readme.txt
index 90269eb..7d0ff65 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,4 +1,4 @@

 `this is a test that I learning and use git version control system
 this is a beginning
-wofaidognyixie dognxi
+i Add a new line information in the end of readme.txt file

在批改最初一行之前我增加和提交了一行 wofaidognyixie dognxi, 当初批改为i Add a new line information in the end of readme.txt file,相当于删除增加。git diff 查看不同的内容,结果显示出批改前后的比照。

  • git add readme.txt增加批改,此时查看仓库状态,提醒: 要提交的变更为 readme.txt
liu@liu-virtual-machine:~/gitTest$ git status
位于分支 master
要提交的变更:(应用 "git reset HEAD < 文件 >..." 以勾销暂存)批改:readme.txt
  • git commitgit status 提交并查看以后仓库状态
liu@liu-virtual-machine:~/gitTest$ git commit -m "add a new line in readme.txt"
[master e181953] add a new line in readme.txt
 1 file changed, 1 insertion(+), 1 deletion(-)
liu@liu-virtual-machine:~/gitTest$ git status
位于分支 master
无文件要提交,洁净的工作区

显示没有须要提交的批改,洁净的工作区,(working directory clean)

查看历史记录。

对于版本控制系统,重要的是咱们能够查看历史记录,不便咱们晓得每次批改和提交的内容。

  • git log查看批改历史

git log显示从最近到最远的提交日志,每一次提交的作者、日期和提交的信息都被显示进去。

  • 如果显示信息太多,可加上--pretty-oneline
liu@liu-virtual-machine:~/gitTest$ git log --pretty=oneline
e181953c3f43e15ceee10fb86f05fd4568265127 add a new line in readme.txt
1769dcb57a1b16d3c4ed7f96828af2f1131f5882 modify
d5b84bff04a672d9f520334d42e71a3e79910f17 modifya readme file
3033dda882f53ea249d6dacd4c39c470fab700e8 add a readme file

此时每条 log 记录被显示在一行。

每行后面的一串字母数字是 commit id(版本号)。和 svn 不一样,Git 的commit id 不是 1,2,3 递增数字,而是一个 SHA1 计算出来的一个十分大的数字,16 进制示意. 为什么 commit id 须要用这么一大串数字示意呢?因为 Git 是分布式的版本控制系统,前面咱们还要钻研多人在同一个版本库里工作,如果大家都用 1,2,3……作为版本号,那必定就抵触了。

Git 将每一次提交串成一条工夫线。

版本回退

  • git 首先须要晓得以后版本是哪个版本。

Git 中,用 HEAD 示意以后版本,即下面最新提交的e181...5127,上一个版本就是HEAD^, 上上个版本使HEAD^^, 当往上 100 个版本时,写成HEAD~100

  • git reset --hard HEAD^

将以后版本 “add a new line in readme.txt” 回退到上一版本“modify”,如下:

iu@liu-virtual-machine:~/gitTest$ git reset --hard HEAD^
HEAD 当初位于 1769dcb modify

查看 readme.txt 的内容曾经是 modify 版本,

此时用 git log 查看历史记录

liu@liu-virtual-machine:~/gitTest$ git log
commit 1769dcb57a1b16d3c4ed7f96828af2f1131f5882
Author: findmoon <1286637198@qq.com>
Date:   Tue Feb 20 13:37:05 2018 +0800

    modify

commit d5b84bff04a672d9f520334d42e71a3e79910f17
Author: findmoon <1286637198@qq.com>
Date:   Tue Feb 20 12:55:06 2018 +0800

    modifya readme file

commit 3033dda882f53ea249d6dacd4c39c470fab700e8
Author: findmoon <1286637198@qq.com>
Date:   Tue Feb 20 12:48:53 2018 +0800

    add a readme file

之前的最新版本记录曾经没有。要想从新回到原来的最新版本,你须要记下过后的版本号(终端不敞开,能够向上找到)。如“add a new line in readme.txt”版本的commit id e18195…

  • 指定后退到将来某一版本
liu@liu-virtual-machine:~/gitTest$ git reset --hard e181953c3f43e15ceee10fb86f05fd4568265127
HEAD 当初位于 e181953 add a new line in readme.txt

readme.txt内容曾经变为最新版本。

  • git reset --hard e181953能够不用将版本号写全,Git 会主动查找

Git 的版本回退速度十分快,因为 Git 在外部有个指向以后版本的 HEAD 指针,当回退版本时,Git 仅仅是把 HEAD 从指向以后版本,改为指向回退的版本. 而后把工作区的文件更新。

  • 当回退到某一版本后又想复原到最新版本,就必须找到 commit id。Git 提共git reflog 记录你的每一次命令
liu@liu-virtual-machine:~/gitTest$ git reflog
1769dcb HEAD@{0}: reset: moving to HEAD^
e181953 HEAD@{1}: reset: moving to e181953c3f43e15ceee10fb86f05fd4568265127
1769dcb HEAD@{2}: reset: moving to HEAD^
e181953 HEAD@{3}: commit: add a new line in readme.txt
1769dcb HEAD@{4}: commit: modify
d5b84bf HEAD@{5}: commit: modifya readme file
3033dda HEAD@{6}: commit (initial): add a readme file

通过每一条命令历史后面的commit id,就能够复原想要的版本

退出移动版