[Git使用手册]-3-版本比较与撤消
引言
在上一篇文章中已经介绍了如何将文件从"Working Directory"区域提交到"Repository"区域,但真实环境中通常会对一段代码进行反复的修改,如果修改之后出现bug,就需要用前一个稳定版覆盖当前版本,本文介绍如何查看"Git模型图"三个区域不同版本之间的区别,实例演示不同版本之间的"回滚"操作。
文章目录
0×1.git版本撤消
git版本撤销功能实例:
1)取出"Staying Area"中的版本覆盖"Working Directory"中的版本;
#接着上一篇文章的实例,myblog目录已经被初始化为git目录,并且在这个目录中存在一个文件"readme.md",文件还没有被add
987@hk987.xyz:~/myblog$ git status -s
?? readme.md
#首先向"readme.md"文件中写入一行文本"www.hk987.xyz"
987@hk987.xyz:~/myblog$ echo www.hk987.xyz > readme.md
#查看文件内容
987@hk987.xyz:~/myblog$ more readme.md
www.hk987.xyz
#将文件add到"Staying Area"
987@hk987.xyz:~/myblog$ git add readme.md
#对文件做出修改,追加文本"hk987.xyz"
987@hk987.xyz:~/myblog$ echo hk987.xyz >> readme.md
#修改后的文件内容如下
987@hk987.xyz:~/myblog$ more readme.md
www.hk987.xyz
hk987.xyz
#此时"readme.md"文件的git标记为"AM",也就意味着,文件在"Staying Area"区域保留了一个版本,是刚才add上去的,现在文件追加了一行,所以"Staying Area"区域中的版本与最新修改的版本不一致,上一篇文章已经分析过这些标记的含义,这里不再赘述
987@hk987.xyz:~/myblog$ git status -s
AM readme.md
#现在我不想要做出这个修改,想"回滚"到保存在"Staying Area"区域中的那个版本
987@hk987.xyz:~/myblog$ git checkout -- readme.md
#再次查看文件内容,我们添加的那一行"hk987.xyz"不见了
987@hk987.xyz:~/myblog$ more readme.md
www.hk987.xyz
#查看文件git状态,低位"M"标记也不见了
987@hk987.xyz:~/myblog$ git status -s
A readme.md
2)取出"Repository"中最新的历史版本覆盖"Staying Area"中的版本;
#接着上面的实验,现在"readme.md"文件只有一行文本,并且已经被add到了"Staying Area"中
987@hk987.xyz:~/myblog$ more readme.md
www.hk987.xyz
987@hk987.xyz:~/myblog$ git status -s
A readme.md
#将文件提交到"Repository",此时git模型中三个区域这个文件的版本应该是一致的
987@hk987.xyz:~/myblog$ git commit -m 'readme.md update'
#修改文件内容,追加一行(低位M)
987@hk987.xyz:~/myblog$ echo hk987.xyz >> readme.md
987@hk987.xyz:~/myblog$ git status -s
M readme.md
#将追加后的版本add到"Staying Area"(高位M)
987@hk987.xyz:~/myblog$ git add readme.md
987@hk987.xyz:~/myblog$ git status -s
M readme.md
#现在"Working Directory"与"Staying Area"中的文件版本保持一致,文件内容如下
987@hk987.xyz:~/myblog$ more readme.md
www.hk987.xyz
hk987.xyz
#如果此时将文件从"Staying Area"取出,覆盖到"Working Directory",内容不会有变化
987@hk987.xyz:~/myblog$ git checkout -- readme.md
987@hk987.xyz:~/myblog$ more readme.md
www.hk987.xyz
hk987.xyz
#但是"Repository"中还是上次提交的那个版本,其内容只有一行文本,现在将其取出覆盖到"Staying Area"
987@hk987.xyz:~/myblog$ git reset readme.md
重置后撤出暂存区的变更:
M readme.md
#此时,"Working Directory"中仍然是两行数据
987@hk987.xyz:~/myblog$ more readme.md
www.hk987.xyz
hk987.xyz
#再将"Staying Area"中的版本取出,覆盖到"Working Directory"中
987@hk987.xyz:~/myblog$ git checkout -- readme.md
#文件被还原了
987@hk987.xyz:~/myblog$ more readme.md
www.hk987.xyz
3)取出"Repository"中最新的历史版本直接覆盖到"Working Directory";
#接着上面的实验,首先向"readme.md",追加一行
987@hk987.xyz:~/myblog$ echo hk987.xyz >> readme.md
987@hk987.xyz:~/myblog$ more readme.md
www.hk987.xyz
hk987.xyz
#将修改add到"Staying Area"
987@hk987.xyz:~/myblog$ git add readme.md
#之后再向文件中追加一行
987@hk987.xyz:~/myblog$ echo hk987 >> readme.md
#现在"Working Directory"中文件的内容如下
987@hk987.xyz:~/myblog$ more readme.md
www.hk987.xyz
hk987.xyz
hk987
#大家可以想象到,"Staying Area"中这个文件应该是两行数据,而"Repository"中还是上次提交的那个版本,所以只有一行数据
#使用下面这条命令,取出"Repository"中最新的历史版本覆盖到"Staying Area"以及"Working Directory"
987@hk987.xyz:~/myblog$ git checkout HEAD readme.md
#文件内容恢复到了一行数据
987@hk987.xyz:~/myblog$ more readme.md
www.hk987.xyz
#为了验证"Staying Area"中的文件也被覆盖了,使用下面的命令,从"Staying Area"覆盖到"Working Directory"
987@hk987.xyz:~/myblog$ git checkout -- readme.md
#文件内容并没有变成两行,这说明"git checkout HEAD readme.md"这条命令可以一次性覆盖下面两个区域中的文件版本
987@hk987.xyz:~/myblog$ more readme.md
www.hk987.xyz
0×2.git版本比较
三个版本比较命令能够分别比较"Git模型图"中三个不同区域,同一个文件,不同版本之间,内容的不同之处,接着上面的实验:
#"readme.md"文件已经被提交,现在"Git模型图"中三个区域这个文件的版本和内容都一致,只有一行数据,内容如下
987@hk987.xyz:~/myblog$ more readme.md
www.hk987.xyz
#现在给文件追加一行数据
987@hk987.xyz:~/myblog$ echo hk987.xyz >> readme.md
987@hk987.xyz:~/myblog$ more readme.md
www.hk987.xyz
hk987.xyz
#将追加后的版本add到"Staying Area"
987@hk987.xyz:~/myblog$ git add readme.md
#再给文件追加一行数据
987@hk987.xyz:~/myblog$ echo hk987 >> readme.md
987@hk987.xyz:~/myblog$ more readme.md
www.hk987.xyz
hk987.xyz
hk987
#现在"Git模型图"中三个区域中"readme.md"文件的内容各不相同
#"Repository"中的版本只有一行数据
#www.hk987.xyz
#"Staying Area"中的版本有两行数据
#www.hk987.xyz
#hk987.xyz
#"Working Directory"中的版本有三行数据
#www.hk987.xyz
#hk987.xyz
#hk987
1)比较"Staying Area"与"Working Directory"的不同;
#语法:git diff 文件名
#从输出中可以看到,"Working Directory"中的版本比"Staying Area"中的版本多一行数据,即"hk987",git会将多出的数据前面添加"加号"显示,而实际环境中,不仅仅会多出数据,还会存在删除数据的情况,删除的数据前会添加"减号"表示
987@hk987.xyz:~/myblog$ git diff readme.md
diff --git a/readme.md b/readme.md
index b964a0b..3fe17a7 100644
--- a/readme.md
+++ b/readme.md
@@ -1,2 +1,3 @@
www.hk987.xyz
hk987.xyz
+hk987
2)比较"Repository"中最新的历史版本与"Staying Area"的不同;
#语法:git diff --staged 文件名
#同样多出一行数据,这和前面我们的分析一致
987@hk987.xyz:~/myblog$ git diff --staged readme.md
diff --git a/readme.md b/readme.md
index a4f24f8..b964a0b 100644
--- a/readme.md
+++ b/readme.md
@@ -1 +1,2 @@
www.hk987.xyz
+hk987.xyz
3)比较"Repository"中最新的历史版本与"Working Directory"的不同;
#语法:git diff HEAD 文件名
#不出所料,多了两行数据
987@hk987.xyz:~/myblog$ git diff HEAD readme.md
diff --git a/readme.md b/readme.md
index a4f24f8..3fe17a7 100644
--- a/readme.md
+++ b/readme.md
@@ -1 +1,3 @@
www.hk987.xyz
+hk987.xyz
+hk987