本文出处:http://robinnagpal.wordpress.com/2012/08/18/git-reset/
Git 让我们能够处理历史版本,其中之一就是 git reset 命令。git reset 有许多不同的参数,能够实现以下功能:
- 我们想让文件一直,但是减少提交的次数;
- 让工作目录处理一个特定的版本;
- 移除或者丢弃先前的提交。
为了达到以上目的,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 中所有修改。