知识点:
1、git status,查看git仓库的状态
2、git diff 查看git修改了的内容
3、HEAD指向的版本就是当前版本,使用git reset --hard commit_id命令可以回到指定版本
4、通过git log查看提交历史和git reflog查看命令历史,确定回退或恢复到某一版本。
原文链接:
https://www.cnblogs.com/codemissing/p/git_version_back.html
查看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 commit和git 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 [email protected]
Date: Tue Feb 20 13:37:05 2018 +0800modify
commit d5b84bff04a672d9f520334d42e71a3e79910f17
Author: findmoon [email protected]
Date: Tue Feb 20 12:55:06 2018 +0800
modifya readme file
commit 3033dda882f53ea249d6dacd4c39c470fab700e8
Author: findmoon [email protected]
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,就可以恢复想要的版本
人总是会做后悔的事,一开始觉得提交有问题,后面发现还是正确的,问题是你用了git reset --hard HEAD^或git reset --hard commit_id回退的本地版本。
问题就出在了–hard上
现在也找不到新版本的commit id怎么办?
在Git中,总是有后悔药可以吃的。
1、找到commit_id
hezaizai@ubuntu: ~/code_test $ git reflog
1ab8e23 HEAD@{0}: reset: moving to HEAD^
f8e01df HEAD@{1}: commit: 最新节点
1ab8e23 HEAD@{2}: commit: commit the new f
66759e4 HEAD@{4}: commit: forword
9cb749d HEAD@{6}: commit: twice commit
eb593f8 HEAD@{8}: commit: first commit gitreset”
这里记录了你所有的操作记录
这里f8e01df 就是你回退的HEAD^,也就是那个commit_id。
2、恢复删除记录
推荐: git reset --hard commit_id
好了,世界又恢复了平静。
方法二: git cherry-pick commit_id
git cherry-pick commit_id 会生成新的节点,不是原来的那个,但文件恢复了。可参考我写的git cherry-pick。
一些说明:
1、reflog:Reference logs(参考日志)
2、log和reflog的区别。
git log是显示当前的HEAD和它的祖先的,递归是沿着当前指针的父亲,父亲的父亲,……,这样的原则。
git reflog是HEAD所指向的一个顺序的提交列表:它的undo历史。reflog并不是本地仓库的一部分,单独存储,不包含在pushes,fetches或者clones里面,它只是是本地的。
原文链接:https://blog.csdn.net/weixin_43083491/article/details/112618311