使用Git重置移动HEAD指针
进行少量更改后,您可以决定删除这些更改。git reset
命令用于重置或还原更改。我们可以执行三种不同类型的重置操作。
下图显示了Git reset命令的图示。
soft
每个分支都有一个HEAD指针,该指针指向最新的提交。如果我们使用带有--soft选项和提交ID的git reset
命令,那么它将仅重置HEAD指针而不会破坏任何内容。 .git/refs/heads/master文件存储HEAD指针的提交ID。我们可以使用git log -1
命令验证它。
[jerry@CentOS project]$ cat .git/refs/heads/master
577647211ed44fe2ae479427a0668a4f12ed71a1
现在,查看最新的提交ID,该ID将与上述提交ID匹配。
[jerry@CentOS project]$ git log -2
上面的命令将产生以下结果。
commit 577647211ed44fe2ae479427a0668a4f12ed71a1
Author: Tom Cat <tom@jc2182.com>
Date: Wed Sep 11 10:21:20 2013 +0530
Removed executable binary
commit 29af9d45947dc044e33d69b9141d8d2dad37cc62
Author: Jerry Mouse <jerry@jc2182.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@jc2182.com>
Date: Wed Sep 11 10:16:25 2013 +0530
Added compiled binary
commit 94f7b26005f856f1a1b733ad438e97a0cd509c1a
Author: Jerry Mouse ≪jerry@jc2182.com>
Date: Wed Sep 11 10:08:01 2013 +0530
Added Makefile and renamed strings.c to string_operations.c
mixed
使用--mixed选项进行Git重置可还原暂存区域中尚未提交的更改。它仅还原暂存区域中的更改。对文件的工作副本所做的实际更改不受影响。默认的git reset
等同于git reset --fixed
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@jc2182.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命令还显示,重置操作也删除了本地更改。