补1: gitee上回退自己的版本。
- 先在本地仓库回退版本,输入如下命令:
git reset --hard <版本号>
- 再将本地仓库推送到远程仓库:
git push <仓库名> <分支> -f
# -f 必须加上,表示强制推送,不管是否有文件丢失。
如果非要给git定位一个核心的话,我想不是什么文件提交,本地仓储,而是版本回退。
先解释一下什么是版本回退,举个例子如下:
假设有个程序员小芳开发一套软件,软件名为demo,这个软件有三个版本,即demo1,demo2,demo3;现在小芳手里只有demo3软件程序,她认为demo2软件程序优于demo3,所以她想回退到demo2,以便后续开发。demo3到demo2就是版本回退。
git完美的解决这个问题,git记录了各个版本的信息,在实际开发中,就相当于各个时期的文件。
现在我们借用前文创建的demo仓库先连续开发三个版本,方便后续的版本回退操作介绍:
版本一:在demo仓库下的src文件夹中添加一个version.txt文件,文件内容如下:
this is version_1
在dos仓库目录下执行如下命令:
git add *
git commit -m “this is version_1”
版本二:将version.txt文件内容修改,改为如下内容:
this is version_2
在dos仓库目录下执行如下命令:
git add *
git commit -m “this is version_2”
版本三:再将version.txt文件内容修改,改为如下内容:
this is version_3
在dos仓库目录下执行如下命令:
git add *
git commit -m “this is version_3”
给出dos总执行图,不然突然性间接智障病症发作了,就不好了。
三个版本已经在本地仓库中建立了,现在你能看到的只是版本三。执行git log命令显示从最近到最远的提交日志,其命令执行输出结果如下:
commit 919351cb71ef98622825882021c79d7ee6f64ea0 (HEAD -> master)
Author: 3410458308@qq.com 3410458308@qq.com
Date: Fri May 15 11:16:15 2020 +0800
this is version_3
commit 91083169d146ed86e6cfc87f16a600943f09be45
Author: 3410458308@qq.com 3410458308@qq.com
Date: Fri May 15 11:15:54 2020 +0800
this is version_2
commit 5629f26a43b626992955707e849311322585807a
Author: 3410458308@qq.com 3410458308@qq.com
Date: Fri May 15 11:15:32 2020 +0800
this is version_1
commit a0e221b13b81c08f7a51cfe06ce0cf6e08b410d7
Author: 3410458308@qq.com 3410458308@qq.com
Date: Fri May 15 10:38:13 2020 +0800
add hello world in readme.md
commit bb014661e21b3f02862f946a74b19a61545f305b (origin/master, origin/HEAD)
Author: liangmu 3410458308@qq.com
Date: Thu May 14 17:53:22 2020 +0800
print hello world
注:按q可以退出查看状态。
随便提出一条记录进行分析,如最远的一条记录:
commit bb014661e21b3f02862f946a74b19a61545f305b (origin/master, origin/HEAD)
Author: liangmu 3410458308@qq.com
Date: Thu May 14 17:53:22 2020 +0800
print hello world
其中,commit后续的内容一直到左括号左边,是本次提交的唯一标识符,俗称ID;其生成方式是以SHA1算法,将仓库编码输出,其输出结果就是ID了,当然这也是仓库中的版本号(系统生成的,不代表你自己定义的版本号)。
可能有人会有疑问,为啥子不直接1,2,3呢?难道创造这个系统的人傻了?我一直秉持一个观点,别人那么做必定有别人的道理,经常说别人傻逼的人也是一个傻逼。抱着求学好知的态度,博主查了很多资料,得出一个结论,这个结论口述没有意思,举个例子吧!
假设程序员小芳和程序员老王共同开发一个软件,小芳对自己开发的版本以1,2,3命名,老王也一样;然后老王有天偷懒了,他的开发进度停留在2;而小芳是个勤快的娃,一直开发到版本4;两个人将自己开发的软件都提交到仓库,新提交的会顶替原内容。后来小芳开发软件需要用到版本2的内容,提取出来的内容可能是老王开发的,这显然不符合小芳的实际要求。如果利用sha1算法生成的版本号,这样就可以有效的避免存储冲突。
其他的信息,看英文就明白啥子意思了,没必要说。
如果你嫌弃git log输出的东西太多了,怎么办?可以给git log加上–pretty=oneline修饰符,让其精简一下。pretty本意是漂亮的,优秀的,悦目的。后面的oneline表示只输出每条日志信息的第一条,如果改为twoline则表示第二条。
输入命令git log --pretty=oneline精简后的结果如下:
asdfniwnegnainanf12354632242453647234564 (HEAD -> master) this is version_3
91083169d146ed86e6cfc87f16a600943f09be45 this is version_2
5629f26a43b626992955707e849311322585807a this is version_1
a0e221b13b81c08f7a51cfe06ce0cf6e08b410d7 add hello world in readme.md
bb014661e21b3f02862f946a74b19a61545f305b (origin/master, origin/HEAD) print hello world
61369531f8b38b12c541b28f2a47e388beefbbb6 Initial commit
好了,改做的准备已经做完了,现在的问题是怎么将demo版本3回退到其他版本。 在git中,有个head头指针,用来指向当前版本。我们只需要改变head的指向,就可以改变仓库版本。HEAD^ 表示上一个版本,HEAD^^ 表示上上一个版本,往上N个版本写N个^比较麻烦,所以可以写成HEAD~N。当然你也可以直接指定返回版本ID进行返回,ID不必写全,只需要写出具有表示性的前几位就可以了(一般前十位),系统会自动匹配其他字符。
现在我们将版本回退到上一个版本,在命令行窗口输入如下命令:
git reset --hard HEAD^
执行结果如下:
HEAD is now at 9108316 this is version_2
版本三将回退到版本二。此处可能出现一个错误,也是本博主踩的坑之一。如果在windows OS下输入上面的命令,系统会提示你“more?”,表示你是否要再进行输入。你邦邦邦乱敲了几下,然后就报错了。之所以出现这种原因,是因为“^” 在window系统下表示换行的意思。解决办法很简单,给HEAD^加上双引号就行了,或者改写为HEAD~1。
查看demo仓库下version.txt文档内容,发现文档内容已经更改为this is version_2;
现在我们再用git log命令来查看当前head指针位置,输出结果如下:
91083169d146ed86e6cfc87f16a600943f09be45 (HEAD -> master) this is version_2
5629f26a43b626992955707e849311322585807a this is version_1
a0e221b13b81c08f7a51cfe06ce0cf6e08b410d7 add hello world in readme.md
bb014661e21b3f02862f946a74b19a61545f305b (origin/master, origin/HEAD) print hello world
61369531f8b38b12c541b28f2a47e388beefbbb6 Initial commit
此时,你愕然的看着你的电脑屏幕,我的版本三怎么不见了?并非不见了,而是被系统隐藏了。
你可以执行git reflog命令来查看命令历史,在命令行窗口输入如下命令:
git reflog
其执行结果如下:
9108316 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
919351c HEAD@{1}: commit: this is version_3
9108316 (HEAD -> master) HEAD@{2}: commit: this is version_2
5629f26 HEAD@{3}: commit: this is version_1
a0e221b HEAD@{4}: commit: add hello world in readme.md
bb01466 (origin/master, origin/HEAD) HEAD@{5}: clone: from https://github.com/llyFromChina/demo.git
每条数据前面的那段数据表示版本ID,也就是sha-1算法生成的版本号。你可以利用git reset --hard [版本号]命令,将仓库重置到version_3版本下。
本章可谓是重点中的重点,核心中的核心,好好学习本章,已经能够应付很多工作了。不过值得说的是,剩下的内容如果也掌握了,那么你就可以自豪的说,俺是一个git高手了。
欲知后事如何,且听下回分解。
有钱的赏个钱场,没钱的赏个人场。良某人谢过了。