首页 Git Git reset

Git reset

0 1.7K

本文出处: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 的参数。

第一,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

第二,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")

第三,git reset –hard HEAD^:这条命令会移动 HEAD 指针到先前的版本,并且移除所有修改,将工作目录修改为移动到的那个版本的状态。这本例中也就是上一个版本。该命令之后,版本库应该是:

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

发表评论

关于我

devbean

devbean

豆子,生于山东,定居南京。毕业于山东大学软件工程专业。软件工程师,主要关注于 Qt、Angular 等界面技术。

主题 Salodad 由 PenciDesign 提供 | 静态文件存储由又拍云存储提供 | 苏ICP备13027999号-2