git reset本地常见操作

本文详细介绍了Git中reset命令的基本用法及扩展用法。包括如何通过不同选项改变reset行为,如何查找commit版本,以及如何结合其他命令实现更彻底的回退。


git reset命令用于将当前分支回退到指定的某个版本。

基本用法

git reset [--soft | --mixed | --hard] [commitversion]

详解

该命令可以看做commit命令的取反操作,既然可以向前提交,当然也可以向后回滚。可以像事务一样回滚一次到上一次的位置,也可以回滚到指定的位置。这个位置由commitversion决定,每commit一次都会产生一个commitversion值。

1 --soft,--mixed,--hard这几个选项会改变reset命令的行为模式:
如果用--hard选项,--hard选项在帮助文档中的解释是:Resets the index and working tree. Any changes to tracked files in the working tree since <commit> are discarded.具体来说会执行三个动作:
(1) 替换引用的指向。引用指向新的提交ID
(2) 替换暂存区。替换后,暂存区的内容和引用指向的目录树一致。
(3) 替换工作区。替换后,工作区的内容变得和暂存区一致,也和commitversion所指向的目录树内容相同。
如果用--soft选项,只更改引用的指向,不改变暂存区和工作区。
如果用--mixed或者不给这个选项(两者效果一样),那么当前分支被回滚到指定commitversion,暂存区被重置,但是工作区文件不变。

2 commitversion是指定曾经commit的版本,每次commit都会产生唯一一个commitversion,用于标识本次commit。

(1) 那么怎样找到每次commit的commitversion呢?有两个命令都可以达到这个目标:git log 和git reflog
用法分别是:
git log [--pretty=oneline]
git reflog

两者的区别是:git log查看的日志是相对于当前commitversion之前的所有历史日志,git reflog查看的日志是相对于最后一个commitversion之前的所有历史日志。展开来讲就是,一个是相对历史日志,一个是绝对历史日志。假如你已经reset到某个commitversion了,那么这个时候使用git log只能看到这个commitversion之前的历史日志,看不到之后的历史日志了,但是使用git reflog就可以。

(2) git对离当前版本最近的commitversion提供了快捷方式。
在Git中,用HEAD表示当前版本,也就是最新的提交,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

比如回退到上一个版本:git reset --hard HEAD^

(3) 如果省略commitversion,相当于指定最新版本HEAD,即git reset == git reset --mixed HEAD。引用被指向最新提交版本即HEAD,相当于不改变引用位置;暂存区被替换为最新的HEAD的目录树,相当于当前已add或rm但是未commit的改动被撤出暂存区,可以看做git add的取反操作。


扩展用法

有时工作空间的工程会由开发工具产生一些最新的文件或目录,这些文件或目录是不纳入git版本管理范围内的,所以对于电脑当前的工作空间,有时使用git reset命令在某些操作系统上不一定能完全回退,需要一个额外的操作帮助git回退,这个命令是:
git clean -dfx

用于强制清洗当前工作区不受git管理的文件或目录,帮助git将当前工作区干净的回退到指定commitversion。


### 回退提交的三种方式 `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、付费专栏及课程。

余额充值