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
    
    注意 -我们可以在提交之前执行所有这些操作。
  • 从暂存区中删除更改

    我们已经看到,当我们执行添加(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
    
  • 使用Git重置移动HEAD指针

    进行少量更改后,您可以决定删除这些更改。git reset命令用于重置或还原更改。我们可以执行三种不同类型的重置操作。
    下图显示了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命令还显示,重置操作也删除了本地更改。