Git工作区与暂存区

学习笔记,质量不高,纯属加深个人理解,请勿浪费时间阅读。

原文链接:廖雪峰GIT教程

工作区

Git和其他版本控制SVN的一个不同之处就是有暂存区(stage)的概念.

工作区(Working Directory)

就是你在电脑里能看到的目录,比如learngit文件夹就是一个工作区
工作区

版本库(Repository)

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库
Git的版本库里存了很多东西,其中最重要的称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD
版本库

  • 第一步用git add把文件添加进去,实际上就是把文件从工作区添加到stage(暂存区)中
  • 第二步用git commit提交更改,实际就是把暂存区的所有内容添加到当前分支中

因为我们创建Git版本库时,Git自动为我们创建了唯一一个的Master分支,所以,现在git commit就是把stage
区的内容往Master分支上提交更改
可以简单理解为,需要提交的文件修改通通放到暂存区,然后一次性提交暂存区的所有修改

现在依次添加修改readme.txt和新增一个LICENSE.txt,随意修改内容并通过git add`添加到暂存区中
添加

现在暂存区变成如下情况

暂存区

所以git add实际就是把工作区要提交的文件提交到stage暂存区中,然后执行git commit便可一次提交到分支上

一旦commit后,如果你又没有对工作区有任何修改,那么工作区就是“干净”的

提交到分支后

小结

暂存区是Git非常重要的概念,弄明白了暂存区,就间接明白了Git很多操作到底干了什么


撤销修改相关

git checkout –file 的使用

若如不小心把文件修改了仍未提交到暂存区,这时可先使用git status查看当前状态
暂存区

然后通过git checkout --file 撤销工作区的保存
撤销

命令git checkout -- readme.txt就是把文件在工作区中的修改全部撤销,这里有两种情况

  1. 一种是readme.txt自修改后还没备放到暂存区(即工作区内unstage),现在可撤销修改回到版本库一模一样的状态。
  2. 一种是readme.txt已添加到暂存区(stage)中,又作了修改。现在撤销修改就可以回到添加到暂存区后的状态

总而言之,这是一个让这个文件回到最近一次git commitgit add时的状态

git reset HEAD file 的使用

命令git reset 既可退回版本,也可以把暂存区的修改回退到工作区,当我们使用HEAD时,表示最新版本

这里写图片描述

此时再使用

$ git reset HEAD <file>

可将stage区的文件回退到工作区

这里写图片描述

小结

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,使用命令git checkout --file。或者使用git checkout .删除所有未提交到stage中的文件
场景2:当你改乱了工作区某个文件并且已经添加到stage(暂存)区时,可使用命令git reset HEAD <file>让文件回退到unstage(工作区)中
场景3:已经提交了不合适的修改到版本库时,此时只能使用版本回退,不过前提是没有push到远程仓


删除文件

Git中,删除也是一个修改操作。假设先添加一个新文件test.txt到git中并提交。

$ git add test.txt

$ git commit -m"desc"

$ git status 

此时查看Git status显示clean

删除

此时使用rm test.txt
status显示状态

可观察到status中显示了被删除的文件(注意:如果是在工作区未添加到暂存或分支的文件,即使删除了也不会显示)

接下来再次使用 git checkout --file,文件又回来了

小结

  1. git checkout 其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”.
  2. rm file 用于删除一个文件,如果一个文件已经被提交到版本库,那么你永远不用担心误删。但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容.
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页