登录 |  注册
首页 >  编程测试工具 >  Git 专题学习教程笔记 >  Git修正错误

Git修正错误

Git提供了一个功能,可用于撤消对本地存储库所做的修改。

假设用户意外地对本地存储库进行了一些更改,然后想要撤消这些更改。 在这种情况下,恢复操作起着重要的作用。

恢复未提交的更改

 假设我们不小心修改了本地存储库中的一个文件,此时想撤销这些修改。为了处理这种情况,我们可以使用git checkout命令。可以使用此命令来还原文件的内容。

为了更好的演示,我们首先在 sample/src 目录下创建一个文件:string.py ,其代码如下所示:

#!/usr/bin/python3
var1 = 'Hello World!'
var2 = "Python Programming"
print ("var1[0]: ", var1[0])
print ("var2[1:5]: ", var2[1:5]) # 切片加索引

并使用以下命令将此文件推送到远程存储库:

$ pwd
/D/worksp/sample
Administrator@MY-PC /D/worksp/sample (master)
$ git add src/
Administrator@MY-PC /D/worksp/sample (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD ..." to unstage)
        new file:   src/string.py
Administrator@MY-PC /D/worksp/sample (master)
$ git add src/string.py
Administrator@MY-PC /D/worksp/sample (master)
$ git commit -m "add new file string.py"
[master 44ea8e4] add new file string.py
 1 file changed, 7 insertions(+)
 create mode 100644 src/string.py
Administrator@MY-PC /D/worksp/sample (master)
$ git push origin master
Username for 'http://git.oschina.net': 769728683@qq.com
Password for 'http://769728683@qq.com@git.oschina.net':
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 443 bytes | 0 bytes/s, done.
Total 4 (delta 0), reused 0 (delta 0)

现在,已经将string.py添加到远程存储库中了。

假设我们不小心/或者有心修改了本地存储库中的一个文件。但现在不想要这些修改的内容了,也就是说想要撤销修改。要处理这种情况,那么可以使用git checkout命令。可以使用此命令来还原文件的内容。

$ pwd
/D/worksp/sample
Administrator@MY-PC /D/worksp/sample (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)
        modified:   src/string.py
no changes added to commit (use "git add" and/or "git commit -a")
Administrator@MY-PC /D/worksp/sample (master)
$ git checkout src/string.py
Administrator@MY-PC /D/worksp/sample (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
Administrator@MY-PC /D/worksp/sample (master)
$

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

$ ls -l
total 1
-rw-r--r--    1 Administ Administ       57 Jul  7 05:37 README.md
drwxr-xr-x    1 Administ Administ        0 Jul 10 21:16 src
Administrator@MY-PC /D/worksp/sample (master)
$ cd src/
Administrator@MY-PC /D/worksp/sample/src (master)
$ ls -l
total 1
-rwxr-xr-x    1 Administ Administ      156 Jul 10 21:16 string.py
Administrator@MY-PC /D/worksp/sample/src (master)
$ rm string.py
Administrator@MY-PC /D/worksp/sample/src (master)
$ ls -l
total 0
Administrator@MY-PC /D/worksp/sample/src (master)
$ git status -s
 D string.py

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

$ git checkout string.py
Administrator@MY-PC /D/worksp/sample/src (master)
$ ls -l
total 1
-rwxr-xr-x    1 Administ Administ      156 Jul 10 21:24 string.py
Administrator@MY-PC /D/worksp/sample/src (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

注意:可以在提交操作之前执行这些操作。

删除分段区域的更改

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

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

让我们假设从本地存储库修改一个文件。 如果查看此文件的状态,它将显示该文件已修改但未添加到暂存区域。

$ pwd
/D/worksp/sample/src
Administrator@MY-PC /D/worksp/sample/src (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)
        modified:   string.py
no changes added to commit (use "git add" and/or "git commit -a")
Administrator@MY-PC /D/worksp/sample/src (master)
$ git add string.py

Git状态显示该文件存在于暂存区域,现在使用git checkout命令恢复该文件,并查看还原文件的状态。

$ git checkout head -- string.py
Administrator@MY-PC /D/worksp/sample/src (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

用Git复位移动头指针

经过少量更改后,可以决定删除这些更改。 git reset命令用于复位或恢复更改。 我们可以执行三种不同类型的复位操作。

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

git reset命令之前

git1.jpg

git reset命令之后:

git1.jpg

1 —soft选项

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

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

$ pwd
/D/worksp/sample
Administrator@MY-PC /D/worksp/sample (master)
$ cat .git/refs/heads/master
44ea8e47307b47c9a80b44360e09f973e79312b0

现在,查看最新前两个的提交ID,最近一次ID将与上述提交ID一致。

$ git log -2
commit 44ea8e47307b47c9a80b44360e09f973e79312b0
Author: maxsu 
Date:   Mon Jul 10 21:09:35 2017 +0800
    add new file string.py
commit 7d8162db36723b8523c56ad658a07808ae7fb64c
Author: minsu 
Date:   Mon Jul 10 17:51:11 2017 -0700
    remove/delete module.py
Administrator@MY-PC /D/worksp/sample (master)
$

下面我们重置HEAD指针。

现在,只需将HEAD指针重新设置一个位置。现在查看.git/refs/heads/master文件的内容。

Administrator@MY-PC /D/worksp/sample (master)
$ cat .git/refs/heads/master
7d8162db36723b8523c56ad658a07808ae7fb64c

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

$ git log -2
commit 7d8162db36723b8523c56ad658a07808ae7fb64c
Author: minsu 
Date:   Mon Jul 10 17:51:11 2017 -0700
    remove/delete module.py
commit 6bdbf8219c60d8da9ad352c23628600faaefbe13
Author: maxsu 
Date:   Mon Jul 10 20:34:28 2017 +0800
    renamed main.py to module.py

⒉ mixed选项

使用--mixed选项的Git重置将从尚未提交的暂存区域还原这些更改。它仅从暂存区域恢复更改。对文件的工作副本进行的实际更改不受影响。 默认Git复位等效于执行git reset - mixed。

⒊ hard选项

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

让我们查看提交ID。

Administrator@MY-PC /D/worksp/sample (master)
$ pwd
/D/worksp/sample
Administrator@MY-PC /D/worksp/sample (master)
$ git log -1
commit 7d8162db36723b8523c56ad658a07808ae7fb64c
Author: minsu 
Date:   Mon Jul 10 17:51:11 2017 -0700
    remove/delete module.py

通过在文件开头添加单行注释来修改文件或者往文件里添加其它代码。

$ head -2 src/string.py
#!/usr/bin/python3
Administrator@MY-PC /D/worksp/sample (master)
$ git status -s
 M src/string.py

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

$ git add src/string.py
Administrator@MY-PC /D/worksp/sample (master)
$ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commit each, respectively.
  (use "git pull" to merge the remote branch into yours)
Changes to be committed:
  (use "git reset HEAD ..." to unstage)
        modified:   src/string.py

Git状态显示该文件存在于暂存区域中。 现在,重置HEAD与--hard选项。

$ git reset --hard 7d8162db36723b8523c56ad658a07808ae7fb64c
HEAD is now at 7d8162d remove/delete module.py
Administrator@MY-PC /D/worksp/sample (master)

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

Administrator@MY-PC /D/worksp/sample (master)
$ git status -s

Git状态显示该文件已从暂存区域还原,当前恢复到了删除 moudle.py 时的版本了。

上一篇: Git提交更改文件记录
下一篇: Git分支中冲突的处理
推荐文章
  • 在IntelliJIDEA中,要根据数据库表直接生成对应的DataObject(DO)类,可以利用其内置的 DatabaseTools 功能,特别是其中的 JPABuddy插件 或者 ReverseEngineering(逆向工程) 功能。这里提供两种方法供您参考:方法一:使用JPABuddy插件J
  • 说到分支管理模型,令人最为熟悉的莫过于TrunkBased和GitFlow。TrunkBased模型是持续集成思想所崇尚的工作方式,它由单个master分支和许多release分支组成,每个release分支在特定版本的提交点上从master分支创建出来,用来进行上线部署和Hotfix。在Trunk
  • 在IntelliJIDEA(简称IDEA)中,如果你想避免导入星号(*)的方式引入包中的所有类,可以在设置中调整IDE的行为,使其遵循更严格的代码风格规范。虽然Java允许使用import*形式的静态导入(例如importstaticjava.util.Arrays.*;),但通常建议尽量明确导入所
  • 随着软件开发项目越来越庞大,代码管理的难度也越来越大,特别是在团队协作中。Git作为目前最流行的代码版本控制工具之一,可以帮助我们高效地管理代码版本,并且很容易集成到团队的工作流中。在Git中,我们经常会遇到需要将新增的文件夹排除在Git的库之外的情况。这些文件夹可能是临时生成的文件夹、缓存文件夹或
  • 1.迁移已有的Gitlab代码仓库存储目录gitlab通过rpm包安装后,默认存储位置在/var/opt/gitlab/git-data/repositories,通常需要更改此路径到单独的一个分区来存储仓库的数据。例如,我这里把数据存放到/data/gitlab目录下,创建/data/gitlab
  • 编辑辑/etc/gitlab/gitlab.rb修改如下:external_url "http://gitlab.example.com"例如本人设置的如下:external_url 'http://gitlab.yukx.com'设置完成之后:重置配置sudo gitlab-ctl reconfi
学习大纲