git 回退(reset)、反做(revert):撤回命令总结

git撤销及回滚命令

  1. 工作区:指在自己本地分支开发,未进行 git add 操作之前。
  2. 暂存区:执行过 git add 操作之后,但是为执行 git commit 操作。
  3. 本地分支:执行过 git commit 操作,但是未执行 git push 操作。
  4. 远程分支:执行过 git push 操作。

git reset

在这里插入图片描述

分三种场景
  • 暂存区(执行了 git add 操作 未执行 git commit 操作)
   git reset HEAD .       //撤回所有 add 的文件
   git reset HEAD  文件名        // 撤回指定的文件,这个命令只改变暂存区代码,并不影响其他区域代码。
  • 尚未远程推送(还未git push操作),只保存在本地仓库
  git log        //查询提交日志 找到自己需要回滚的 版本号(commit_id)
  // 以下三种方式
  git reset --hard commit_id     //撤销commit提交以及代码的修改
  git reset --hard HEAD^    // 回退到最近一次的提交
  git reset commit_id     // 仅仅撤销本地仓库的commit提交,代码不变

git reset 的几种模式
git reset主要有–soft –mixed –hard 三种方式
HEAD^ 的意思是上一个版本,也可以写成 HEAD~1
如果你进行了2次commit,想都撤回,可以使用 HEAD~2
–mixed常用,默认这种方式)
不删除工作空间改动代码,撤销commit,并且撤销(git add .) 操作
这个为默认参数,git reset --mixed HEAD^git reset HEAD^ 效果是一样的。
–soft
不删除工作空间改动代码,撤销commit,不撤销git add .
–hard慎用
删除工作空间改动代码,撤销commit,撤销git add .

如果 commit 注释写错了,我们可以使用 git commit --amend -m "备注" 既可以覆盖上一次的备注信息。

  • 已经远程推送(已经git push操作了),远程仓库已经保存
    第三种场景进行撤回的命令和第二个场景撤回命令一样。此时如果用“git push”会报错,因为我们本地库HEAD指向的版本比远程库的要旧, 需要进行 git push -f origin branchName 操作。

注意:一定要注意回滚指定版本号,不应该是最新提交的版本号,而应该是最新一次commit之前的版本号,否则无法进行回滚的。

git revert

git revert是用于“反做”某一个版本,以达到撤销该版本的修改的目的。

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

你在当前分支上做了几次提交,突然发现放错了分支,这几个提交本应该放到另一个分支。

 新建一个 feature 分支,指向当前最新的提交
 注意,这时依然停留在当前分支
 git branch feature

 切换到这几次提交之前的状态
 git reset --hard [当前分支此前的最后一次提交]

 切换到 feature 分支
 git checkout feature

参考:
http://www.ruanyifeng.com/blog/2019/12/git-undo.html
https://blog.csdn.net/yxlshk/article/details/79944535
https://www.cnblogs.com/ming-blogs/p/13218420.html

### 如何撤回已推送至 Git 远程仓库的提交 当需要撤销已经推送到远程仓库的提交时,可以采用不同的策略来处理这个问题。以下是几种常见的方式: #### 使用 `git revert` 命令安全地撤销更改 如果希望保留历史记录中的每一次变更,并且只是简单地取消某次特定提交的效果而不影响其他任何东西,则应该使用 `revert` 方法。 ```bash # 找到要撤销的那个commit id (可以通过 git log 查看) git log # 创建一个新的提交来逆向应用指定提交所的修改 git revert <commit-id> ``` 这会生成一条新的提交记录,其作用正好相于被撤销的那一项,从而达到逻辑上的删除效果[^1]。 #### 利用 `reset` 和强制推送重置分支指针位置 对于那些确实不再需要某些提交的情况——比如误操作引入了敏感数据或者其他不应该存在的改动——则可以选择更激进的方法:通过硬重置当前HEAD指向的位置回到某个较早的状态再强行更新远程版本库。 请注意此方法可能会覆盖掉他人基于最新状态出的工作成果,在团队协作环境中应当谨慎行事! ```bash # 将工作区恢复到最后一次成功的push之后的状态(假设此时还没有其他人在此基础上继续开发) git fetch origin main:tempbranch && git reset --hard tempbranch~N # N表示倒数第几个提交 rm -rf .git/refs/remotes/origin/tempbranch # 强制推送改变后的本地master分支代替远端同名分支 git push --force-with-lease origin HEAD:main ``` 上述命令序列首先创建了一个临时分支用于保存最新的上游变动作为参照点;接着利用相对引用方式定位目标节点并执行硬重设动作;最后一步则是带着租约机制的安全版强制推送指令,它可以在一定程度上防止意外破坏他人的进度[^2]。 #### 清除最近的一条或多条提交而无需新提交 还有一种情况是仅仅想移除最顶端的一个或多个尚未共享给别人的提交对象,这时可以直接运用带有参数 `-n` 的 `reset` 来实现目的,该选项允许用户指定向前移动多少个提交。 ```bash # 取消最后一次提交但保持索引不变(即暂存区域) git reset HEAD~ # 或者完全丢弃这些变化连带它们所涉及的所有文件差异 git reset --hard HEAD~ ``` 以上两种情形都不会产生额外的历史条目,适用于个人修正错误的情形下[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值