在Git使用——文件修改与状态查看一文中介绍了修改文件的方法。
目录
一.再次修改文件
再次修改readme.txt文件,然后提交
# 修改文件内容如下
Git is free.
Git is a distributed version control system.
Git is free software distributed under the GPL.
# 提交文件
$ git add readme.txt
$ git commit -m "append GPL"
# 提交结果
[master 2ee22b0] append GPL
1 file changed, 2 insertions(+), 1 deletion(-)
不断对文件进行修改,然后不断提交到版本库里。每commit一次就会有一份存档,如果你不小心删除或改动了文件中的重要内容,你可以选择从最近一个存档恢复。
人的精力是有限的,不可能把每次修改的内容都记住,而在Git中使用命令可以帮助我们查询历史记录。
# 显示从最近到最远的提交日志
$ git log
# 结果
Author: username <email>
Date: time
append GPL
commit 36a95ace80a876fdfbd8c1e6690561ec4605a6d3
Author: username <email>
Date: time
add distributed
commit e3c89a6b8f3aca4597ce0acfafeb6c12bc9b016a
Author: username <email>
Date: time
first readme
# 精简输出
$ git log --pretty=oneline
# 结果
2ee22b00578fae391bdd0860dbfadbcbdd529be8 (HEAD -> master) append GPL
36a95ace80a876fdfbd8c1e6690561ec4605a6d3 add distributed
e3c89a6b8f3aca4597ce0acfafeb6c12bc9b016a first readme
# 结果分析
结果中一长串字符是commit id(版本号),是一个SHA1计算出来的一个非常大的数字,用十六进制表示。
为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,为了避免多人在同一个版本库里工作产生的冲突。
每提交一个新版本,Git就会把它们自动串成一条时间线。如果使用可视化工具查看Git历史,就可以更清楚地看到提交历史的时间线
二.Git时光机
现在想把文件回退到add distributed版本,应该如何操作?
首先明确当前是哪个版本,在Git中用HEAD表示当前版本,上一个版本就是HEAD^,上上个版本就是HEAD^^。如果版本太多怎么办?比如回退到前50个版本应该写成HEAD~50。
# 将当前版本append GPL回退到add distributed版本
$ git reset --hard HEAD^
# 结果
HEAD is now at 36a95ac add distributed
查看readme.txt
# 查看readme.txt文件内容
$ cat readme.txt
# readme.txt文件内容
Git is free.
Git is a distributed version control system.
这时再次查看版本库状态
# 查看日志
$ git log
# 结果
Author: username <email>
Date: time
add distributed
commit e3c89a6b8f3aca4597ce0acfafeb6c12bc9b016a
Author: username <email>
Date: time
first readme
append GPL版本已经不见了。有办法恢复吗?只要知道commit id就可以!
# 版本恢复
# 版本号没必要写全,前几位即可。Git会自动寻找。也不能只写前一两位,Git可能会找到多个版本号,无法确定是哪一个。
$ git reset --hard 2ee2
# 恢复结果
HEAD is now at 2ee22b0 append GPL
# 再次查看文件内容
$ cat readme.txt
# 文件内容
Git is free.
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git回退版本速度很快,原理是其内部有个指向HEAD的指针。当进行版本回退时,Git仅仅把指向HEAD从指向append GPL改为指向add distributed,然后更新工作区的文件。
现在假设这样一个场景:你完成了工作并关闭了电脑。但是第二天你又想恢复到最新的版本,你已经忘记了commit id,现在怎么办?
Git考虑到了这种情况
# 查看命令历史
$ git reflog
# 结果
2ee22b0 (HEAD -> master) HEAD@{0}: reset: moving to 2ee2
36a95ac HEAD@{1}: reset: moving to HEAD^
2ee22b0 (HEAD -> master) HEAD@{2}: commit: append GPL
36a95ac HEAD@{3}: commit: add distributed
e3c89a6 HEAD@{4}: commit (initial): first readme
好了,现在你知道了版本号,问题被完美解决了。