# 更新仓库

现在的 Git 仓库中,文件只有两种状态,已跟踪未跟踪

# 检查文件状态

// 会查看哪些文件处于什么状态
git status

# 跟踪新文件

// 如果参数是文件,则会跟踪该文件·
// 如果参数是目录,则会递归跟踪该目录下的所有文件
git add [文件/目录的路径]

注意:该命令可以

跟踪新文件

也可以将已经跟踪的文件放入到暂存区

可用于合并时,出现冲突后,把冲突文件标记为已解决的状态

# 暂存已修改文件

// 命令同上
git add

# 状态简览

// 缩短命令的输出
git status -s
git status -short

例如:

$ git status -s
M README
MM Rakefile
A  lib/git.rb
M  lib/simplegit.rb
?? LICENSE.txt

新添加的未跟踪文件前面有??标记,新添加到暂存区中的文件前面有 A 标记,修改过的文件前面有 M 标记。 输出中有两栏,左栏指明了暂存区的状态,右栏指明了工作区的状态。例如,上面的状态报告显示: README 文件在工作区已修改但尚未暂存,而 lib/simplegit.rb 文件已修改且已暂存。 Rakefile 文件已修改,暂存后又作了修改,因此该文件的修改中既有已暂存的部分,又有未暂存的部分。

# 忽略文件

遇到一些不需要加入到 git 管理的文件,可以创建忽略文件。

创建一个名为 .gitignore 的文件,列出要忽略的文件的模式

文件.gitignore 的格式规范如下:

1. 所有空行或者以 # 开头的行都会被Git忽略

2. 可以使用标准的glob模式匹配,它会递归的应用在整个工作区中

3. 匹配模式可以以(/)开头防止递归

4. 匹配模式可以以(/)结尾指定目录

5. 要忽略指定模式以外的文件或目录,可以在模式前加上感叹号(!)取反

所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。

星号(*)匹配零个或多个任意字符

[abc] 匹配任何一个列在方括号中的字符 (这个例子要么匹配一   个 a,要么匹配一个 b,要么匹配一个 c)

问号(?)只匹配一个任意字符

如果在方括号中使用短划线分隔两个字符, 表示所有在这两个字符 范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数  字)

使用两个星号(**)表示匹配任意中间目录,比如 a/**/z 可以匹配 a/z 、 a/b/z 或 a/b/c/z 等

案例:


# 忽略所有的 .a 文件
*.a

# 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
!lib.a

# 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
# / 斜杠在开头,防止递归(忽略当前目录下的所有 TODO 文件)
/TODO

# 忽略任何目录下名为 build 的文件夹
# 没有以斜杠开头,且又以斜杠结尾(表明该规则时作用于文件夹),则会进行递归(忽略当前目录下的所有 build 文件夹)
build/

# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt

# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf

Tip:https://github.com/github/gitignore

# 查看已暂存和未暂存的修改

// 此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容
git diff

// 这条命令将对比已暂存文件于最后一次提交的文件差异
git diff --staged
git diff --cached
// 以上两条命令作用相同(--staged 和 --cached 是同义词)

# 提交更新

// 将暂存区的内容提交
git commit
// 以上命令会打开默认编辑器来输入提交说明

git commit -m 提交说明

注意:未暂存的文件之后保留在本地磁盘上,可以在下一次提交时纳入版本管理。每一次提交操作,都会对你的项目做一次快照,以后可以回到这个状态,或者进行比较

# 跳过使用暂存区域

在 git 中,使用暂存区域可以精确的准备好要提交的细节(比如那些文件需要提交,那些不需要),但是有时候会略显繁琐。Git 提供了快速提交的方式来跳过暂存区域。
git commit -a -m 提交说明

这种方式会自动将所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 的步骤。
注意:这种方式会及那个所有跟踪过的文件全部提交,使用时需要注意。而那些新添加的未被跟踪的文件不会被提交

git commit --amend -m 覆盖上一次提交说明

# 移除文件

# 情况一:将已经被跟踪的文件删除

要从 Git 中移除文件,就必须要从已跟踪文件清单中清除(从暂存区域中清除),然后提交

git rm 文件名称
git rm -r 路径

git rm 命令可以完成删除工作, 并连带将工作区中的指定文件或目录删除

如果要删除的文件之前进行过修改,或者已经被放到了暂存区,则必须使用强制删除选项 -f (即: force 强制)。这是一种安全机制,用于防止误删除尚未添加到快照中的数据,因为这样未被添加到快照的数据不能被 Git 恢复

# 情况二:将仓库的文件删除(同样将暂存区的文件也进行删除),但保留工作区的文件

例如:之前没有使用.gitignore 文件,不小心将很多.log 日志文件添加到仓库中,现在需要将仓库的这些.log 文件删除,但是保留工作区的.log 文件

git rm --cached 文件名称

git rm 命令后面可以列出文件或者目录的名字,也可以使用 glob 模式。比如:

git rm log/\*.log

注意到星号 * 之前的反斜杠 \, 因为 Git 有它自己的文件模式扩展匹配方式,所以我们不用 shell 来帮忙展开。 此命令删除 log/ 目录下扩展名为 .log 的所有文件。 类似的比如:

git rm \*~

# 清空三:删除未跟踪的文件

git clean -n -d

git clean -f target

# 移动文件

git mv file_from file_to

实际上,git mv 相当于三条命令

mv file_from file_to
git rm file_from
git add file_to