Git实用教程 3.1:状态

既然大家都是程序猿,当然要以代码担当。我们可忙了,一个项目百八十个文件,怎么知道哪些文件是新添加的,哪些文件已经加入了暂存区域呢?

总不能让我们自己拿个本本记下来吧?

当然不,作为世界上最伟大的版本控制系统,你能遇到的囧境,Git 早已有了相应的解决方案。

你唯一需要做的,就是……学习…

状态

随时随地,你都可以使用 git status 命令查看当前的状态……

上一讲的代码如果你没有动过,那么输入 git status 命令后应该是下边这样:

Git实用教程 3.1:状态

On branch master 说明我们位于一个叫做“master”的分支里,这是默认的分支(相比其他版本管理程序,Git 的分支理念领先世界好几年。放心,在适当的时候会详细地给大家讲解分支的)。

nothing to commit, working directory clean 说明你的工作目录目前是“干净的”,没有需要提交的文件(意思就是自上次提交后,工作目录中的内容压根儿就没改动过)。

既然要做大项目,那么应该增加一个版权声明。为了显得大公无私,我们采用 MIT 许可证给予用户最大的权利,让全世界的开发者都参与进来!

在工作目录中增加 LICENSE 文件,内容如下:

Copyright (C) <year> <copyright holders>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

友情提示:MIT 许可证几乎是最宽松的版权约定,一旦你的程序采用,也就意味着别人只要在软件包含上边的版权声明,就可以对你的程序为所欲为了(包括“使用、复制、修改、合并、出版发行、散布、再授权和/或贩售软件及软件的副本”)。

现在我们输入 git status 命令,看下 git 有什么想法:

Git实用教程 3.1:状态

Untracked files 说明存在未跟踪的文件(下边红色的那个)

所谓的“未跟踪”文件,是指那些新添加的并且未被加入到暂存区域或提交的文件。它们处于一个逍遥法外的状态,但你一旦将它们加入暂存区域或提交到 Git 仓库,它们就开始受到 Git 的“跟踪”。

这里圆括号中的英文是 git 给我们的建议:使用 git add <file> 命令将待提交的文件添加到暂存区域。(然后 Git 就可以对它们嘿嘿嘿 

那我们不妨按照建议来操作:

Git实用教程 3.1:状态

add 命令如果执行成功,并不会有提示消息。

再来看一下 git 的当前状态:

Git实用教程 3.1:状态

大家看到,首先是文件被绿了(都说是给 Git 嘿嘿嘿了嘛)

use "git reset HEAD <file>..." to unstage 的意思是“如果你反悔了,你可以使用 git reset HEAD 命令恢复暂存区域”。

 试试又不会怀孕:

Git实用教程 3.1:状态

还真回去了!

好吧,再次添加到暂存区域,然后执行 git commit -m "add a license file" 命令:

Git实用教程 3.1:状态

再次查看状态:

Git实用教程 3.1:状态

OK,再次干净了。

等等,你别走……

突然发现版权那块忘了写上咱自家的名字了……

打开 LICENSE 文件,将 Copyright (C) <year> <copyright holders> 改为 Copyright (C) 2018 [email protected],保存……

执行 git status 命令:

Git实用教程 3.1:状态

由于你对工作目录的文件进行了修改,导致这个文件和暂存区域的对应文件不匹配了,所以 Git 又给你提出两条建议:

  • 使用 git add 命令将工作目录的新版本覆盖暂存区域的旧版本,然后准备提交
  • 使用 git checkout 命令将暂存区域的旧版本覆盖工作目录的新版本(危险操作:相当于丢弃工作目录的修改)

还有一种情况我们没分析,大家先把新版本的文件覆盖掉暂存区域的旧版本:

Git实用教程 3.1:状态

然后我们打开 LICENSE 文件,将 2018 改为 2019.1.15,保存……

再次查看状态:

Git实用教程 3.1:状态

这次诡异了:被绿的 LICENSE 说明文件存放在暂存区域(待提交),同时红色的 LICENSE 说明文件还在工作目录等待添加到暂存区域。

这种情况你应该意识到这里存在两个不同版本的 LICENSE 文件,这时如果你直接执行 commit 命令,那么提交的是暂存区域的版本(2018),如果你希望提交工作目录的新版本(2019.1.15),那么你需要先执行 add 命令覆盖暂存区域,然后再提交……

烦不烦?!

老是要 add 再 commit,很烦恼吧?

有没有办法一步到位?

答案当然是 Yes!

来,教你一步到位的技巧:在 commit 的时候,加上 -a 选项即可。

执行 git commit -am "change the license file" 命令:

Git实用教程 3.1:状态

解释:

-a 选项其实是专为懒人添加的。添加了 -a 选项,Git 会自动帮你将工作目录中所有“已跟踪”的文件先 add 到暂存区域,然后再执行 commit 命令。另外,-am 是 -a -m 的缩写,多个选项可以写在一起,懒人嘛~