第二章Git基础#记录每次更新到仓库

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值