# 快照基础
对于基本的暂存内容及提交到你的历史记录中的工作流,只有少数基本的命令。
## git add
`git add` 命令将内容从工作目录添加到暂存区(或称为索引(index)区),以备下次提交。 当`git commit` 命令执行时,默认情况下它只会检查暂存区域,因此 `git add` 是用来确定下一次提交时快照的样子的。
这个命令对于 Git 来说特别的重要,所以在本书中被无数次的提及和使用。 我们将快速的过一遍一些可以看到的独特的用法。
我们在 [跟踪新文件](70175) 一节中介绍并详细解释了 `git add` 命令。
然后,我们在 [遇到冲突时的分支合并](70184) 一节中提到了如何使用它来解决合并冲突。
接下来,我们在 [交互式暂存](70215) 一章中使用它来交互式的暂存一个已修改文件的特定部分。
最后,在 [树对象](70241) 一节中我们在一个低层次中模拟了它的用法,以便你可以了解在这背后发生了什么。
## git status
`git status` 命令将为你展示工作区及暂存区域中不同状态的文件。 这其中包含了已修改但未暂存,或已经暂存但没有提交的文件。 一般在它显示形式中,会给你展示一些关于如何在这些暂存区域之间移动文件的提示。
首先,我们在 [检查当前文件状态](70175) 一节中介绍了 `status` 的基本及简单的形式。 虽然我们在全书中都有用到它,但是绝大部分的你能用 `git status` 做的事情都在这一章讲到了。
## git diff
当需要查看任意两棵树的差异时你可以使用 `git diff` 命令。 此命令可以查看你工作环境与你的暂存区的差异(`git diff` 默认的做法),你暂存区域与你最后提交之间的差异(`git diff --staged`),或者比较两个提交记录的差异(`git diff master branchB`)
首先,我们在 [查看已暂存和未暂存的修改](http://git-scm.com/book/zh/v2/1-git-basics/_git_diff_staged) 一章中研究了 `git diff` 的基本用法,在此节中我们展示了如何查看哪些变化已经暂存了,哪些没有。
在 [提交准则](70203) 一节中,我们在提交前使用 `--check` 选项来检查可能存在的空白字符问题。
在 [确定引入了哪些东西](http://git-scm.com/book/zh/v2/1-distributed-git/_what_is_introduced) 一节中,了解了使用 `git diff A...B` 语法来更有效地比较不同分支之间的差异。
在 [高级合并](70221) 一节中我们使用 `-b` 选项来过滤掉空白字符的差异,及通过 `--theirs`、`--ours`和 `--base` 选项来比较不同暂存区冲突文件的差异。
最后,在 [开始使用子模块](70224) 一节中,我们使用此命令合 `--submodule` 选项来有效地比较子模块的变化。
## git difftool
当你不想使用内置的 `git diff` 命令时。`git difftool` 可以用来简单地启动一个外部工具来为你展示两棵树之间的差异。
我们只在 [查看已暂存和未暂存的修改](http://git-scm.com/book/zh/v2/1-git-basics/_git_diff_staged) 一节中简单的提到了此命令。
## git commit
`git commit` 命令将所有通过 `git add` 暂存的文件内容在数据库中创建一个持久的快照,然后将当前分支上的分支指针移到其之上。
首先,我们在 [提交更新](http://git-scm.com/book/zh/v2/1-git-basics/_committing_changes) 一节中涉及了此命令的基本用法。 我们演示了如何在日常的工作流程中通过使用 `-a` 标志来跳过 `git add` 这一步,及如何使用 `-m` 标志通过命令行而不启动一个编辑器来传递提交信息。
在 [撤消操作](http://git-scm.com/book/zh/v2/1-git-basics/_undoing) 一节中我们介绍了使用 `--amend` 选项来重做最后的提交。
在 [分支简介](70183),我们探讨了 `git commit` 的更多细节,及工作原理。
在 [签署提交](70217) 一节中我们探讨了如何使用 `-S` 标志来为提交签名加密。
最后,在 [提交对象](http://git-scm.com/book/zh/v2/1-git-internals/_git_commit_objects) 一节中,我们了解了 `git commit` 在背后做了什么,及它是如何实现的。
## git reset
`git reset` 命令主要用来根据你传递给动作的参数来执行撤销操作。 它可以移动 `HEAD` 指针并且可选的改变 `index` 或者暂存区,如果你使用 `--hard` 参数的话你甚至可以改变工作区。 如果错误地为这个命令附加后面的参数,你可能会丢失你的工作,所以在使用前你要确定你已经完全理解了它。
首先,我们在 [取消暂存的文件](70215) 一节中介绍了 `git reset` 简单高效的用法,用来对执行过 `git add` 命令的文件取消暂存。
在 [重置揭密](70220) 一节中我们详细介绍了此命令,几乎整节都在解释此命令。
在 [中断一次合并](70221) 一节中,我们使用 `git reset --hard` 来取消一个合并,同时我们也使用了`git merge --abort` 命令,它是 `git reset` 的一个简单的封装。
## git rm
`git rm` 是 Git 用来从工作区,或者暂存区移除文件的命令。 在为下一次提交暂存一个移除操作上,它与 `git add` 有一点类似。
我们在 [移除文件](http://git-scm.com/book/zh/v2/1-git-basics/_removing_files) 一节中提到了 `git rm` 的一些细节,包括递归地移除文件,和使用 `--cached`选项来只移除暂存区域的文件但是保留工作区的文件。
在本书的 [移除对象](70246) 一节中,介绍了 `git rm` 仅有的几种不同用法,如在执行 `git filter-branch` 中使用和解释了 `--ignore-unmatch` 选项。 这对脚本来说很有用。
## git mv
`git mv` 命令是一个便利命令,用于移到一个文件并且在新文件上执行`git add`命令及在老文件上执行`git rm`命令。
我们只是在 [移动文件](http://git-scm.com/book/zh/v2/1-git-basics/_git_mv) 一节中简单地提到了此命令。
## git clean
`git clean` 是一个用来从工作区中移除不想要的文件的命令。 可以是编译的临时文件或者合并冲突的文件。
在 [清理工作目录](70216) 一节中我们介绍了你可能会使用 `clean` 命令的大量选项及场景。
- 前言
- Scott Chacon 序
- Ben Straub 序
- 献辞
- 贡献者
- 引言
- 1. 起步
- 1.1 关于版本控制
- 1.2 Git 简史
- 1.3 Git 基础
- 1.4 命令行
- 1.5 安装 Git
- 1.6 初次运行 Git 前的配置
- 1.7 获取帮助
- 1.8 总结
- 2. Git 基础
- 2.1 获取 Git 仓库
- 2.2 记录每次更新到仓库
- 2.3 查看提交历史
- 2.4 撤消操作
- 2.5 远程仓库的使用
- 2.6 打标签
- 2.7 Git 别名
- 2.8 总结
- 3. Git 分支
- 3.1 分支简介
- 3.2 分支的新建与合并
- 3.3 分支管理
- 3.4 分支开发工作流
- 3.5 远程分支
- 3.6 变基
- 3.7 总结
- 4. 服务器上的 Git
- 4.1 协议
- 4.2 在服务器上搭建 Git
- 4.3 生成 SSH 公钥
- 4.4 配置服务器
- 4.5 Git 守护进程
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 第三方托管的选择
- 4.10 总结
- 5. 分布式 Git
- 5.1 分布式工作流程
- 5.2 向一个项目贡献
- 5.3 维护项目
- 5.4 总结
- 6. GitHub
- 6.1 账户的创建和配置
- 6.2 对项目做出贡献
- 6.3 维护项目
- 6.4 管理组织
- 6.5 脚本 GitHub
- 6.6 总结
- 7. Git 工具
- 7.1 选择修订版本
- 7.2 交互式暂存
- 7.3 储藏与清理
- 7.4 签署工作
- 7.5 搜索
- 7.6 重写历史
- 7.7 重置揭密
- 7.8 高级合并
- 7.9 Rerere
- 7.10 使用 Git 调试
- 7.11 子模块
- 7.12 打包
- 7.13 替换
- 7.14 凭证存储
- 7.15 总结
- 8. 自定义 Git
- 8.1 配置 Git
- 8.2 Git 属性
- 8.3 Git 钩子
- 8.4 使用强制策略的一个例子
- 8.5 总结
- 9. Git 与其他系统
- 9.1 作为客户端的 Git
- 9.2 迁移到 Git
- 9.3 总结
- 10. Git 内部原理
- 10.1 底层命令和高层命令
- 10.2 Git 对象
- 10.3 Git 引用
- 10.4 包文件
- 10.5 引用规格
- 10.6 传输协议
- 10.7 维护与数据恢复
- 10.8 环境变量
- 10.9 总结
- A. 其它环境中的 Git
- A1.1 图形界面
- A1.2 Visual Studio 中的 Git
- A1.3 Eclipse 中的 Git
- A1.4 Bash 中的 Git
- A1.5 Zsh 中的 Git
- A1.6 Powershell 中的 Git
- A1.7 总结
- B. 将 Git 嵌入你的应用
- A2.1 命令行 Git 方式
- A2.2 Libgit2
- A2.3 JGit
- C. Git 命令
- A3.1 设置与配置
- A3.2 获取与创建项目
- A3.3 快照基础
- A3.4 分支与合并
- A3.5 项目分享与更新
- A3.6 检查与比较
- A3.7 调试
- A3.8 补丁
- A3.9 邮件
- A3.10 外部系统
- A3.11 管理
- A3.12 底层命令