Git 回滾遠程倉庫代碼
Git 回滾遠程倉庫代碼,并保證重新提交后diff任然存在
git revert 和 git reset 的区别
比较点 | git revert | git reset |
---|---|---|
作用 | 创建一个新的 commit,用来“反做”某个提交的内容 | 移动分支指针到指定的历史 commit(会改动历史) |
是否保留历史记录 | ✅ 是,原来的提交记录还在 | ❌ 否(被 reset 的提交不在历史链上了) |
是否安全(适合多人协作) | ✅ 安全:不会影响他人 | ❌ 危险:会导致别人 pull 冲突 |
适合场景 | 想撤销某个 commit 的影响,但保留提交记录(例如线上 hotfix 撤销) | 想彻底丢弃提交记录、重置历史(多用于本地误操作修复) |
操作
很顯然,要實現該需求只能使用git reset。下面是詳細步驟
# 示例
git checkout release_20250515
git reset --hard <merge_commit_id> (需要回滾到的那個connit_id)
git revert -m 1 <merge_commit_id> (需要清除的那個connit_id)
git cherry-pick <merge_commit_id1> <merge_commit_id2> (非必須)
git push origin release_20250515 --force
舉例:merge_commit_id 獲取位置
- 强推注意: 有些代碼倉庫會設置保護分支,需要先解除后才可以强推(下面舉例雲效)
✅ 总结一下操作目的:
操作 | 目的 |
---|---|
reset --hard 到 merge 之前 | 回到干净状态 |
revert -m 1 <merge> | 清除合并记录,未来可以重新合并 |
cherry-pick 其他提交 | 恢复你需要保留的内容 |
force push | 更新远程分支为清理后的版本 |
git revert -m 1 <merge_commit> 是什么意思
这是专门用来撤销一个合并提交(merge commit)的指令。
首先看什么是 merge commit?
合并两个分支,比如你从 meituan_2025 合并到了 release_20250515,Git 会产生一个「merge commit」,这类提交有两个 parent:
commit abc123 (merge)
├── parent 1: release_20250515
└── parent 2: meituan_2025
🧠 再看 -m 1 是什么意思?
- m 表示:你要保留哪一个 parent 的内容,Git 才知道怎么“反做”这个 merge。
- m 1:表示以 parent 1(通常是当前分支)为主,撤销掉引入的 parent 2(被合并分支)内容。
- m 2:相反,以 parent 2 为主,撤销掉 parent 1 的改动。
📌 举个例子:
你执行了:
git merge meituan_2025
然后想撤销这次合并,但保留 release_20250515 原来的内容,可以执行:
git revert -m 1 <merge_commit_id>
它会生成一个新的 commit,把 meituan_2025 中引入的内容反向覆盖掉,但并不会影响 Git 历史,也不会阻止你将来重新 merge。
总结建议
如果你要… | 建议用 |
---|---|
把最近几次 commit 彻底丢掉(本地误操作) | git reset --hard |
撤销某次 commit,但不改历史 | git revert <commit> |
撤销某次 merge,又想将来能重新合并 | git revert -m 1 <merge_commit> |
回退某次 merge,并同时丢弃后续提交 | git reset --hard 到 merge 前 + git revert -m 1 |