开发学院

您的位置:首页>教程>正文

教程正文

Git 修正错误

Git 修正错误

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

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

还原未提交的更改

  让我们假设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状态显示文件存在于暂存区中,现在使用git checkout命令还原它,并查看还原文件的状态。

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

[tom@CentOS src]$ git status -s
Move HEAD Pointer with Git Reset

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

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

before_git_reset.png

软重置

  每个分支都有一个指向最新提交的头指针。如果我们使用Git reset命令并附加--soft选项后跟提交ID,那么它将只重置头部指针而不会破坏任何内容。

  .git/refs/heads/master文件存储头指针的提交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

  让我们重置头部指针。

[jerry@CentOS project]$ git reset --soft 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

混合重置

  git reset后面跟着- mixed选项可以恢复尚未提交的临时区域中的更改。它仅从临时区域恢复更改。对文件工作副本所做的实际更改不受影响。默认的Git重置为Git混合重置。

硬重置

  如果将--hard选项与Git reset命令一起使用,它将清除临时区域;它会将头指针重置为特定提交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选项重置。

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

HEAD is now at 5776472 Removed executable binary

  git reset命令成功,它将从暂存区还原文件,并删除对文件所做的任何本地更改。

[jerry@CentOS src]$ git status -s
Git status is showing that the file has been reverted from the staging area.

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

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