# 更新仓库
现在的 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