glob模式又是个啥?

所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。 星号(*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。 使用两个星号( ) 表示匹配任意中间目录,比如 a/ */z 可以匹配 a/z , a/b/z 或 a/b/c/z 等。

# 忽略所有.a结尾的文件
# 不忽略lib.a,即跟踪lib.a文件
!lib.a
# 仅忽略当前文件下的TODO文件
/TODO
# 忽略build文件夹下的所有文件
build/
# 忽略doc文件(不含子文件夹)下的所有txt文件,忽略doc/a.txt,不忽略doc/t/b.txt
doc/*.txt
# 忽略doc文件夹及子文件夹下的所有pdf文件
doc/**/*.pdf

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

如果想知道具体修改了什么地方,可以使用git diff命令。

注意: git diff只能查看本地工作目录修改未暂存的数据;git diff --cachedgit diff --staged(Git 1.6.1+版本支持)只能查看本地暂存区修改的数据!!未被跟踪(新追加)的数据不会被查看。
# 修改README文件,追加123456
echo '123456' >> README
git diff
image.png
git commit后该文件就不再纳入版本管理了。如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f(译注:即 force 的首字母)。 这是一种安全特性,用于防止误删还没有添加到快照的数据,这样的数据不能被 Git 恢复。

从Git仓库中删除,在工作目录中保留
git rm --cached README
git status

使用 git commit 进行提交操作时,Git都做了什么?

当使用 git commit 进行提交操作时,Git 会先计算每一个子目录的校验和,然后在 Git 仓库中这些校验和保存为树对象。 随后,Git 便会创建一个提交对象,它除了包含上面提到的那些信息外,还包含指向这个树对象(项目根目录)的指针。如此一来,Git 就可以在需要的时候重现此次保存的快照。
现在,Git 仓库中有五个对象:三个 blob 对象(保存着文件快照)、一个树对象(记录着目录结构和 blob 对象索引)以及一个提交对象(包含着指向前述树对象的指针和所有提交信息)。

# 创建git仓库
git init
# 创建README1 README2 README3
touch README{1..3}
# 跟踪新文件
git add README1 README2 README3
git commit -m '提交新文件'