网站搜索

Git Commit:大师班


简介: Git commit 命令将工作目录中的更改副本存储在 Git 存储库中。但它也可以用于修改现有提交和还原提交。

任何版本控制系统的一个基本要求是为您存储不同版本的文件。在 Git 中,执行此操作的命令是 commit。这里有你需要知道的一切。

什么是 Git 中的提交?

提交是在项目的整个生命周期中制作的一系列快照,构成了项目的开发历史。提交使我们能够提取项目的一个版本,因为它在过去的不同时间点。为什么这很重要?

版本控制系统 (VCS) 最常用于软件源代码和开发项目。但它们可以成功地用于任何文本文件集合,例如包含书籍章节的 Markdown 文件。

您可能不希望项目目录中的每个文件都由 VCS 处理,因此您需要能够指定要进行版本控制的文件。这会将它们添加到项目的版本控制视图中。他们将受到监视以了解变化。

实现此目的的另一种方法是使用忽略列表。这告诉 Git 它应该始终忽略哪些文件、目录或文件类型。

随着时间的推移,随着新文件被添加到项目中,一些文件将需要添加到版本控制系统中。在 Git 中,这是由 add 命令处理的。实际上,正如我们将要看到的,add 命令提供了双重服务。

为了维护对项目所做更改的历史记录,您将使用 commit 命令定期要求 Git 存储项目状态的快照。这是 add 命令再次出现在我们的工作流程中的地方。我们使用 add 命令告诉 Git 我们希望将哪些更改文件包含在快照中。然后我们使用 commit 告诉 Git 创建快照。

配置提交命令

有关提交的信息与它一起存储,因此始终可以知道提交的人、时间以及提交包含的内容。其中一些元数据是在提交时捕获的,例如提交消息。

每个用户可以配置与开发团队成员身份相关的元数据,以防止重复提供相同的信息。

要为计算机上的所有存储库全局设置名称,请使用此命令。

git config --global user.name "Dave McKay"

要验证您的名称是否已设置,请使用此命令。

git config --global user.name

如果您需要在特定存储库上使用不同的名称,请切换到项目目录并使用不带 --global 选项的相同命令。

git config user.name "McKay, David"
git config user.name

我们现在为这个存储库获得了一个不同的默认用户名,我们的全局名称仍然用于其他存储库。

以类似的方式,我们可以通过包含或省略 --global 选项为全局或单个存储库设置电子邮件地址。

git config user.email "dave@phony-domain.com"
git config --global user.email "dave@fake-domain.com"
git config user.email
git config --global user.email

这些设置保存在配置文件中。全局 Git 设置保存在“~/.gitconfig”中,特定于存储库的设置保存在存储库的“.git/config”文件中。

commit 命令在运行时引用并使用这些值。

使用提交命令

commit 命令的基本用途是获取暂存区(称为索引)中的文件,并将它们作为提交存储在存储库的当前分支中。

基本提交

我们有一个文件已更改的项目。我们将使用 add 命令暂存文件,然后提交它。我们正在使用 -m(提交消息)选项,以便我们可以提供更改目的的简短描述。如果我们不使用此选项,则会在提交发生时提示我们输入提交消息。在命令行添加一个更方便。

git add jibber.c
git commit -m "Updated help text"

如果我们使用 git log 命令,我们可以按时间顺序查看提交的详细信息,最近的提交位于列表的顶部。

git log

提交显示在 less 中。

提交已标记有我们之前提供的名称和电子邮件地址,我们的提交消息也被记录下来。

自动暂存文件

暂存许多文件可能需要一点时间。一种不同的方法是将 -A(全部)选项与 add 结合使用。

这会自动暂存所有已修改 的文件以及所有当前未跟踪 的文件。未跟踪文件的暂存遵循“.gitignore”文件中的设置。 Git 不会暂存你告诉它不想包含的文件。最后,索引中不再存在于工作目录中的文件将从索引中删除

显然,-A 选项会导致很多事情同时发生。 --dry-run 选项可让您预览更改而无需实际执行它们。

git add -A --dry-run

在我们的示例中,它将暂存两个修改后的现有文件和两个新文件。在使用 commit 命令之前,让我们继续使用 -A 选项。

git add -A
git commit -m "Enhanced parsing"

