git 工作原理图
如上图所示,有三个区域Working Directory、stage、master。
名词解释:
工作区(Working Directory)
在我们直接编辑文件(文件夹)的根目录,如下图:
在G盘Git目录下就是工作区
版本库(Repository)
版本库才是git正式工作的地方,在工作区下隐藏目录里,如下图:
版本库主要包括两个区,如上图,包括“stage”和“master”。
- master
master区管理了我们每次提交后的文件版本以及相关信息,是git最重要的仓库。在master区,有一个head指针(见图1),指向最新提交的版本。 - stage
stage是工作区到master区的缓存区,在做小的修改时我们可以先提交到stage,确定没有问题了,或者当天的工作完成了,再把缓存区的内容最终提交到master。
工作原理
上篇文章里讲了命令行:git add、git commit
其中执行git add的时候,是把在“Working Directory”去修改(增加或删除)的内容提交到“stage”
执行git commit之类的时候,把“stage”的内容最终提交到“master”区。
git status
命令行git status 能够帮助我们快速的了解git的当前状态。
例如,我们现在工作区新增一个test3.txt文件(先不要添加到版本库),然后执行git status。
chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
test3.txt
nothing added to commit but untracked files present (use "git add" to track)
从上面的代码我们可以看出,有在工作区新文件(test3.txt)待提交,但从stage区到master区没有新内容提交。
所以根据上篇文章的知识,先用git add把test3.txt提交到stage。执行指令git add后,再使用git status查当前git状态,如下代码:
chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git add test3.txt
chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: test3.txt
chenxi@chenxi_pc MINGW64 /G/Git (master)
从上面的的结果知道已经成功添加到status,准备好等待我们提交到master,执行git commit可以完成提交任务,如下图:
chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git commit -m "add test3.txt file"
[master 39e0dba] add test3.txt file
1 file changed, 1 insertion(+)
create mode 100644 test3.txt
chenxi@chenxi_pc MINGW64 /G/Git (master)
chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git status
On branch master
nothing to commit, working directory clean
chenxi@chenxi_pc MINGW64 /G/Git (master)
版本回退
通过前面我们已经掌握了提交新版本,如果发现我修改错了东西,怎样返回新版本呢?
我们修改test.txt文件,添加新内容,如下:
执行git add、git commit指令,如以下代码:
chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: test.txt
no changes added to commit (use "git add" and/or "git commit -a")
chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git add test.txt
chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git commit -m "add hello world to test.txt"
[master 78db795] add hello world to test.txt
1 file changed, 6 insertions(+), 1 deletion(-)
chenxi@chenxi_pc MINGW64 /G/Git (master)
再在上面的基础上添加新内容,如下图:
并提交:
chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git add test.txt
chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git commit -m "add hello CSDN to test.txt"
[master 8f4ae6d] add hello CSDN to test.txt
1 file changed, 2 insertions(+)
chenxi@chenxi_pc MINGW64 /G/Git (master)
好,现在我们使用log指令查一下我们都执行了哪些操作:
chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git log
commit 8f4ae6dc10a67a0a5726f449c6c65e288d39f57f
Author: chenximcm <1178898205@qq.com>
Date: Fri Jan 13 20:23:18 2017 +0800
add hello CSDN to test.txt
commit 78db795dabdeb752d635ed2960b87ec49bb13943
Author: chenximcm <1178898205@qq.com>
Date: Fri Jan 13 20:15:46 2017 +0800
add hello world to test.txt
commit 39e0dba93090a1f01887180e7bedbb7dda1fe5b3
Author: chenximcm <1178898205@qq.com>
Date: Fri Jan 13 19:36:40 2017 +0800
add test3.txt file
commit 63d890ed08ee938dc4e83ad14446727dc9d55da3
Author: chenximcm <1178898205@qq.com>
Date: Fri Dec 30 17:43:55 2016 +0800
add test1.txt and test2.txt files
commit 489b113d392d1bc930f6eef1b6f0135d6bd6e0d3
Author: chenximcm <1178898205@qq.com>
Date: Fri Dec 30 12:13:05 2016 +0800
add panoramaProjects folder
:...skipping...
commit 8f4ae6dc10a67a0a5726f449c6c65e288d39f57f
Author: chenximcm <1178898205@qq.com>
Date: Fri Jan 13 20:23:18 2017 +0800
add hello CSDN to test.txt
commit 78db795dabdeb752d635ed2960b87ec49bb13943
Author: chenximcm <1178898205@qq.com>
Date: Fri Jan 13 20:15:46 2017 +0800
add hello world to test.txt
commit 39e0dba93090a1f01887180e7bedbb7dda1fe5b3
Author: chenximcm <1178898205@qq.com>
Date: Fri Jan 13 19:36:40 2017 +0800
add test3.txt file
commit 63d890ed08ee938dc4e83ad14446727dc9d55da3
Author: chenximcm <1178898205@qq.com>
Date: Fri Dec 30 17:43:55 2016 +0800
add test1.txt and test2.txt files
commit 489b113d392d1bc930f6eef1b6f0135d6bd6e0d3
Author: chenximcm <1178898205@qq.com>
Date: Fri Dec 30 12:13:05 2016 +0800
add panoramaProjects folder
commit 664376a8783c533c90731dd00e4093d8bff9e97b
Author: chenximcm <1178898205@qq.com>
Date: Fri Dec 30 12:10:09 2016 +0800
add test.txt file
~
~
chenxi@chenxi_pc MINGW64 /G/Git (master)
好多啊,是不是觉得输出太多信息了,没事,我们可以把每次的信息只输出精简信息,我们只需要在git log 后面添加参数“–pretty=oneline”即可。
chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git log --pretty=oneline
8f4ae6dc10a67a0a5726f449c6c65e288d39f57f add hello CSDN to test.txt
78db795dabdeb752d635ed2960b87ec49bb13943 add hello world to test.txt
39e0dba93090a1f01887180e7bedbb7dda1fe5b3 add test3.txt file
63d890ed08ee938dc4e83ad14446727dc9d55da3 add test1.txt and test2.txt files
489b113d392d1bc930f6eef1b6f0135d6bd6e0d3 add panoramaProjects folder
664376a8783c533c90731dd00e4093d8bff9e97b add test.txt file
chenxi@chenxi_pc MINGW64 /G/Git (master)
是不是把目前不需要的信息都省掉了?每条信息只给出版本号跟我们添加的日志描述信息。如果你觉得最后一次操作有问题(添加的hello CSDN),想返回到前面的按个版本,怎么办?
只需要执行指令:“git reset –hard HEAD^”
HEAD前面说过有个HEAD指针指向最新提交的版本,HEAD表示当前版本的前面那个版本,HEAD表示前前个版本,如果想返回前面第100个版本,是不是可以写100个“”。
O(∩_∩)O哈哈~,让我想起了以前小时候老师讲的一个故事,一个小学生学习了中文的一、二、三,他就说后面的他都会了,就没去上课,回家他老爸让他写一个万字,他写了一个下午。(小插曲)
当然上面的方法也可以,不过我们都没那么蠢吧。我们可以使用HEAD~100代替。
如上图,我们执行了git reset –hard HEAD^后,是不是返回到前面那个版本了“78db795dabdeb752d635ed2960b87ec49bb13943 add hello world to test.txt
”
再去查看一下我们的test.txt文件是不是也回到前面那个版本,如下图:
惨了,我们前面那个版本了(add hello CSDN…),怎么办?
不慌不慌,我们还可以通过前面的版本ID号返回去呢。版本号辣么长,我要晕了…放心,git不会这么麻烦的,你只需要输入其中连续的几个版本号字符就可以了(一般6位),这样git就能辨别了。
如下图:
又回来了,开不开心?O(∩_∩)O哈哈~!当然你也可以通过版本号返回到其他的版本。
在master去,有个HEAD指针,该指针指向当前的版本,返回到第n个版本就是通过修改HEAD指针的值实现,如上图。
小结
- git版本库主要的三个工作区域工作区、stage、master。
- git status查询当前状态
- 通过git reset –hard HEAD^返回以前版本的信息
- 通过git reset –hard 版本号返回版本号对应的版本