Git学习笔记四 Git版本控制原理

git 工作原理图

image

如上图所示,有三个区域Working Directory、stage、master。
名词解释:

工作区(Working Directory)

在我们直接编辑文件(文件夹)的根目录,如下图:

image

在G盘Git目录下就是工作区

版本库(Repository)

版本库才是git正式工作的地方,在工作区下隐藏目录里,如下图:

image

版本库主要包括两个区,如上图,包括“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文件,添加新内容,如下:

image

执行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)

再在上面的基础上添加新内容,如下图:

image

并提交:

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代替。

image

如上图,我们执行了git reset –hard HEAD^后,是不是返回到前面那个版本了“78db795dabdeb752d635ed2960b87ec49bb13943 add hello world to test.txt

再去查看一下我们的test.txt文件是不是也回到前面那个版本,如下图:

image

惨了,我们前面那个版本了(add hello CSDN…),怎么办?
不慌不慌,我们还可以通过前面的版本ID号返回去呢。版本号辣么长,我要晕了…放心,git不会这么麻烦的,你只需要输入其中连续的几个版本号字符就可以了(一般6位),这样git就能辨别了。
如下图:

image

又回来了,开不开心?O(∩_∩)O哈哈~!当然你也可以通过版本号返回到其他的版本。

image

在master去,有个HEAD指针,该指针指向当前的版本,返回到第n个版本就是通过修改HEAD指针的值实现,如上图。

小结

  • git版本库主要的三个工作区域工作区、stage、master。
  • git status查询当前状态
  • 通过git reset –hard HEAD^返回以前版本的信息
  • 通过git reset –hard 版本号返回版本号对应的版本
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容