Git reset

本文出处:http://robinnagpal.wordpress.com/2012/08/18/git-reset/

Git 让我们能够处理历史版本,其中之一就是 git reset 命令。git reset 有许多不同的参数,能够实现以下功能:

  1. 我们想让文件一直,但是减少提交的次数;
  2. 让工作目录处理一个特定的版本;
  3. 移除或者丢弃先前的提交。

为了达到以上目的,git 提供了 reset 命令,以及一些特定的参数,例如 -soft,-mixed 和 -hard。

让我们继续我们前面的例子,以便理解上面所说的内容。我们在版本库中有四个文件:a.txt、b.txt、c.txt 和 d.txt。现在我们修改一下 d.txt 的内容:

echo \"Commit 4 in branch 1:before reset\" >> d.txt

如果我们看看文件内容,应该是如下所示:

cat d.txt
Commit 2 in branch 2
Commit 3 in branch 2
Commit 4 in branch 1:before reset

现在我们创建另外一个文件 e.txt:

echo \"Commit 4 in branch 1:before reset\" >> e.txt

再来看看内容:

cat e.txt
Commit 4 in branch 1:before reset

我们的仓库应该如下所示:

然后我们将这些修改添加到 index:

git add .

接下来,我们开始一个个尝试 git reset 的参数。

  1. git reset –soft HEAD^:这个命令将 HEAD 移动到上一次提交。我们也可以使用 HEAD~2 或者 HEAD~3,这取决于我们我们希望将 HEAD 移动到哪里。执行该命令之后,我们的仓库应该是这样的:

    从这里我们可以看到,我们的修改依然在 index 中,只是 HEAD 指针指向了先前的提交。另外,所有文件的内容也会和之前的一样,例如,如果我们输出 b.txt:

    cat b.txt
    Commit 2 in branch 2
    Commit 3 in branch 2
    Commit 4 in branch 1:before reset
  2. git reset –mixed HEAD^:这条命令将 HEAD 指针移动到上一次提交,并且将 index 修改为先前提交的内容:
    git reset --mixed HEAD^
    Unstaged changes after reset:
    M    d.txt

    因此我们的版本库应该是这样的:

    红色的点代表没有添加的修改。我们来试试 status 命令:

    git status
    On branch master
    Changes not staged for commit:
       (use "git add <file>..." to update what will be committed)
       (use "git checkout -- <file>..." to discard changes in working directory)
    
        modified:   d.txt
    
     Untracked files:
       (use "git add <file>..." to include in what will be committed)
    
        e.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
  3. git reset –hard HEAD^:这条命令会移动 HEAD 指针到先前的版本,并且移除所有修改,将工作目录修改为移动到的那个版本的状态。这本例中也就是上一个版本。该命令之后,版本库应该是:

    这条命令是不可撤销的,你会丢失 index 中所有修改。

Leave a Reply