Git入门教程,详解Git文件的四大状态

你们好,欢迎来到周一git专题。git

git clone

在上一篇文章当中咱们聊了怎么在github当中建立一个属于本身的项目(repository),简称repo。除了创建本身的repo以外,咱们更多的状况是拷贝别人的repo,这样才能够得到别人整理好的代码资料什么的,也更符合开源(白嫖)精神嘛。程序员

这也不是什么难题,相信不少人都知道,当咱们想要获取其余人的repo的时候,能够经过git clone命令进行拉取。好比你想要获取咱们这个教程的repo,能够经过下面这个命令。github

git clone git@github.com:moutsea/git-tutorial.git

这个命令咱们都知道,经过git clone再加上repo的地址就能够了。可是这里的地址是哪里来的呢?简单介绍一下,这是在github当中找到的。咱们点击Code那个绿色按钮,在下方的弹框里点击一下,就能够复制下来。通常状况下咱们默认使用SSH协议,若是你看过咱们上篇文章的话,你必定知道我在说什么。固然你也能够用HTTPS。web

还有一个问题是咱们clone下来的这个repo它存在哪里呢?答案也很简单,就是咱们在哪里运行的命令它就存在哪里。windows

另外再说一个小技巧,咱们这样clone下来以后会在咱们本地新建一个文件夹,而后把这个repo当中的内容存在里面。这个文件夹的名字默认是这个repo的名字,若是你不喜欢这个名字,也能够在命令当中进行设置,设置的方法也很简单,就是在命令最后加上一个你想要起的名字。网络

好比这样,你获得的文件夹就是TechFlow。编辑器

git clone git@github.com:moutsea/git-tutorial.git techflow

git 四大状态

即便是git新手应该也都知道git三板斧,也就是常说的git add,git commit和git push。可是当咱们使用这些命令的时候,有没有想过咱们为何要用这些命令呢?它们究竟表明了什么含义,这么作的意义是什么,若是咱们不这么干又会发生什么?工具

若是我只是简单地告诉你git add就是添加,git commit就是提交,那么其实一点用也没有,和没说同样。由于关于git底层的运行机制一点也没提,咱们也不知道为何要添加,要提交,提交了添加了意味着什么。因此要解释清楚git这三板斧的原理,须要咱们作一些更细致地解释,至少须要把git内部的四个状态讲清楚。flex

在咱们进行这一段以前,首先和你们明确一个概念,就是git系统和咱们计算机当中的文件系统实际上是两码事。虽然git有不少神奇的操做,能够自由地回滚或者是建立文件,但它们依然是两套系统。git并不会自发地感知文件系统当中文件的变动,除非咱们执行相关的命令。能够理解为它是被动响应的,毕竟git只是咱们安装的一个软件,并非操做系统的一部分。ui

这一点看似是废话,可是是很重要的基础,若是没搞明白,后面会产生不少疑惑。

咱们继续来讲git内部的状态,这四个状态分别是untrack,modified,committed和staged。之因此用英文,是为了你们之后阅读其余文档不会产生歧义。由于你们翻译的译名可能有多个版本,这会致使歧义。下面来简单介绍一下这几个状态分别意味着什么。

untrack

首先是untrack,untrack咱们直译就能够了。track有轨道以及记录的意思,因此untrack就是还没记录。那么什么样的东西是还没记录的呢?好比能够想到新生儿,刚出生的新生儿名字都没有,固然也没有记录在案,因此须要登记一下人口。那么在登记以前,就能够认为这些新生儿是untrack的。

迁移到开发当中来,咱们新建立的文件其实就是系统里的“新生儿”。在咱们将它们记录在案以前,它们的状态就是untrack。因此当你在一个git项目当中新建了文件的时候,若是你用git status命令去查看git当中的状态,就会看到系统会提示你有些文件状态是untrack。

这里的展现是乱码,是由于我用的中文。这一串乱码就是“第三篇”的意思。咱们能够注意到,在输出的结果最后一行,系统提示咱们能够用git add命令来track它。这个也是git很人性化的一点,不少时候它会提醒咱们可使用什么命令作成什么样的事情。因此你们千万不要忽视这些日志,里面的信息是很重要的。

modified

下一个说的状态是modified,modified顾名思义就是修改过的意思。针对的就是已经登记在案的文件最近又发生了改动的状况,也就是说咱们最近改过了某一个以前已经登记在案的文件,那么当咱们查看状态的时候获得的就是modified,表示改动了,以前的记录已经不是最新的了,咱们须要更新。

