git revert 一次性回退多个提交

转载:https://blog.youkuaiyun.com/qq_35008279/article/details/86316819

  1. git log 查看当前状态

可以看到我当前状态有四个提交,最初的提交 + 三次提交。现在想用git revert回退这三次提交,但是我们知道git revert是用一次新的提交回退之前的提交,所以我回退三次,就会有三个新的提交,但是我又想只增加一个新的提交,继续看。

  1. git revert回退依次三个提交

可以看到执行完三次回退后,又新增了三次提交,现在想将这三次提交合并成一个。

  1. git rebase合并多次commit
    我们想将最近的三个提交合并,首先需要如下命令:

其中,-i 的参数是不需要合并的 commit 的 hash 值,这里即从当前时间往前推的第四个提交, 接着我们就进入到 vi 的编辑模式。

可以看到其中分为两个部分,上方未注释的部分是填写要执行的指令,而下方注释的部分则是指令的提示说明。指令部分中由 前方的命令名称、commit hash 和 commit message 组成。

当前我们只要知道两个命令: pick 和 squash

pick 的意思是要会执行这个 commit

squash 的意思是这个 commit 会被合并到前一个commit

我们将 9ee35f2 和 5eb5678 这两个 commit 前方的命令改成 squash 或 s,然后输入:wq以保存并退出

这时我们会看到 commit message 的编辑界面

其中, 非注释部分就是三次的 commit message, 我们要做的就是将这三个修改成一个新的 commit message。

输入wq保存并推出, 再次输入git log查看 commit 历史信息,你会发现这三个 commit 已经合并了。

然后 push 就好啦~

参考:「Git」合并多个 Commit
Git: Allow-empty When Squashing

<think>我们正在解决Git版本控制问题。用户希望撤销上一次提交并恢复到之前的状态。根据引用[1]中的信息,我们有两个主要命令:`gitrevert`和`gitreset`。用户提到“撤销上一次代码提交并恢复到之前的状态”,并且具体提到“gitrevert上一次提交的代码”。但是,我们需要明确用户的具体需求:1.如果用户希望保留提交历史,并且添加一个新的提交来撤销上一次提交(即“反转”上一次的修改),则使用`gitrevert`。-例如:`gitrevertHEAD`#撤销最近一次提交2.如果用户希望彻底删除上一次提交(以及之后的所有提交),将分支回退到上一次提交之前的状态,则使用`gitreset`。-例如:`gitreset--hardHEAD~1`#彻底删除最近一次提交,并重置工作区和暂存区到上一次提交的状态但是,用户明确提到了“gitrevert”,所以我们按照revert的方式回答。然而,我们也要注意:用户的数据函数包含`timer`,`currentMacaddr`,`localHost`,`device`。这些可能是代码的一部分,但我们不需要在Git命令中特别处理。因此,我们给出两种方案,并说明区别,让用户选择。步骤:方案一:使用`gitrevert`(安全撤销,保留历史)1.撤销最近一次提交:`gitrevertHEAD`2.这时会创建一个新的提交,这个提交的内容是撤销最近一次提交的修改。3.用户可能需要解决冲突(如果有的话)。4.解决冲突后,继续完成revert:`gitrevert--continue`或者(如果使用默认编辑器,保存退出即可)5.然后推送:`gitpush`(因为添加了新的提交,所以远程分支会前进)方案二:使用`gitreset`(彻底删除提交,谨慎使用)1.回退到上一次提交:`gitreset--hardHEAD~1`2.注意:这个命令会彻底删除最近一次提交,并且重置工作区和暂存区,使其和上一次提交的状态一致。3.如果已经推送到远程,需要强制推送:`gitpush--force`(注意:强制推送会覆盖远程分支,如果其他人也在该分支上工作,会造成问题)根据引用[1]中的提示,我们还要注意如何解决冲突。在revert过程中可能会发生冲突,需要手动解决。所以,回答结构如下:1.区分两种方案的应用场景和风险。2.分别给出操作步骤。3.提示冲突解决方法。4.根据用户的具体情况(是否已推送,是否共享分支)给出建议。另外,引用[3]中的递归遍历数组的方法和问题无关,但引用[2]中关于Vue指令的生命周期也与问题无关,我们只参考引用[1]。现在,我们按照用户要求生成相关问题。相关问题:1.如何撤销多个提交?2.如何撤销已经推送到远程仓库的提交?3.`gitrevert`和`gitreset`的主要区别是什么?注意:用户的问题是关于Git的,所以我们只生成Git相关的问题。最后,按照指令,行内公式用$...$,独立公式用$$...$$。但是这个问题不涉及数学公式,所以可以忽略。回答内容:</think> ### 撤销 Git 提交并恢复状态的完整指南 您需要撤销最近一次提交并恢复代码到之前的状态,以下是两种推荐方案: #### 方案一:安全撤销(推荐) ```bash # 1. 查看提交历史(确认要撤销的提交ID) git log --oneline # 2. 安全撤销最近一次提交(保留历史记录) git revert HEAD # 3. 解决可能出现的代码冲突(参考引用[1]) # 手动修改冲突文件后执行: git add . git revert --continue # 4. 推送更改到远程仓库 git push origin <branch-name> ``` **特点**: - ✔️ 新建提交来抵消原提交(历史记录完整保留) - ✔️ 适合已推送到远程仓库的提交 - ✔️ 团队协作安全 #### 方案二:彻底回退 ```bash # 1. 回退到上一个提交状态(慎用!) git reset --hard HEAD~1 # 2. 强制推送到远程(覆盖历史) git push -f origin <branch-name> ``` **特点**: - ⚠️ 彻底删除最近一次提交记录 - ⚠️ 仅限未推送/独立分支使用 - ⚠️ 会清除提交相关的所有修改 #### 关键区别对比 | **特性** | `git revert` | `git reset --hard` | |------------------|---------------------------|------------------------| | 提交历史 | 新增反向提交 | 彻底删除原提交 | | 本地未提交内容 | ✅ 保留 | ❌ 完全删除 | | 远程分支适用性 | ✅ 安全推送 | ⚠️ 需强制覆盖(风险高)| | 冲突处理 | 需手动解决冲突[^1] | 无冲突(直接回退) | > 💡 **操作建议**: > 如果已推送到远程仓库,**务必使用 `git revert`**;仅在本地未推送时考虑 `git reset` #### 数据文件恢复说明 您的 `data()` 函数: ```javascript data: function() { return { timer: null, currentMacaddr: '', localHost: '', device: {} }; } ``` 在执行撤销后: 1. 通过 `git revert` 恢复:函数将回退到上次提交时的初始状态 2. 通过 `git reset --hard` 恢复:工作目录将完全回退到指定提交时的状态 3. 未提交的修改会丢失(建议先 `git stash` 暂存变更) --- ### 相关问题 1. 如何撤销多次连续的 Git 提交? 2. 使用 `git reset --soft` 和 `git reset --hard` 有什么区别? 3. 如何恢复被 `git reset` 意外删除的提交? 4. 使用 `git revert` 撤销合并提交(merge commit)有什么特殊注意事项? > 参考文档: > Git 官方文档 - [撤销操作](https://git-scm.com/book/en/v2/Git-Basics-Undoing-Things)[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值