[Git使用手册]-3-版本比较与撤消

引言

在上一篇文章中已经介绍了如何将文件从"Working Directory"区域提交到"Repository"区域,但真实环境中通常会对一段代码进行反复的修改,如果修改之后出现bug,就需要用前一个稳定版覆盖当前版本,本文介绍如何查看"Git模型图"三个区域不同版本之间的区别,实例演示不同版本之间的"回滚"操作。

文章目录

0×1.git版本撤消

git版本撤销功能实例:

1)取出"Staying Area"中的版本覆盖"Working Directory"中的版本;

					#接着上一篇文章的实例,myblog目录已经被初始化为git目录,并且在这个目录中存在一个文件"readme.md",文件还没有被add
					qing@qingsword.com:~/myblog$ git status -s
					?? readme.md

					#首先向"readme.md"文件中写入一行文本"www.qingsword.com"
					qing@qingsword.com:~/myblog$ echo www.qingsword.com > readme.md

					#查看文件内容
					qing@qingsword.com:~/myblog$ more readme.md 
					www.qingsword.com

					#将文件add到"Staying Area"
					qing@qingsword.com:~/myblog$ git add readme.md 

					#对文件做出修改,追加文本"qingsword.com"
					qing@qingsword.com:~/myblog$ echo qingsword.com >> readme.md

					#修改后的文件内容如下
					qing@qingsword.com:~/myblog$ more readme.md 
					www.qingsword.com
					qingsword.com

					#此时"readme.md"文件的git标记为"AM",也就意味着,文件在"Staying Area"区域保留了一个版本,是刚才add上去的,现在文件追加了一行,所以"Staying Area"区域中的版本与最新修改的版本不一致,上一篇文章已经分析过这些标记的含义,这里不再赘述
					qing@qingsword.com:~/myblog$ git status -s
					AM readme.md

					#现在我不想要做出这个修改,想"回滚"到保存在"Staying Area"区域中的那个版本
					qing@qingsword.com:~/myblog$ git checkout -- readme.md

					#再次查看文件内容,我们添加的那一行"qingsword.com"不见了
					qing@qingsword.com:~/myblog$ more readme.md 
					www.qingsword.com

					#查看文件git状态,低位"M"标记也不见了
					qing@qingsword.com:~/myblog$ git status -s
					A  readme.md
					

2)取出"Repository"中最新的历史版本覆盖"Staying Area"中的版本;

					#接着上面的实验,现在"readme.md"文件只有一行文本,并且已经被add到了"Staying Area"中
					qing@qingsword.com:~/myblog$ more readme.md 
					www.qingsword.com

					qing@qingsword.com:~/myblog$ git status -s
					A  readme.md

					#将文件提交到"Repository",此时git模型中三个区域这个文件的版本应该是一致的
					qing@qingsword.com:~/myblog$ git commit -m 'readme.md update'

					#修改文件内容,追加一行(低位M)
					qing@qingsword.com:~/myblog$ echo qingsword.com >> readme.md 
					qing@qingsword.com:~/myblog$ git status -s
					 M readme.md

					#将追加后的版本add到"Staying Area"(高位M)
					qing@qingsword.com:~/myblog$ git add readme.md 
					qing@qingsword.com:~/myblog$ git status -s
					M  readme.md

					#现在"Working Directory"与"Staying Area"中的文件版本保持一致,文件内容如下
					qing@qingsword.com:~/myblog$ more readme.md 
					www.qingsword.com
					qingsword.com

					#如果此时将文件从"Staying Area"取出,覆盖到"Working Directory",内容不会有变化
					qing@qingsword.com:~/myblog$ git checkout -- readme.md
					qing@qingsword.com:~/myblog$ more readme.md 
					www.qingsword.com
					qingsword.com

					#但是"Repository"中还是上次提交的那个版本,其内容只有一行文本,现在将其取出覆盖到"Staying Area"
					qing@qingsword.com:~/myblog$ git reset readme.md
					重置后撤出暂存区的变更:
					M	readme.md

					#此时,"Working Directory"中仍然是两行数据
					qing@qingsword.com:~/myblog$ more readme.md 
					www.qingsword.com
					qingsword.com

					#再将"Staying Area"中的版本取出,覆盖到"Working Directory"中
					qing@qingsword.com:~/myblog$ git checkout -- readme.md

					#文件被还原了
					qing@qingsword.com:~/myblog$ more readme.md 
					www.qingsword.com
					

