- 查看历史版本
现在,我们的Readme.txt已经有好几个版本了,这时可以用git log
查看详细历史信息,或者用$ git log --pretty=oneline
显示缩略信息:
[zhangxiyu@localhost learngit]$ git log –pretty=oneline
fe3b707ad53aa12408943bbc2b133a47972c5f6c CHG_5_Secreat
5130706cd2266c641ae71125e2dfdaadd4136e63 change_4_Hero
5bc3b1506a1dd66fc3fa542c331c76c0c91ba6d5 Third change
2e7f6aa2b2532f07c75ef971fed7d3ca3dfb7a52 Second change
8815e57046754b4c2799a8b3f5eba000c986e3b0 first add
前面的一大串类似fe3b……726c的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示。
- 版本回退
现在版本信息已经都有了,如果想回到之前的一个版本的状态的话就可以利用git reset
命令回退了。在git中,当前版本的表示方法是HEAD
(注意是大写),也就是最新的提交,上一个版本的表示方法就是HEAD^
,上上一个就是HEAD^^
,以此类推。但如果上一百个版本的话这样的写法就太麻烦了,所以也可以用HEAD~100
来表示,很方便:
$ git reset –hard HEAD^
这里有个--hard
参数,这里先不管,以后会提到,不知道的可以先百度。
此时,我们已经回到原来的版本了,用git log
查看版本信息发现原来最后一次修改的版本信息已经不见了,但这时我们后悔了又想回去该怎么办?同样的利用git reset
命令,不过后面的参数不能是HEAD^了,应该换成你要回去的版本号,比如我们要回到Third change
这个版本就可以这样写:
$ git reset –hard 5bc3b15
HEAD is now at 5bc3b15 Third change
如果找不到版本号可以用git reflog
命令查看历史操作记录,这个命令可以记录每一次对git的操作:
[zhangxiyu@localhost learngit]$ git reflog
fe3b707 HEAD@{0}:fe3b707ad: updating HEAD
5130706 HEAD@{1}: HEAD^: updating HEAD
fe3b707 HEAD@{2}: fe3b707ad: updating HEAD
5130706 HEAD@{3}: HEAD^:updating HEAD
fe3b707 HEAD@{4}: commit: CHG_5_Secreat
5130706 HEAD@{5}: 5130706: updating HEAD
5bc3b15 HEAD@{6}: 5bc3b15: updating HEAD
5130706 HEAD@{8}: HEAD~2: updating HEAD
5130706 HEAD@{9}: commit: change_4_Hero
5bc3b15 HEAD@{11}: commit: Secondchange
8815e57 HEAD@{12}: commit (initial): first add
这样就可以回到任意修改过的版本了。
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向HEAD^,然后顺便把工作区的文件更新了。所以你让HEAD指向哪个版本号,你就把当前版本定位在哪。(这里就不放图了,廖雪峰教程里讲的很详细)。
- 工作区
- 版本库
工作区和版本库是Git里很重要的概念,工作区就是在电脑里能看到的那个目录,比如我们最开始创建的learngit
这个目录就是个工作区,而里面的.git
隐藏文件它就是版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。这张图解释的很清楚!
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
现在,我们再次对Readme.txt
做一次修改,再创建一个LIENCES
文件,此时我们用git status
查看工作区状态:
[zhangxiyu@localhost learngit]$ git status
# On branch master
# Changed but not updated:
# (use “git add …” to update what will be committed)
# (use “git checkout – …” to discard changes in working directory)
#
# modified: readme.txt
#
# Untracked files:
# (use “git add …” to include in what will be committed)
#
# LIENCES no changes added to commit (use “git add” and/or “git commit -a”)
这里提示我们的Readme.txt
“ Changed but not updated”,修改了但是没有提交,而LIENCES
从来没有添加过,是“Untracked ”状态。然后我们使用git add
命令把两个文件从工作区添加到版本库中:
$ git add readme.txt LIENCES
再用git status
查看:
[zhangxiyu@localhost learngit]$ git status
# On branch master
# Changes to be committed:
# (use “git reset HEAD …” to unstage)
#
# new file: LIENCES
# modified: readme.txt
#
现在,暂存区的状态就变成这样了:
所以,git add
命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit
就可以一次性把暂存区的所有修改提交到分支。然后就可以提交了:
[zhangxiyu@localhost learngit]$ git commit -m “LIENCES”
[master2564b30] LIENCES 1 files changed, 1 insertions(+), 1 deletions(-)
create mode 100644 LIENCES
再次查看状态:
[zhangxiyu@localhost learngit]$ git status
# On branch master nothing to commit (working directory clean)
整个世界清净了~工作区是干净的。
现在版本库变成了这样,暂存区就没有任何内容了:
这就是Git做的所有事情,弄明白之后就可以进行下面的内容了。
(本篇所有图片来源于原教程~)