Git Reset简介

本文编辑整理自:http://guibin.iteye.com/blog/1014369
http://web.mit.edu/~mkgray/project/silk/root/afs/sipb/project/git/git-doc/git-reset.html

1、基本篇

在git的一般使用中,如果发现错误的将不同阶段的文件add进入index之后,想回退取消,则可以使用命令:git reset HEAD …,同时git add完毕之后,git也会做相应的提示,比如:

Changes to be committed: 
  (use "git reset HEAD <file>..." to unstage)  
   new file:   Test.scala 

2、什么是git reset:

git reset [–hard|soft|mixed|merge|keep] [或HEAD]:将当前的分支重设(reset)到指定的或者HEAD(默认,如果不显示指定commit,默认是HEAD,即最新的一次提交),并且根据[mode]有可能更新index和working directory。

mode的取值可以是hard、soft、mixed、merged、keep。下面来详细说明每种模式的意义和效果。

A).–hard

重设(reset) index和working directory,自从以来在working directory中的任何改变都被丢弃,并把HEAD指向。
具体一个例子,假设有三个commit, git st:

commit3: add test3.c
commit2: add test2.c
commit1: add test1.c

执行git reset –hard HEAD~1后,
显示:HEAD is now at commit2,运行git log
commit2: add test2.c
commit1: add test1.c

运行git status, 没有任何变化


B). –soft:

index和working directory中的内容不作任何改变,仅仅把HEAD指向。这个模式的效果是,执行完毕后,自从以来的所有改变都会显示在git status的”Changes to be committed”中。
具体一个例子,假设有三个commit, git status:

commit3: add test3.c
commit2: add test2.c
commit1: add test1.c

执行git reset –soft(默认) HEAD~1后,运行git log

commit2: add test2.c
commit1: add test1.c

运行git status, 则test3.c处于暂存区,处于准备提交状态。即此时git commit就会提交它。


C). –mixed:

仅reset index,但是不reset working directory。这个模式是默认模式,它的效果是,working directory中文件的修改都会被保留,不会丢弃,但是也不会被标记成”Changes to be committed”,但是会打出什么还未被更新的报告。报告如下:

Unstaged changes after reset: 
M Test.Scala 
M test.txt

D). –merge和–keep用的不多

### 回退提交的三种方式 `git reset` 是 Git 中用于回退提交的重要命令,可以根据不同需求选择不同的参数进行操作。以下是几种常见的使用方式: #### 1. 使用 `git reset --soft` 该命令会将 HEAD 指针移动到指定的提交,但保留工作区和暂存区的内容不变。这意味着你可以重新提交这些更改。 例如,撤销最近一次提交并保留更改: ```bash git reset --soft HEAD^ ``` 此操作适用于发现最新提交中存在错误但仍希望保留更改以便重新提交的情况 [^2]。 #### 2. 使用 `git reset --mixed` 或 `git reset` 默认情况下,`git reset` 等同于 `git reset --mixed`,它会将 HEAD 指针移动到指定提交,并清空暂存区,但不会影响工作区的内容。 例如,撤销最近一次提交并清空暂存区: ```bash git reset HEAD^ ``` 此操作适用于需要重新添加文件到暂存区后再提交的情况 [^1]。 #### 3. 使用 `git reset --hard` 该命令会将 HEAD 指针移动到指定提交,并且会丢弃工作区和暂存区的所有更改。这是最彻底的回退方式,但需要注意,这会导致未提交的更改丢失。 例如,强制回退到上一次提交并丢弃所有更改: ```bash git reset --hard HEAD^ ``` 此操作适用于需要完全恢复到某个历史状态的情况,但需谨慎使用,因为会永久删除未提交的更改 [^5]。 ### 远程仓库的强制推送 当本地已经通过 `git reset` 回退了提交,而远程仓库仍然保留着旧的历史记录时,需要通过强制推送来更新远程仓库。 例如,强制推送本地更改到远程分支: ```bash git push origin <branch-name> -f ``` 此操作适用于需要同步远程仓库与本地更改的情况,但同样需要谨慎使用,因为它会影响其他开发者的工作 [^5]。 ### 示例代码 以下是一个完整的示例,展示如何使用 `git reset` 回退提交并强制推送到远程仓库: ```bash # 查看提交历史 git log # 回退到上一次提交并丢弃所有更改 git reset --hard HEAD^ # 强制推送更改到远程仓库 git push origin U1101_6113_GMS -f ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值