git重置或还原已提交的代码--git reset和git revert

本文介绍了在多人协作中遇到代码错误时如何使用git reset和git revert进行回退操作。git reset通过修改HEAD位置,使HEAD指向历史版本,常用于直接回退到某版本并丢弃后续提交。而git revert则创建一个新的提交来撤销指定提交的更改,适用于保留历史记录的情况。需要注意,git revert不应用于merge操作产生的commit_id。

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

背景

在多人协作时,对代码的管理,难免会出现错误。如果出现错误,我们分析下来是要进行一些回退操作,那么解决办法有如下两种:
git reset
git revert

两种方式

git reset

在使用git reset命令前,需要先了解一个概念:HEAD
HEAD 是当前分支引用的指针,它总是指向该分支上的最后一次提交。这表示 HEAD 将是下一次提交的父结点。
通常,理解 HEAD 的最简方式,就是将它看做 你的上一次提交 的快照。
查看快照的操作如下:
下例就显示了 HEAD 快照实际的目录列表,以及其中每个文件的 SHA-1 校验和

git cat-file -p HEAD
git ls-tree -r HEAD

git reset的作用:就是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本。
常用命令:

git reset HEAD --file
回退暂存区里的某个文件,回退到当前版本工作区状态

git reset –-soft 目标版本号 
可以把版本库上的提交回退到暂存区,修改记录保留

git reset –-mixed 目标版本号 
可以把版本库上的提交回退到工作区,修改记录保留

git reset –-hard  
可以把版本库上的提交彻底回退,修改的记录全部revert。

适用场景:
如果我们想直接回到之前的某一版本,但是不想保留该目标版本后面的版本,就可以用这种方法。

分支操作者, 操作如下:

git checkout <branch_name>
# 切换到目标分支上

git reset --hard <commit_id>
# 本地目标分支上重置代码到上面指定的commit_id, 
# 注意:该commit_id之后的所有提交都会丢失。
# 执行完后,HEAD的位置已经在该commit_id的位置

git push -f	 等同于  git push --force
# 在上一条命令中,已经在本地分支中reset好,接下来让远程分支也有相同的效果,可以直接运行这条命令。
# 执行后,可以去代码托管网站查看

git push -f origin <branch_name>
# 如果目标分支和远程分支没有关联上,可以用这条命令,指出远程分支

其他分支使用者

git checkout <branch_name>
# 切换到目标分支上

git reset --hard origin/branch_name
# 这步就是其他同事把自己本地branch_name重置到与origin/branch_name一致,
# 注意
# --hard参数会丢弃超过origin的所有commit
# 如果不想丢弃可以用 --mixed 或 --soft,具体用哪个根据自己情况来

git revert

Git的 “还原” 操作。
Git 给你一个生成一个新提交的选项,提交将会撤消一个已存在提交的所有修改。

适用场景:
如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法。

git revert -n <commit_id>
# 本地目标分支撤销指定的commit_id
# 注意:做完上面的操作后,可能会出现冲突,需要先解决冲突,在git add,
# 然后使用 git commit 提交

git push
# 在上一条命令中,已经在本地分支中revert好,接下来让远程分支也有相同的效果,可以直接运行这条命令。
# 执行后,可以去代码托管网站查看

注意,git revert后填的commit_id不能是 merge操作产生的commit_id.

### Git Reset --Hard Git Revert 的区别 Git提供了两种主要方式来撤销更改:`git reset --hard``git revert`。这两种方法虽然都能达到撤消变更的效果,但在实际应用中有显著差异。 #### `git reset --hard` 此命令会重置工作目录以及暂存区到最近的一次提交状态,并且任何未提交的工作都会丢失。如果指定了特定的提交哈希,则不仅当前分支尖端会被设置为目标提交,而且索引也会更新以匹配该提交的内容[^1]。这意味着: - 所有的本地修改都将被丢弃; - 如果目标是一个较早的提交,那么之后的所有提交都将从历史记录中消失; 对于团队协作项目而言,使用`git reset --hard`应当格外谨慎,因为它实际上改变了项目的提交历史,在公共分支上执行可能会给其他开发者带来麻烦。 ```bash # 将HEAD指向最新一次提交并恢复工作树至该状态 git reset --hard HEAD # 者指定一个具体的提交ID作为新起点 git reset --hard <commit-hash> ``` #### `git revert` 相比之下,`git revert`创建一个新的提交用于逆转之前某次提交所带来的变化。这种方式不会影响现有的提交历史——它只是简单地添加了一个新的提交,其内容恰好与想要取消的那个提交相反,从而实现逻辑上的“撤销”。这使得在未来合并旧版本时更加安全可靠[^2]。 ```bash # 创建一条新的提交用来反转最后一次提交所做的改动 git revert HEAD # 可以为任意过去的提交生成对应的反向提交 git revert <commit-hash> ``` #### 正确使用场景 当需要完全移除一些尚未推送到远程仓库中的错误提交时,可以选择`git reset --hard`。然而,在大多数情况下特别是面对已经共享出去的历史记录时,推荐采用更为保守的做法即通过`git revert`来进行修正,这样既保留了完整的开发轨迹又避免了潜在冲突的风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值