提交循环


假设你在 weather-app 上工作了最后二十分钟。你在 src/index.js 中修复了一个真实的bug,温度转换有偏差,当你在那里时,你还开始重新设计 styles.css,但那个更改还未完成,还没有准备好让其他人看到。你想现在就将bug修复保存为它自己的检查点,而不需要将未完成的样式变更一起拖入。
这正是提交循环的用途。如果你还没有设置仓库,你的第一个仓库会引导你了解 git init 和克隆。从这里开始,本章假设你已经打开了一个仓库。
三个阶段:工作目录、暂存区、提交
在 Git 中,你所做的每一个更改在成为永久历史之前都会经过三个阶段。你的工作目录是项目在磁盘上的当前状态,是你正在编辑的文件。暂存区是一个临时位置,你在这里放置确切地想在下一步保存的更改。一个提交是已保存的快照本身,一旦你写入它,加上描述它的消息。
想象为搬家打包。你的整个房子是工作目录:你拥有的一切,无论其状态如何。你已经打包并用胶带封好放在前门的盒子是暂存区:只有你故意选择带走的东西。装着那些盒子开走的搬家车是提交:一条记录,记录了确切地在那一刻离开的东西,外面有一个标签说明里面是什么。
这是这个心理模型在实际终端中的展示。在编辑 weather-app 中的两个文件后,git status 读取当前状态而不改变任何东西:
$ git status
On branch main
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: src/index.js
modified: styles.css
no changes added to commit (use "git add" to commit)两个文件都显示为"未暂存",因为编辑文件只会改变你的工作目录。除非你用 git add 告诉 Git 把它放在那里,否则没有任何东西会进入暂存区,这是下一部分。
这是暂存区存在的全部理由变得清晰的地方。暂存区让你精确地选择进入提交的内容,独立于工作目录中还有什么其他已编辑的东西。没有它,保存一个检查点会强制你一次性获取磁盘上的每个更改,无论是否准备好。
有了它,你可以暂存 src/index.js 中完成的bug修复,排除半完成的 styles.css,并仅提交实际完成的部分。这一个细节,暂存和你的工作目录可以同时持有不同的东西,让几乎每个人在第一周都会困惑。一旦它有意义了,Git 的其余日常工作流程就会变得更加清晰。
git add 选择要进入的内容,这就是让你保存一个完成的更改而排除一个半完成的更改的方式。 暂存更改:git add
git add 将更改从你的工作目录移动到暂存区。指向想要进入下一个提交的文件:
$ git add src/index.js
$ git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: src/index.js
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: styles.csssrc/index.js 移动到"要提交的更改",bug修复已暂存并准备好。styles.css 仍然列在"未暂存"下,这正是你在重新设计未完成时想要的地方。同样运行 git add styles.css 也会暂存它;运行 git add . 一次暂存当前文件夹中的每个更改文件,一旦你相信磁盘上的一切都真的准备好了,这就很方便。
git add <file> 将该文件的当前更改移动到暂存区,为下一个提交做准备。你还没有添加的文件留在外面,所以你可以完成一件事并留下另一件处于中途编辑的状态。git add . 一次暂存每个更改的文件,一旦一切都真的准备好了就很方便。 保存快照:git commit
一旦暂存区持有你想要的东西,git commit 将其保存为永久快照,-m 标志("message" 的缩写)提供随之而来的描述:
$ git commit -m "Fix temperature conversion in Celsius-to-Fahrenheit formula"
[main 4f2a1c9] Fix temperature conversion in Celsius-to-Fahrenheit formula
1 file changed, 1 insertion(+), 1 deletion(-)只有 src/index.js 进入了,因为那是你暂存的全部。styles.css 仍然在你的工作目录中进行编辑,未触及,等待什么时候重新设计完成。短 id 4f2a1c9 命名这个确切的提交,历史章节涵盖了读取像这样的项目的完整提交列表。
git commit -m "message" 将当前暂存的任何内容保存为永久快照,带有你给它的消息。你没有暂存的任何东西都保持不变并可编辑。保持消息简短清楚关于提交做什么,未来你会比你预期的更经常读取它。 
