2.记录每次更新到仓库
你工作目录下的每一个文件都不外乎这两种状态:已跟踪 或 未跟踪。已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后, 它们的状态可能是未修改,已修改或已放入暂存区。简而言之,已跟踪的文件就是 Git 已经知道的文件。
Figure 8. 文件的状态变化周期
检查当前文件状态
可以用 git status
命令查看哪些文件处于什么状态。
$ git status
跟踪新文件,暂存已修改文件
git add 这是个多功能命令:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把/有冲突的文件标记为已解决状态等。 将这个命令理解为“精确地将内容添加到下一次提交中”而不是“将一个文件添加到项目中”要更加合适。
//跟踪新文件将其放入暂存区. 见Fugure8里面的Add the file
$ git add file.type
忽略文件
有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表
GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore
文件列表, 你可以在 https://github.com/github/gitignore 找到它。
要养成一开始就为你的新仓库设置好 .gitignore 文件的习惯,以免将来误提交这类无用的文件。
文件 .gitignore
的格式规范如下:
-
所有空行或者以
#
开头的行都会被 Git 忽略。 -
可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
-
匹配模式可以以(
/
)开头防止递归。 -
匹配模式可以以(
/
)结尾指定目录。 -
要忽略指定模式以外的文件或目录,可以在模式前加上叹号(
!
)取反。
所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。 星号(*
)匹配零个或多个任意字符;[abc]
匹配任何一个列在方括号中的字符 (这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c); 问号(?
)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配(比如 [0-9]
表示匹配所有 0 到 9 的数字)。 使用两个星号(**
)表示匹配任意中间目录,比如 a/**/z
可以匹配 a/z
、 a/b/z
或 a/b/c/z
等。
我们再看一个 .gitignore
文件的例子:
# 忽略所有的 .a 文件
*.a
# 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
!lib.a
# 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
/TODO
# 忽略任何目录下名为 build 的文件夹
build/
# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf
查看已暂存和未暂存的修改
如果 git status
命令的输出对于你来说过于简略,而你想知道具体修改了什么地方,可以用 git diff
命令
//查看尚未暂存的文件更新了哪些部分,不加参数直接输入 git diff
$ git diff
//比对已暂存文件与最后一次提交的文件差异
$ git diff --cached
//or
$ git diff --staged
提交更新
现在的暂存区已经准备就绪,可以提交了。
//未添加提交信息,会跳出前面部署的文件编辑器,打印提示信息,表示提交不成功
$ git commit
//将提交信息与命令放在同一行
$ git commit -m "commit message"
//-a是跳过使用暂存区(git add file.type)的命令,但在创建新文件时不适用(自测得出),
//修改暂存区文件后适用
$ git commit -a -m 'skip staged'
移除文件
要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。
/**
如果只是简单地从工作目录中手工删除文件,运行 git status 时就会在
“Changes not staged for commit” 部分(也就是 未暂存清单)看到
*/
$ rm PROJECTS.md
//再运行 git rm 记录此次移除文件的操作,下一次提交时,该文件就不再纳入版本管理了。
$ git rm PROJECTS.md
/**
如果要删除之前修改过或已经放到暂存区的文件,则必须使用强制删除选项 -f(译注:即 force 的首字母)。
这是一种安全特性,用于防止误删尚未添加到快照的数据,这样的数据不能被 Git 恢复。
*/
git rm -f file.type
/**
想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中
忘记添加 .gitignore 文件,不小心把一个很大的日志文件或一堆 .a 这样的编译生成文件添加到暂存区时,这一做法尤其有用
*/
$ git rm --cached file.type
移动文件
不像其它的 VCS 系统,Git 并不显式跟踪文件移动操作。
$ git mv file_from file_to
//其实,运行 git mv 就相当于运行了下面三条命令:
$ mv README.md README
$ git rm README.md
$ git add README