Git 教程 - 工作流程

Jinku Hu 2023年1月30日 2018年7月19日
  1. git add
  2. git commit
Git 教程 - 工作流程

正如我们上节学到的,添加文件或提交文件基本上需要两个步骤。

  • git add
    将文件添加到暂存区,命令如下,
   $ git add test1.txt

file1.txt 将从工作区域添加到暂存区,并且它随时可以被提交到仓库。每当我们创建一个文件时,它就在我们的工作区上(本地计算机上),然后在 git add 命令之后进入暂存区。

  • git commit
    它会将你的暂存区中的所有文件都推送到仓库。
   $ git commit -m "commit message"

我们通常会提交内容的时候也添加描述信息,比如我们在文件或项目中所做的更改,这样我们可以在将来获取此提交的日志记录信息。

git add

更改并保存文件后,我们计算机上的文件与我们的仓库中的文件就有了不同,因为在仓库中的文件仍然是此次修改之前的内容。

如果你键入 git status,可以看到 Git 已经知道你的文件已被修改。

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   test1.txt

no changes added to commit (use "git add" and/or "git commit -a")

正如 Git 所建议的那样,我们使用 git add 更新将要提交的文件。

$ git add test1.txt

现在,你可以将此更新文件从暂存区提交到仓库。

有些时候,我们同时更新了多个文件,我们当然可以用上面介绍的方式来添加所有的文件,

$ git add test1.txt test2.txt test3.txt

但如果你有大量文件或文件名太长,每个文件加起来会有些繁琐。Git 有一个快捷方式,可以将所有更新的文件和未跟踪的文件添加到暂存区,

$ git add .

这里,. 意思是与仓库不同的所有文件。

git commit

我们在介绍 Git 其他功能时已经讲到了如何使用 git commit。基本上来讲,git commit 将暂存区推送到仓库,强烈建议你添加提交消息来描述此次提交更改的内容,因为以后你可以用 git log 命令来获取所有的已提交日志信息。

直接提交到仓库

在我们提交之前,我们需要将更改添加到暂存区。然后我们就可以提交它们到仓库。但实际上有时我们不需要将它们添加到暂存区的这个中间步骤,因为我们知道这是我们最终项目想要的,仓库或服务器上的这些更改是每个项目成员都需要进行更新的。

所以我们可以做的是先检查 git status,来查看工作区中修改了什么。然后我们可以直接用 git commit 将这些修改提交到仓库,不用将它们添加到暂存区。

$ git commit -a -m "commit message here."

我们这里使用的是一个捷径,不用将更改添加到暂存区。但这仅在某些情况下有用处,无论何时使用此命令,都需要小心,因为它将抓取工作区中的所有内容并将其直接推送到仓库。

修改提交

我们可能在提交后遇到这种情况,我们在代码中发现了拼写错误或其他微小错误。当然,你可以修改代码并再次将更改提交到仓库。但是我们也可以做的就是我们重写最近的一次提交,并且最新的提交将会被新的修改覆盖。

git commit 后面的 --amend 标志告诉 Git 这个提交将取代之前的提交,之前的提交以后不会在日志消息里了。

$ git commit --amend -m "new information is updated"
注意!
永远不要修改非最新提交,因为其他项目团队成员或其他分支有可能是基于该提交的版本。在修改提交之后,他们的版本将会失去了参考,版本控制很难从中恢复。
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn