Git 提供了一系列功能强大的命令来管理和操作我们的代码库。在这些命令中,INLINECODEbf6f7f1d、INLINECODE084151aa 和 git reset 是我们经常用于不同场景的三个核心命令。深入理解它们之间的区别对于进行有效的版本控制至关重要。在本文中,我们将深入探讨这三个命令的功能、用法以及它们各自的适用场景。
为了更直观地演示,让我们先创建一个示例 Git 仓库,其中包含一个名为 demo.txt 的文件,文件内容为 Hello Geeks 。
我们可以看到,目前仓库中只有一个提交,且该提交包含了写有 "Hello Geeks" 的文本文件。现在,让我们向这个文本文件中添加一些新内容。假设我们添加了一行 Hello World. 进行这项修改后,我们的文件现在需要被添加到暂存区(Staging Area)才能完成提交。这些更新目前位于工作区(Working Area),我们可以使用 git status 命令来查看它们的状态。
现在,我们的工作仓库中存在一个未跟踪的修改 Hello World,假设我们需要丢弃这个更改。那么,我们应该使用的命令是——
1. git checkout
git checkout 主要用于丢弃工作仓库中的更改。
> git checkout
当我们执行 git checkout 命令后,再次查看 Git 仓库的状态以及文本文件的内容,我们会发现工作区中的更改已经被丢弃了,文件恢复到了我们之前修改前的状态。
现在,如果我们想取消文件的暂存(即从暂存区移出)该怎么办呢?我们在提交之前会对文件进行暂存,但在某些时候,我们可能决定暂时不提交某些文件的更改。让我们再次向文本文档中添加 Hello World,并使用 git add 命令将其添加到暂存区。
此时我们需要将文件从暂存区移出,为此我们将使用以下命令——
2. git reset
INLINECODE34b39575 用于当我们想要取消文件的暂存状态,并将更改重新放回工作目录时。此外,INLINECODE9b4235e0 也可以用来从本地仓库中删除提交记录。
> git reset HEAD
每当我们取消暂存一个文件时,该文件的所有更改都会被保留在工作区中。
执行后,我们回到了工作目录的状态,我们的修改依然存在,但文件已经不再处于暂存区了。
此外,有时我们可能会有一些不想被提交的提交记录,并希望从本地仓库中将它们移除。为了演示如何从本地仓库中删除提交,让我们把刚才做的更改先暂存并提交,然后再尝试删除那个提交。
现在我们有了 2 个提交,最新的一个是 "Added Hello World" 提交,我们打算将其删除。我们将使用的命令是——
> git reset HEAD~1
>
> 请注意以下几点:
>
> – 这里的 HEAD~1 意味着我们即将删除最顶端的提交,也就是我们最新完成的那次提交。
> – 我们不能利用 INLINECODEb9899463 随意删除某一个特定的提交,例如:我们不能指定删除“第二个”或“第三个”提交,我们只能删除最新的提交、最新的 2 个提交……或是最新的 N 个提交 (INLINECODEaf52a083)。[这里的 n 代表需要删除的最近 n 个提交]。
使用上述命令后,我们可以看到我们的提交已被删除,同时我们的文件再次变为未暂存状态,回到了工作目录中。实际上,git reset 有不同的模式来决定如何保留我们的更改。
- git reset –soft HEAD~1 – 此命令会删除提交,但不会将文件从暂存区移出。也就是说,我们的更改仍然会保留在暂存区中。
- git reset –mixed HEAD~1 或 git reset HEAD~1 – 这是我们在上文中使用的默认模式。它既会删除提交,也会取消文件的暂存状态,并将我们的更改保留在工作目录中。
- git reset –hard HEAD~1 – 此命令会删除提交,并且同时丢弃工作目录中的所有更改。这通常被称为“破坏性”命令,因为一旦执行,我们将无法找回那些更改,所以使用时务必格外小心。
我们在上文刚刚讨论过,git reset 命令不能用于删除远程仓库中的提交。那么,如果我们要从远程仓库中移除不需要的提交,该怎么办呢?我们需要使用的命令是——
3. git revert
git revert 用于从远程仓库中移除提交(实际上是通过创建一个新的“反向提交”来抵消旧的提交)。由于现在我们的更改已经在工作目录中,让我们先把那些更