Git - 修复错误

犯错是人。 因此,每个 VCS 都提供了一个功能来修复错误直到某个点。 Git 提供了一项功能,我们可以使用它来撤消对本地存储库所做的修改。

假设用户不小心对其本地存储库进行了一些更改,然后想要撤消这些更改。 在这种情况下,revert 操作起着重要作用。


还原未提交的更改

让我们假设 Jerry 不小心修改了他本地存储库中的文件。 但他想撤消他的修改。 为了处理这种情况,我们可以使用 git checkout 命令。 我们可以使用这个命令来恢复文件的内容。

[jerry@CentOS src]$ pwd
/home/jerry/jerry_repo/project/src

[jerry@CentOS src]$ git status -s
M string_operations.c

[jerry@CentOS src]$ git checkout string_operations.c

[jerry@CentOS src]$ git status –s

此外,我们可以使用 git checkout 命令从本地存储库中获取已删除的文件。 让我们假设 Tom 从本地存储库中删除了一个文件,并且我们想要恢复该文件。 我们可以通过使用相同的命令来实现这一点。

[tom@CentOS src]$ pwd
/home/tom/top_repo/project/src

[tom@CentOS src]$ ls -1
Makefile
string_operations.c

[tom@CentOS src]$ rm string_operations.c

[tom@CentOS src]$ ls -1
Makefile

[tom@CentOS src]$ git status -s
D string_operations.c

Git 在文件名前显示字母 D。 这表明该文件已从本地存储库中删除。

[tom@CentOS src]$ git checkout string_operations.c

[tom@CentOS src]$ ls -1
Makefile
string_operations.c

[tom@CentOS src]$ git status -s

注意 − 我们可以在提交之前执行所有这些操作。


从暂存区移除更改

我们已经看到,当我们执行添加操作时,文件会从本地存储库移动到声明区域。 如果用户不小心修改了文件并将其添加到暂存区,他可以使用 git checkout 命令恢复他的更改。

在 Git 中,有一个 HEAD 指针始终指向最新的提交。 如果要撤消暂存区的更改,则可以使用 git checkout 命令,但使用 checkout 命令,您必须提供一个附加参数,即 HEAD 指针。 附加的提交指针参数指示 git checkout 命令重置工作树并删除分阶段的更改。

让我们假设 Tom 从他的本地存储库中修改了一个文件。 如果我们查看这个文件的状态,它会显示该文件被修改但没有添加到暂存区。

tom@CentOS src]$ pwd
/home/tom/top_repo/project/src
# Unmodified file

[tom@CentOS src]$ git status -s

# Modify file and view it’s status.
[tom@CentOS src]$ git status -s
M string_operations.c

[tom@CentOS src]$ git add string_operations.c

git status 显示文件存在于暂存区,现在使用 git checkout 命令恢复它并查看恢复文件的状态。

[tom@CentOS src]$ git checkout HEAD -- string_operations.c

[tom@CentOS src]$ git status -s

使用 Git 重置移动 HEAD 指针

在进行一些更改后,您可能会决定删除这些更改。 Git 重置命令用于重置或恢复更改。 我们可以执行三种不同类型的重置操作。

下图是 Git 重置命令的图示。

git Tutorial git Tutorial

Soft

每个分支都有一个 HEAD 指针,指向最新的提交。 如果我们使用带有 --soft 选项后跟提交 ID 的 Git 重置命令,那么它只会重置 HEAD 指针而不破坏任何东西。

.git/refs/heads/master 文件存储 HEAD 指针的提交 ID。 我们可以使用 git log -1 命令来验证它。

[jerry@CentOS project]$ cat .git/refs/heads/master
577647211ed44fe2ae479427a0668a4f12ed71a1

现在,查看最新的提交 ID,它将与上面的提交 ID 匹配。

[jerry@CentOS project]$ git log -2

上面的命令会产生如下结果。

commit 577647211ed44fe2ae479427a0668a4f12ed71a1
Author: Tom Cat <tom@tutorialspoint.com>
Date: Wed Sep 11 10:21:20 2013 +0530

Removed executable binary


commit 29af9d45947dc044e33d69b9141d8d2dad37cc62
Author: Jerry Mouse <jerry@tutorialspoint.com>
Date: Wed Sep 11 10:16:25 2013 +0530

Added compiled binary

让我们重置 HEAD 指针。

[jerry@CentOS project]$ git reset --soft HEAD~

现在,我们只需将 HEAD 指针复位一个位置。 让我们检查一下 .git/refs/heads/master 文件的内容。

[jerry@CentOS project]$ cat .git/refs/heads/master
29af9d45947dc044e33d69b9141d8d2dad37cc62

文件中的提交 ID 已更改,现在通过查看提交消息进行验证。

jerry@CentOS project]$ git log -2

上面的命令会产生如下结果。

commit 29af9d45947dc044e33d69b9141d8d2dad37cc62
Author: Jerry Mouse <jerry@tutorialspoint.com>
Date: Wed Sep 11 10:16:25 2013 +0530

Added compiled binary


commit 94f7b26005f856f1a1b733ad438e97a0cd509c1a
Author: Jerry Mouse <jerry@tutorialspoint.com>
Date: Wed Sep 11 10:08:01 2013 +0530

Added Makefile and renamed strings.c to string_operations.c

mixed

带有 --mixed 选项的 Git 重置会从暂存区域恢复那些尚未提交的更改。 它仅恢复暂存区域的更改。 对文件工作副本所做的实际更改不受影响。 默认的 Git 重置等价于 git reset --mixed。

hard

如果在 Git 重置命令中使用 --hard 选项,它将清除暂存区域; 它会将 HEAD 指针重置为特定提交 ID 的最新提交,并删除本地文件更改。

让我们检查提交 ID。

[jerry@CentOS src]$ pwd
/home/jerry/jerry_repo/project/src

[jerry@CentOS src]$ git log -1

上面的命令会产生如下结果。

commit 577647211ed44fe2ae479427a0668a4f12ed71a1
Author: Tom Cat <tom@tutorialspoint.com>
Date: Wed Sep 11 10:21:20 2013 +0530

Removed executable binary

Jerry 通过在文件开头添加单行注释来修改文件。

[jerry@CentOS src]$ head -2 string_operations.c
/* This line be removed by git reset operation */
#include <stdio.h>

他使用 git status 命令验证了它。

[jerry@CentOS src]$ git status -s
M string_operations.c

Jerry 将修改后的文件添加到暂存区,并使用 git status 命令进行验证。

[jerry@CentOS src]$ git add string_operations.c
[jerry@CentOS src]$ git status

上面的命令会产生如下结果。

# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
#
modified: string_operations.c
#

Git 状态显示文件存在于暂存区。 现在,使用 --hard 选项重置 HEAD。

[jerry@CentOS src]$ git reset --hard 577647211ed44fe2ae479427a0668a4f12ed71a1

HEAD is now at 5776472 Removed executable binary

Git 重置命令成功,这将从暂存区恢复文件并删除对文件所做的任何本地更改。

[jerry@CentOS src]$ git status -s

Git 状态显示文件已从暂存区恢复。

[jerry@CentOS src]$ head -2 string_operations.c
#include <stdio.h>

head 命令还显示重置操作也删除了本地更改。