犯错是人.因此,每个VCS都提供了一个功能,可以将错误修复到某一点. Git提供了一个功能,我们可以使用它来撤消对本地存储库所做的修改.
假设用户不小心对其本地存储库进行了一些更改,然后想要撤消这些更改.在这种情况下,还原操作起着重要作用.
还原未提交的更改
让我们假设Jerry意外修改来自本地存储库的文件.但他想撤消他的修改.要处理这种情况,我们可以使用 git checkout 命令.我们可以使用此命令恢复文件的内容.
[jerry@CentOS src]$ pwd/home/jerry/jerry_repo/project/src[jerry@CentOS src]$ git status -sM 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 -1Makefilestring_operations.c[tom@CentOS src]$ rm string_operations.c[tom@CentOS src]$ ls -1Makefile[tom@CentOS src]$ git status -sD string_operations.c
Git在文件名前显示字母 D .这表示该文件已从本地存储库中删除.
[tom@CentOS src]$ git checkout string_operations.c[tom@CentOS src]$ ls -1Makefilestring_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 -sM 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
使用Git重置移动HEAD指针
进行一些更改后,您可以决定删除这些更改. Git reset命令用于重置或还原更改.我们可以执行三种不同类型的重置操作.
下图显示了Git重置命令的图形表示.
Soft
每个分支都有一个HEAD指针,指向最新的提交.如果我们使用Git reset命令和--soft选项后跟提交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 577647211ed44fe2ae479427a0668a4f12ed71a1Author: Tom CatDate: Wed Sep 11 10:21:20 2013 +0530Removed executable binarycommit 29af9d45947dc044e33d69b9141d8d2dad37cc62Author: Jerry Mouse Date: Wed Sep 11 10:16:25 2013 +0530Added 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 29af9d45947dc044e33d69b9141d8d2dad37cc62Author: Jerry MouseDate: Wed Sep 11 10:16:25 2013 +0530Added compiled binarycommit 94f7b26005f856f1a1b733ad438e97a0cd509c1aAuthor: Jerry Mouse Date: Wed Sep 11 10:08:01 2013 +0530Added Makefile and renamed strings.c to string_operations.c
mixed
使用--mixed选项重置Git会从暂存区域还原那些尚未提交的更改.它仅从暂存区域还原更改.对文件的工作副本所做的实际更改不受影响.默认的Git重置相当于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 577647211ed44fe2ae479427a0668a4f12ed71a1Author: Tom CatDate: Wed Sep 11 10:21:20 2013 +0530Removed executable binary
Jerry修改了一个文件通过在文件开头添加单行注释.
[jerry@CentOS src]$ head -2 string_operations.c/* This line be removed by git reset operation */#include
他使用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..." to unstage)##modified: string_operations.c#
Git状态显示该文件存在于暂存区域中.现在,用 - 硬选项重置HEAD.
[jerry@CentOS src]$ git reset --hard 577647211ed44fe2ae479427a0668a4f12ed71a1HEAD 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命令还显示重置操作也删除了本地更改.