3)取出"Repository"中最新的历史版本直接覆盖到"Working Directory";

					#接着上面的实验,首先向"readme.md",追加一行
					qing@qingsword.com:~/myblog$ echo qingsword.com >> readme.md

					qing@qingsword.com:~/myblog$ more readme.md 
					www.qingsword.com
					qingsword.com

					#将修改add到"Staying Area"
					qing@qingsword.com:~/myblog$ git add readme.md 

					#之后再向文件中追加一行
					qing@qingsword.com:~/myblog$ echo qingsword >> readme.md

					#现在"Working Directory"中文件的内容如下
					qing@qingsword.com:~/myblog$ more readme.md 
					www.qingsword.com
					qingsword.com
					qingsword

					#大家可以想象到,"Staying Area"中这个文件应该是两行数据,而"Repository"中还是上次提交的那个版本,所以只有一行数据

					#使用下面这条命令,取出"Repository"中最新的历史版本覆盖到"Staying Area"以及"Working Directory"
					qing@qingsword.com:~/myblog$ git checkout HEAD readme.md

					#文件内容恢复到了一行数据
					qing@qingsword.com:~/myblog$ more readme.md 
					www.qingsword.com

					#为了验证"Staying Area"中的文件也被覆盖了,使用下面的命令,从"Staying Area"覆盖到"Working Directory"
					qing@qingsword.com:~/myblog$ git checkout -- readme.md

					#文件内容并没有变成两行,这说明"git checkout HEAD readme.md"这条命令可以一次性覆盖下面两个区域中的文件版本
					qing@qingsword.com:~/myblog$ more readme.md 
					www.qingsword.com
					

0×2.git版本比较

三个版本比较命令能够分别比较"Git模型图"中三个不同区域,同一个文件,不同版本之间,内容的不同之处,接着上面的实验:

					#"readme.md"文件已经被提交,现在"Git模型图"中三个区域这个文件的版本和内容都一致,只有一行数据,内容如下
					qing@qingsword.com:~/myblog$ more readme.md 
					www.qingsword.com

					#现在给文件追加一行数据
					qing@qingsword.com:~/myblog$ echo qingsword.com >> readme.md
					qing@qingsword.com:~/myblog$ more readme.md 
					www.qingsword.com
					qingsword.com

					#将追加后的版本add到"Staying Area"
					qing@qingsword.com:~/myblog$ git add readme.md 

					#再给文件追加一行数据
					qing@qingsword.com:~/myblog$ echo qingsword >> readme.md
					qing@qingsword.com:~/myblog$ more readme.md 
					www.qingsword.com
					qingsword.com
					qingsword

					#现在"Git模型图"中三个区域中"readme.md"文件的内容各不相同

					#"Repository"中的版本只有一行数据
					#www.qingsword.com

					#"Staying Area"中的版本有两行数据
					#www.qingsword.com
					#qingsword.com

					#"Working Directory"中的版本有三行数据
					#www.qingsword.com
					#qingsword.com
					#qingsword
					

1)比较"Staying Area"与"Working Directory"的不同;

					#语法:git diff 文件名
					#从输出中可以看到,"Working Directory"中的版本比"Staying Area"中的版本多一行数据,即"qingsword",git会将多出的数据前面添加"加号"显示,而实际环境中,不仅仅会多出数据,还会存在删除数据的情况,删除的数据前会添加"减号"表示
					qing@qingsword.com:~/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.qingsword.com
					 qingsword.com
					+qingsword
					

2)比较"Repository"中最新的历史版本与"Staying Area"的不同;

					#语法:git diff --staged 文件名
					#同样多出一行数据,这和前面我们的分析一致
					qing@qingsword.com:~/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.qingsword.com
					+qingsword.com
					

3)比较"Repository"中最新的历史版本与"Working Directory"的不同;

					#语法:git diff HEAD 文件名
					#不出所料,多了两行数据
					qing@qingsword.com:~/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.qingsword.com
					+qingsword.com
					+qingsword