内容纲要

🗂 | 本文目录: Git 指南


本篇主要是针对在 Git 中对于文件到一些操作。

删除文件

如果想要在 Git 中删除一个文件就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除)。

你可能直接就使用文件管理器删除了想要删除的文件,但在删除后也还是要告诉 Git:

$ rm README.md
$ git rm README.md

所以更好的办法是直接使用 git rm 命令

# 或者直接使用 git rm
$ git rm README.md

如果要删除的文件已经修改了,那么你会得到提示「error: 如下文件有本地修改」或是「error: 如下文件其暂存的内容和工作区及 HEAD 中的都不一样」,这时候就需要使用 -f 选项强制删除:

$ git rm -f README.md

还有一种常见情况是你需要在 Git 中移除但是在工作目录中保留那个文件留作他用,那么就可以使用 --cached 选项:

$ git rm --cached README.md

这时使用 git status 就可以看到在暂存区中已经删了想要删除的文件就等提交了,另外因为文件保留在工作目录中,这时又出现了一个未跟踪文件:

位于分支 master
要提交的变更:
  (使用 "git restore --staged <文件>..." 以取消暂存)
    删除:     README.md

未跟踪的文件:
  (使用 "git add <文件>..." 以包含要提交的内容)
    README.md

重命名文件

加上一篇,假设要将项目中的 README.md 文件重命名成 README,如果你是在文件管理器中对它右键重命名,那么在 Git 中会处理成将一个已知跟踪的文件删除了,同时出现了一个未跟踪的文件。

要正确重命名文件可以在重命名后,可以使用 git rm 删除原文件,然后添加重命名后的文件到暂存区,或者直接使用 git mv 命令:

$ mv README.md READ_ME.md
$ git rm README.md
$ git add READ_ME.md

# 更推荐的做法:
$ git mv <旧文件名> <新文件名>
$ git mv READMD.md READ_ME.md

批量添加多个文件至暂存区

可以使用空格隔开文件名以达到添加多个文件的效果:

# 添加多个文件时可以使用空格在多个文件名之前隔开
$ git add <文件1> <文件2>

但需要添加的文件数量很多时就很麻烦了,这时可以用 .-A 或是 --all 选项:

# 对未跟踪或已跟踪的文件的修改、删除添加到暂存区
$ git add .
$ git add -A # --all 的简写

以上方法都可以对未跟踪的文件进行处理,但有时你只想针对已经跟踪并有所修改或删除的文件添加到暂存区,并不想处理未跟踪文件,这时可以使用 -u 选项

# 只对已跟踪的文件的修改、删除添加到暂存区
$ git add -u

忽略指定文件

会有一些文件是一直处于不想纳入 Git 的管理的情况,你可以在项目下创建一个名为 .gitignore 的文件,在这个文件中列出不想被 Git 管理的文件,这样它们就不会总出现在未跟踪文件列表。

比如 Windows 的 Thumbs.db 或是 macOS 的 .DS_Store,你可以将它们写在 .gitignore 里:

Thumbs.db
.DS_Store

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

  1. 所有空行或者以 # 开头的行都会被 Git 忽略。
  2. 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
  3. 匹配模式可以以 (/) 开头防止递归。
  4. 匹配模式可以以 (/) 结尾指定目录。
  5. 要忽略指定模式以外的文件或目录,可以在模式前加上叹号 (!) 取反

更多例子:

# 忽略所有的 .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

另外在 Github 上有一个 .gitignore 文件的模板集合,你可以在这上面找到更多例子用于系统开发语言环境:github / gitignore

跳过使用暂存区

尽管使用暂存区域的方式可以精心准备要提交的细节,但有时候这么做略显繁琐。

在使用 git commit 时可以使用 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,但有时这个选项会将不需要的文件添加到提交中。

$ git commit -a

使用 -a 选项不会将未跟踪的文件提交。

状态简览

git status 有一个 -s 选项可以以一种简洁的方式显示状态:

 M README
MM Rakefile
A  lib/git.rb
M  lib/simplegit.rb
?? LICENSE.txt

说明:

  • M:表示已修改;
  • MM:表示该文件添加到暂存区后,工作目录中的也进行了修改;
  • A:新增的已跟踪文件;
  • ??:未跟踪文件;

小结

  • 删除文件需要使用 git rm 命令,如果删除的同时保留文件在工作目录中使用 --cached 选项;
  • 重命名文件使用 git mv 命令;
  • 添加多个文件到暂存区可以以空格隔开文件名以达到添加多个文件的目的。当然更好的办法是使用 .-A 选项,如果不想添加未跟踪的文件则使用 -u 选项;
  • 有一些文件总是不想被 Git 接管的,但又不想在未追踪文件列表里看到它们,就可以设置 .gitignore 文件以隐藏它们;
  • 如果想要直接提交而省去暂存区这一步可以使用 -a 选项:git commit -am '<提交信息>'
  • git status 命令有一个 -s 选项可以以一种简洁的方式显示文件的状态;