Git Revert
最后更新
git revert 通过创建一个新提交来撤销某个提交,新提交应用的是原提交改动的反向操作。由于它是追加历史而不是改写历史,revert 是撤销已推送提交的安全方式。和 git reset 不同,它不会迫使其他人去处理被改写的分支。
在终端在线编辑器中试试这些命令:浏览器里就是真正的 shell,无需安装。
语法
| 命令 | 作用 |
|---|---|
git revert HEAD | 撤销最近一个提交 |
git revert <hash> | 按哈希值撤销指定提交 |
git revert HEAD~2..HEAD | 撤销一段范围内的提交 |
git revert -n <hash> | 撤销但暂不提交(只暂存) |
git revert -m 1 <merge-hash> | 撤销合并提交,保留第 1 个父提交 |
revert 进行中
如果 revert 遇到冲突,解决之后继续即可。
| 命令 | 作用 |
|---|---|
git revert --continue | 解决冲突后继续 |
git revert --abort | 取消正在进行的 revert |
git revert --skip | 跳过当前提交并继续 |
revert vs reset
| 特性 | git revert | git reset |
|---|---|---|
| 改写历史 | 否 | 是 |
| 对已推送的提交安全 | 是 | 否 |
| 创建新提交 | 是 | 否 |
| 撤销中间的某个提交 | 可以 | 不方便 |
git revert 常见问题
git revert 和 git reset 有什么区别?
git revert 新增一个提交来撤销之前某个提交的改动,历史保持完整,对已推送的提交也很安全。git reset 把分支指针往回移动并改写历史,对本地提交没问题,但在共享分支上很危险。撤销公开的提交用 revert,撤销本地提交用 reset。已经推送的提交怎么撤销?
运行
git revert <hash>(撤销最新提交可用 git revert HEAD),然后推送新生成的 revert 提交。由于 revert 不改写历史,这才是撤销共享提交的正确方式:不需要强制推送,也不会影响已经拉取过的队友。怎么撤销合并提交?
合并提交有两个父提交,所以 Git 需要知道保留哪一条历史线。使用
git revert -m 1 <merge-hash>,其中 -m 1 告诉 Git 保留第一个父提交(通常就是你合并进去的那个分支)。撤销合并会撤掉合并进来的改动,但合并本身仍然留在历史中。可以一次撤销多个提交吗?
可以。传入一个范围,例如
git revert HEAD~2..HEAD,撤销最后两个提交,也可以列出多个哈希值。默认情况下,Git 会为每个被撤销的提交各创建一个 revert 提交;加上 -n 可以只暂存所有反向改动而不提交,然后由你自己做一次提交。可以在线练习吗?
可以。打开终端在线编辑器,就能在浏览器里的真实 shell 中运行
git revert,无需安装。Coddy 的免费互动 Git 课程也会一步步教你撤销更改。