本篇博客讲解的git命令
$ git log //查看每次提交日志
$ git reset --hard HEAD^ //回退到上一个版本
$ git reflog //查看以前的所有历史记录
$ git cheakout -- filename //撤销修改工作区里的变化
$ git rm filename //确定工作区的删除操作
$ git reset HEAD filename //撤销缓存区的变化
在讲解命令之前先介绍一下版本库的区域划分
左边的工作区就是我们进行操作的地方,就是.git文件夹所在的目录,工作区里有一个隐藏的文件夹.git就是我们的版本库,里面有很多的内容,以后有时间可以具体分析一下,里面最重要的一个区域就是stage(或者叫index)缓存区。
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用
git add
把文件添加进去,实际上就是把文件修改添加到暂存区;第二步是用
git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
同时我们需要理解master指针指向master分支的最新版本节点,HEAD指针指向mater表示当前分支mater的版本最新节点,后面我们会讲到切换分支时HEAD指针会移动。
$ git log
commit d3dd4b32a146c0046e4a718151ab9525b896b92c (HEAD -> master)
Author: ChuanMac <845825101@qq.com>
Date: Sat Jun 24 20:02:40 2017 +0800
第二次提交
commit 32cc9a766fcc4665644a2b883a4e302ace2fe50b
Author: ChuanMac <845825101@qq.com>
Date: Sat Jun 24 20:01:51 2017 +0800
第一次提交
我们之前进行过两次提交,第一次内容为111111,第二次加上了22222,git log
为我们显示了两次的提交信息,d3dd4b32a146c0046e4a718151ab9525b896b92c
这就是我们提交的版本号,我们可以通过它进行回滚,同时我们还可以通过这个命令看到提交日期作者邮箱以及提交信息,也就是我们git commit
-m后面跟着的信息。
$ head aaa.txt
test git
1111111
2222222
$ git reset --hard HEAD^
HEAD is now at 32cc9a7 第一次提交
$ head aaa.txt
test git
1111111
head aaa.txt
查看aaa.txt文件的前几行,当前有三行记录,我们使用命令git reset --hard HEAD^
表示回退到HEAD当前版本的前一个版本,一个表示回退一个版本,HEAD^表示上上个版本,HEAD~100表示上100个版本,执行了reset命令之后我们再查看aaa.txt发现果然回退到了上一个版本,内容少了一行。
mac-pro:testgit cherish$ git log
commit 32cc9a766fcc4665644a2b883a4e302ace2fe50b (HEAD -> master)
Author: ChuanMac <845825101@qq.com>
Date: Sat Jun 24 20:01:51 2017 +0800
第一次提交
$ git reflog
32cc9a7 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
d3dd4b3 HEAD@{1}: reset: moving to d3dd4b3
32cc9a7 (HEAD -> master) HEAD@{2}: reset: moving to HEAD^
d3dd4b3 HEAD@{3}: reset: moving to d3dd4b3
32cc9a7 (HEAD -> master) HEAD@{4}: reset: moving to HEAD^
d3dd4b3 HEAD@{5}: reset: moving to d3dd4b32a146c004
32cc9a7 (HEAD -> master) HEAD@{6}: reset: moving to HEAD^
d3dd4b3 HEAD@{7}: reset: moving to d3dd4b3
32cc9a7 (HEAD -> master) HEAD@{8}: reset: moving to 32cc9a7
32cc9a7 (HEAD -> master) HEAD@{9}: reset: moving to HEAD^
d3dd4b3 HEAD@{10}: commit: 第二次提交
32cc9a7 (HEAD -> master) HEAD@{11}: commit (initial): 第一次提交
$ git reset --hard d3dd4b3
HEAD is now at d3dd4b3 第二次提交
$ head aaa.txt
test git
1111111
2222222
- 这个时候再执行
git log
发现当前提交版本只有一条信息了,因为我们在执行reset的时候,mater带着head指针由当前最新版本节点指向了上一个版本节点,在遍历版本节点时,就不会再遍历之前的最新版本节点了。 - 这个时候我们如果回滚错了,怎么再变回去了,我们需要通过提交版本号,把master指针移动到那个版本的节点处,通过
git reflog
可以查看之前的每一次版本指针移动记录,我们找到我们需要的版本节点对应的号码,用git reset --hard number
来知道特定版本 - 这个时候我们再查看aaa.txt时就发现确实又变回来了
操作:
我们对工作区文件操作错了,导致和缓存区不一致时,我们可以采用
git checkout -- filename
放弃对工作区域的操作
$ ls -a
. .. .DS_Store .git aaa.txt
$ rm aaa.txt
$ ls -a
. .. .DS_Store .git
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: aaa.txt
no changes added to commit (use "git add" and/or "git commit -a")
$ git checkout -- aaa.txt
$ ls -a
. .. .DS_Store .git aaa.txt
- 首先我们ls查看到目录下有aaa.txt,
rm aaa.txt
删除了文件后查看目录下没了 - 我们
git status
之后有两个操作,一个是确实要删除,我们需要先git rm aaa.txt
然后再git commit
,还有就是我们删错了,需要还原就用git checkout -- filename
执行这个命令后,我们发现文件又出来了。
最后还有一个命令就是清空缓存区
git reset HEAD filename
,比如我们git add
后发现我们添加到缓存区的东西不妥,这个时候就可以使用这个命令将缓存区给清空