Git 修正错误

Git 修正错误

人非圣贤,犯错在所难免。因此每个版本控制系统都提供了修正错误的功能,直到某个时点。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

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

从暂存区中移除修改

我们已经看到,当执行 add 操作时,文件会从本地仓库移动到暂存区。如果用户意外修改了一个文件并将其添加到暂存区,他可以通过使用 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状态显示该文件位于暂存区中,现在使用git checkout命令还原它,并查看还原后文件的状态。

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

[tom@CentOS src] git status -s

移动HEAD指针与Git Reset

在进行了一些更改后,您可能决定撤销这些更改。Git reset命令用于重置或还原更改。我们可以执行三种不同类型的重置操作。

下面的图表显示了Git reset命令的图示表示。

Git 修正错误

Git 修正错误

软重置

每个分支都有一个HEAD指针,它指向最新的提交。如果我们使用带有–soft选项的Git重置命令,后面跟着提交ID,那么它将仅重置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 reset命令将还原尚未提交的暂存区更改。它只还原暂存区的更改,对文件的工作副本的实际更改不受影响。默认的Git reset等同于git reset –mixed。

hard

如果在Git reset命令中使用–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 reset命令成功,这将将文件从暂存区恢复,并将删除对文件所做的任何本地更改。

[jerry@CentOS src]$ git status -s

Git状态显示该文件已从暂存区还原。

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

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程