一样,咱们能够经过git status命名来查看modified的状况。

咱们看最下方的红字,它说的是“第三篇”这个文件咱们已经有了新的改动,可使用git add命令来将它更新,或者是使用git restore命令来取消这个文件的登记信息,也就是让他回到“新生儿”的状态。

staged

接下来介绍的状态是staged,它没有很好的翻译,能够大概理解成暂存。也就是说咱们把全部的改动都记录下来了,如今git系统当中记录的已是这个文件最新的状态了。

当咱们建立了新的文件,或者是有了新的改动,执行git add以后,获得的状态就是staged。这个时候当咱们执行git status,就会看到咱们当下建立和更新了哪些文件。注意在全部的改动都暂存的状况下,git status是不会出现红色的提示的,只会有绿色的提示信息。

固然这里的文字之因此有颜色是由于我使用了zsh这个终端,若是不配置是没有的,就只能看到白色的的文字。zsh这个终端只在Linux和MacOS当中有,windows没有。而win的终端和系统一直被程序员们吐槽难用,建议有条件的同窗能够研究一下Linux,装个虚拟机也好。

当咱们终端没有颜色高亮的时候,就只能经过上面的文原本判断了,若是出现了Untracked files或者是Changes to be committed这些提示语的话,说明你还有改动没有同步到git当中来,能够经过git add命令完成。

committed

最后讲的一个状态就是committed,这个committed表示的已提交。前面说了staged只是暂存,尚未真正提交进git系统当中。只有经过命令git commit以后,才算是真正把暂存区的代码提交了。通过git commit命令以后,全部被提交的文件的状态就是committed。

这个时候若是咱们执行git status再来查看,会看到提示nothing to commit, working tree clean.

这就表示咱们全部的改动都已经提交进本地的git仓库当中了,之后及时咱们不当心删错了代码,或者是作了一些修改。只要本地的git仓库还在,这些代码就都还能够找得回来。一直到这里为止,咱们全部的操做都是离线的,都不须要网络参与。这也是咱们前文说的git的一个优势之一。

git commit以后,咱们就能够经过git push来把本地的改动同步到远程了。固然这一步是确定须要网络的,而且也可能会遇到不少问题,其中也有不少细节,咱们以后再详细展开。

咱们用一张图来总结一下上面提到四种状态,以及git的整个工做流来加深一下印象。

总结

看完了上面关于git状态的介绍以后,想必你们就能够明白,咱们在使用git的时候,最经常使用的三板斧也就是git add,git commit以及git push的命令到底是干吗的了。

git add能够把全部的改动,不管是修改的仍是新建的都存入暂存区。git commit能够将暂存区的改动提交到本地git仓库,最后git push能够把本地仓库的改动同步到远端。看起来好像平平无奇对吧,但咱们仔细琢磨会发现一个很奇怪的点,那就是既然咱们git add和git commit都是提交,只不过是提交的目的地不一样,一个是暂存区一个是本地仓库。那么为何咱们不能直接将它们合并呢?咱们git add就是直接提交到本地仓库不行吗?

实际上SVN这个版本控制工具就是这么作的,可是这有一个问题就是当咱们提交的时候,它会让咱们选择咱们要提交的文件。若是改动量小还好,若是改动量很大,咱们要手动去一个一个输入须要提交的文件显然是一个很是麻烦的事情。而有了暂存区以后,咱们就能够在开发的时候,一边开发一个边把文件提交到暂存区,最后直接一块儿commit到仓库就能够了。就能够避免最后提交以前的麻烦了,由于反正提交这个操做必定是原子的,要么所有成功,要么所有失败,是不容许部分红功这种状况发生的。

并且不少极客更加喜欢在终端环境当中操做代码,而不是在一个弹出来的界面里点点点,这会让他们以为很是不极客(逼格过低)。有了暂存区以后就能够很方便地作到这一点。

到这里,咱们的文章就结束了,感谢您的阅读。相信看完以后,对于git当中的状态以及它们的做用应该有了一个基础的了解,而且应该还学到了一个装逼技能,就是问你的小伙伴,你知道为何git里有一个暂存区而SVN里没有吗?由于不极客。

衷心祝愿你们天天都有所收获。若是还喜欢今天的内容的话,请来一个三连支持吧~(点赞、在看、转发

原文连接,求个关注

本文使用 mdnice 排版

- END -