Git基本操作
Git仓库工作目录下的文件状态
已跟踪
- Git已知的文件。工作一段时间以后,他们的状态可能是
- 未修改
- 已修改
- 已放入暂存区
未跟踪
- 除了上述文件以外的其他文件。
文件状态
- 未跟踪 Untracked
- 已跟踪
- 暂存区 Staged
- 非暂存区 Modified
- 已提交 Unmodified
获取(新建)Git仓库
将一个本地目录转换为Git仓库(新建)
git init
从其他远程仓库中克隆一个仓库(获取)
git clone <url>
git clone <url> <自定义目录名>
忽略文件
在任意目录(子目录)下新建 .gitignore 文件
一个仓库可以只有一个 .gitignore 文件(一般情况都只有这一个文件),也可以在子目录下拥有额外的 .gitignore 文件
格式规范
- 注释:所有空行或者以 # 开头的行都会被 Git 忽略。
- 使用标准的 glob 模式匹配,(shell使用的简化版正则表达式)
- 星号(
*
)匹配零个或多个任意字符 [abc]
匹配任何一个列在方括号中的字符 (这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c)- 问号(
?
)只匹配一个任意字符 - 如果在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配(比如
[0-9]
表示匹配所有 0 到 9 的数字) - 使用两个星号(
**
)表示匹配任意中间目录,比如a/**/z
可以匹配a/z
、a/b/z
或a/b/c/z
等
- 星号(
- 匹配模式可以以(
/
)开头防止递归。 - 匹配模式可以以(
/
)结尾指定目录。 - 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(
!
)取反。
记录每次更新到仓库
查看文件的状态
git status
输出内容:
- changes to be committed 文件已改变,已暂存,准备提交
- changes not staged for commit 已跟踪文件的内容发生了变化,但还没有放到暂存区。
- untracked files 未跟踪的文件
git status -s(--short)
简化输出
跟踪新文件(将一个文件添加到项目中)
git add <sth>
精准地将内容添加到下一次提交中
git add
git add
有多重功能,主要有以下功能:
- 开始跟踪新的文件
- 把已跟踪的文件放到暂存区
- 合并时把有冲突的文件标记为已解决的状态
查看已暂存和未暂存的修改
查看未暂存的文件更新了哪些部分
git diff
查看已暂存的,将要添加到下次提交里的内容
git diff --staged
git diff --cached
注:staged 和 cached 两个单词为近义词
使用diff插件来输出diff的分析结果
git difftool
提交更新
直接提交已暂存的内容
git commit
跳过使用暂存区域,直接将所有已经跟踪过的文件暂存起来一并提交
git commit -a
小心,有时这个选项会将不需要的文件添加到提交中
直接提交已暂存内容,并使用简要提交信息
git commit -m "<提交信息>"
编辑提交信息
通过前两种方法(git commit
、git commit -a
)提交更新以后,git会调用系统中的文本编辑器(比如vim
),用户需要在文本编辑器里编写提交信息,保存退出编辑器后git会正式提交信息。提交的信息不能为空!
提交过后的git返回的信息(提交后输出的内容)
- 当前是在哪个分支提交的(master)
- 本次提交的SHA-1校验和(bf530a8)
- 本次提交中有多少文件修订过多少行添加或删改过
删除文件
从已跟踪的文件清单中移除(不删除文件)
git rm <file>
运行上述命令,再运行git status 时,会在已暂存清单中看到该文件。
下一次提交时,该文件就不再纳入版本管理了。
简单地从工作目录中手动删除文件
rm <file>
运行上述命令,再运行git status时,会在未暂存清单中看到该文件。
删除之前已修改过,或删除已放到暂存区的文件
git rm -f <file>
-f 即 force(强行)
通过这种方法删除的数据不能被git恢复
把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然保留在当前工作目录中。(比如编译生成的文件或日志文件)
git rm --cached <file>
git rm 命令后面可以列出文件或者目录的名字,也可以使用 glob 模式。
- 例:
git rm log/\*.log
glob模式在上文 忽略文件 处有所介绍
移动文件
命令
git mv <file_from> <file_to>
Git 并不显式跟踪文件移动操作。 如果在 Git 中重命名了某个文件,仓库中存储的元数据并不会体现出这是一次改名操作。
但是,此时如果查看状态信息(git status)实际上是能看到关于重命名操作的说明的
(输出)
renamed: README.md -> README
实际上,运行git mv相当于运行了三条命令
mv README.md README
git rm README.md
git add README