[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