[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