我们可以看到一共更改了四个文件。其中两个是新创建的文件,已列出。

同时进行暂存和提交

commit 命令有一个小写的 -a(全部)选项。这一步执行文件的暂存和提交。

commit -a 选项暂存并提交修改后的现有 文件,如果文件已从您的工作目录中删除,则从索引中删除 文件。它不会自动暂存未跟踪的文件。

add 命令一样,commit 命令有一个 --dry-run 选项,允许您在执行之前预览其操作。

git commit -a --dry-run

现在让我们执行命令。

git commit -a --dry-run

这些文件已为我们暂存和提交。

致力于不同的分支

如果您对工作目录中的文件进行了一些更改,然后意识到您没有签出正确的分支,则需要将更改提交到正确的分支而不影响当前分支。

Git 没有用于提交到不同分支的命令。但是您可以使用一点 Git 技巧来纠正这种情况。

我们将使用 Git stash 命令来制作更改的副本。然后我们将检查正确的分支并应用存储中的更改。要应用隐藏的更改,我们使用 pop 命令而不是 apply 命令。 pop 命令应用更改并从存储中删除它们。

我们对存储库的 new-parser 分支做了一些更改。它们应该在 classic-parser 分支中制作。

git stash
git checkout classic-parser
git stash pop

我们现在可以执行 commit,并更新此分支。

git commit -a -m "Added pre-parser functions"

如果我们返回到 new-parser 分支,我们可以看到它是最新的,这意味着更改已从您的工作目录中删除,并且您的存储库和文件是同步的。

git checkout new-parser
git status

对提交进行更改

如果您需要改进您的提交消息——也许您发现了其中的拼写错误——或者您忘记暂存一个应该包含在提交中的文件,您可以使用 --amend 选项把事情做好。需要注意的是,这不应该用于已推送到远程存储库的提交。

在我们最后的提交信息中,“fraze”应该是“phrase”。如果我们使用 git log 我们可以看到这个。

为了纠正这个问题,我们将像这样使用 --amend 选项。

git commit --amend -m "Optimized phrase identification"

如果我们再次使用 git log,我们可以看到旧提交已被新提交替换,并带有更正的提交消息。

如果我们想添加一个忘记暂存的文件,我们可以提交该文件,使其显示为上一次提交的一部分。

我们将使用 add 暂存文件,然后使用 --amend 选项进行提交。 --no-edit 选项意味着我们不需要提供新的提交信息。保留先前的提交消息。

git add jibber.c
git commit --amend --no-edit

从提交中删除更改

如果您不小心暂存并提交了一个您不打算提交的文件,您可以使用 reset 命令从提交中删除该文件。我们会将提交重置回暂存区或索引。然后我们将删除该文件,并重新提交其余文件。

要将最后一次提交重置到暂存区,我们使用 reset --soft 命令。 HEAD~ 是“项目提交时间线的 HEAD 后面的提交”的简写,英文是“最后一次提交”。

git reset --soft HEAD~

要删除不应该包含的文件,我们使用 reset --mixed 命令。这会将这些更改重置回工作目录,将修改后的文件重新创建为未暂存、未提交的文件。

git reset --mixed jibber.c

我们需要提交留在索引中的其他文件。

git commit -m "Experimental tweaks"

原始提交中的其他两个文件为我们重新提交。

还原整个提交

有时撤消整个提交是最简单的事情。它会将您的工作目录和存储库恢复到您提交之前的状态。

我们需要使用提交的哈希引用 ID。我们可以使用 git log 找到它:

复制该引用并在 revert 命令中使用它:

git revert e5bd4560aef8164c6ca9d6d4620b9db7f66aecc8

这将打开您的默认编辑器,以便您可以编辑还原消息。系统为您输入了一条默认消息。您可以使用它,也可以根据自己的喜好对其进行编辑。

当您对还原消息感到满意时,保存文件并退出编辑器。在 nano 中,您可以使用“Ctrl+O”和“Ctrl+X”执行此操作。

再次使用 git log,我们可以看到添加了一个新的提交,它撤消了还原提交的更改。

Git 瑞士军刀

显然,commit 是最重要的 Git 命令之一。它可以做很多事情,所以有很多东西要学。掌握其较少使用的功能是值得花时间的。当你需要纠正错误时——现在——你会庆幸自己提前做好了准备。