git reset

本文详细介绍了Git中reset命令的使用方法及不同选项(--hard, --soft, --mixed)的影响。通过实例解释了如何撤销错误的提交并恢复工作目录的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文编辑整理自:http://guibin.iteye.com/blog/1014369 http://web.mit.edu/~mkgray/project/silk/root/afs/sipb/project/git/git-doc/git-reset.html
在git的一般使用中,如果发现错误的将不想staging的文件add进入index之后,想回退取消,则可以使用命令:git reset HEAD <file>...,同时git add完毕之后,git也会做相应的提示,比如:
引用
<div style="line-height:25px"><span class="com" style="color:#8800;line-height:25px;"># Changes to be committed: </span></div><div style="line-height:25px"><span class="com" style="color:#8800;line-height:25px;">#   (use "git reset HEAD <file>..." to unstage) </span></div><div style="line-height:25px"><span class="com" style="color:#8800;line-height:25px;"># </span></div><div style="line-height:25px"><span class="com" style="color:#8800;line-height:25px;">#</span><span style="line-height:25px; white-space:pre"><span class="com" style="color:#8800;line-height:25px;"> </span></span><span class="com" style="color:#8800;line-height:25px;">new file:   Test.scala </span></div>
git reset [ --hard|soft|mixed|merge|keep]  [<commit> HEAD]:将当前的分支重设(reset)到指定的<commit>或者HEAD(默认,如果不显示指定commit,默认是HEAD,即最新的一次提交),并且根据[mode]有可能更新index和working directory。mode的取值可以是 hard、soft、mixed、merged、keep。下面来详细说明每种模式的意义和效果。
A).  --hard:重设(reset) index和working directory,自从<commit>以来在working directory中的任何改变都被丢弃,并把HEAD指向<commit>。 
具体一个例子,假设有三个commit, git st:
<div style="line-height:22px"><span style="color:#3366ff;line-height:22px"><span class="pln" style="color:#000000;line-height:25px;">commit3</span><span class="pun" style="color:#66660;line-height:25px;">:</span><span class="pln" style="color:#000000;line-height:25px;"> add test3</span><span class="pun" style="color:#66660;line-height:25px;">.</span><span class="pln" style="color:#000000;line-height:25px;">c</span></span></div><div style="line-height:22px"><span style="color:#3366ff;line-height:22px"><span class="pln" style="color:#000000;line-height:25px;">commit2</span><span class="pun" style="color:#66660;line-height:25px;">:</span><span class="pln" style="color:#000000;line-height:25px;"> add test2</span><span class="pun" style="color:#66660;line-height:25px;">.</span><span class="pln" style="color:#000000;line-height:25px;">c</span></span></div><div style="line-height:22px"><span style="color:#3366ff;line-height:22px"><span class="pln" style="color:#000000;line-height:25px;">commit1</span><span class="pun" style="color:#66660;line-height:25px;">:</span><span class="pln" style="color:#000000;line-height:25px;"> add test1</span><span class="pun" style="color:#66660;line-height:25px;">.</span><span class="pln" style="color:#000000;line-height:25px;">c</span></span></div>
执行git reset --hard HEAD~1后,
显示:HEAD is now at commit2,运行git log
<div style="line-height:25px"><span style="color:#3366ff;line-height:25px"><span class="pln" style="color:#000000;line-height:25px;">commit2</span><span class="pun" style="color:#66660;line-height:25px;">:</span><span class="pln" style="color:#000000;line-height:25px;"> add test2</span><span class="pun" style="color:#66660;line-height:25px;">.</span><span class="pln" style="color:#000000;line-height:25px;">c</span></span></div><div style="line-height:25px"><span style="color:#3366ff;line-height:25px"><span class="pln" style="color:#000000;line-height:25px;">commit1</span><span class="pun" style="color:#66660;line-height:25px;">:</span><span class="pln" style="color:#000000;line-height:25px;"> add test1</span><span class="pun" style="color:#66660;line-height:25px;">.</span><span class="pln" style="color:#000000;line-height:25px;">c</span></span></div>
运行git st, 没有任何变化
B)--soft:index和working directory中的内容不作任何改变,仅仅把HEAD指向<commit>。这个模式的效果是,执行完毕后,自从<commit>以来的所有改变都会显示在git status的"Changes to be committed"中。 
具体一个例子,假设有三个commit, git st:
<div style="line-height:25px"><span style="color:#3366ff;line-height:25px"><span class="pln" style="color:#000000;line-height:25px;">commit3</span><span class="pun" style="color:#66660;line-height:25px;">:</span><span class="pln" style="color:#000000;line-height:25px;"> add test3</span><span class="pun" style="color:#66660;line-height:25px;">.</span><span class="pln" style="color:#000000;line-height:25px;">c</span></span></div><div style="line-height:25px"><span style="color:#3366ff;line-height:25px"><span class="pln" style="color:#000000;line-height:25px;">commit2</span><span class="pun" style="color:#66660;line-height:25px;">:</span><span class="pln" style="color:#000000;line-height:25px;"> add test2</span><span class="pun" style="color:#66660;line-height:25px;">.</span><span class="pln" style="color:#000000;line-height:25px;">c</span></span></div><div style="line-height:25px"><span style="color:#3366ff;line-height:25px"><span class="pln" style="color:#000000;line-height:25px;">commit1</span><span class="pun" style="color:#66660;line-height:25px;">:</span><span class="pln" style="color:#000000;line-height:25px;"> add test1</span><span class="pun" style="color:#66660;line-height:25px;">.</span><span class="pln" style="color:#000000;line-height:25px;">c</span></span></div>
执行git reset --soft(默认) HEAD~1后,运行git log
<div style="line-height:25px"><span style="color:#3366ff;line-height:25px"><span class="pln" style="color:#000000;line-height:25px;">commit2</span><span class="pun" style="color:#66660;line-height:25px;">:</span><span class="pln" style="color:#000000;line-height:25px;"> add test2</span><span class="pun" style="color:#66660;line-height:25px;">.</span><span class="pln" style="color:#000000;line-height:25px;">c</span></span></div><div style="line-height:25px"><span style="color:#3366ff;line-height:25px"><span class="pln" style="color:#000000;line-height:25px;">commit1</span><span class="pun" style="color:#66660;line-height:25px;">:</span><span class="pln" style="color:#000000;line-height:25px;"> add test1</span><span class="pun" style="color:#66660;line-height:25px;">.</span><span class="pln" style="color:#000000;line-height:25px;">c</span></span></div>
运行git status, 则test3.c处于暂存区,处于准备提交状态。即此时git commit就会提交它。
  在使用git进行协作开发时,我们经常需要将自己的修改生成patch发给被人,但是在修改代码的过程中我们进行了很多次的提交,如何生成从最初的代码状态到最终代码状态的patch呢?下面要介绍的功能是应对这中情况。
现假设我们git软件仓库中的分支情况如下:
a-->b-->c
也就是说我们的代码从状态a修改到状态b,进行一次提交,然后再修改到状态c,进行一次提交。这时我们已经肯定由a到c的修改是正确的,不再需要状态b了,并且要把从a到c的变化生成一个patch发送给别人。如果直接打包的话会生成两个path,那么如何生成一个patch呢,这时就需要git-reset命令。
首先给状态a创建一个tag,假设名称为A,然后执行
git-reset --soft A
这样我们的软件仓库就变为
a
状态b和状态c都已经被删除了,但是当前的代码并没有被改变,还是状态c的代码,这时我们做一次提交,软件仓库变成下面的样子:
a-->d
状态d和状态c所对应的代码是完全相同的,只是名字不同。现在就可以生成一个patch打包发给别人了
C)--mixed:仅reset index,但是不reset working directory。这个模式是默认模式,即当不显示告知git reset模式时,会使用mixed模式。这个模式的效果是,working directory中文件的修改都会被保留,不会丢弃, 但是也不会被标记成"Changes to be committed",但是会打出什么还未被更新的报告。报告如下: 
引用
Unstaged changes after reset: 
M Test.Scala 
M test.txt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值