适配掘金、CSDN、知乎、技术公众号,自带目录、代码高亮、分割线、表格速查,可直接复制发布
目录
- 一、前言
- 二、基础原理
- [三、场景 1:pull 产生冲突,未 add、未 commit(最常用)](#三、场景 1:pull 产生冲突,未 add、未 commit(最常用) "#%E4%B8%89%E5%9C%BA%E6%99%AF1pull%E4%BA%A7%E7%94%9F%E5%86%B2%E7%AA%81%E6%9C%AAadd%E6%9C%AAcommit%E6%9C%80%E5%B8%B8%E7%94%A8")
- [四、场景 2:冲突已解决,完成 merge 提交,本地撤回](#四、场景 2:冲突已解决,完成 merge 提交,本地撤回 "#%E5%9B%9B%E5%9C%BA%E6%99%AF2%E5%86%B2%E7%AA%81%E5%B7%B2%E8%A7%A3%E5%86%B3%E5%AE%8C%E6%88%90merge%E6%8F%90%E4%BA%A4%E6%9C%AC%E5%9C%B0%E6%92%A4%E5%9B%9E")
- [五、场景 3:合并提交已推送到远程,团队安全回滚](#五、场景 3:合并提交已推送到远程,团队安全回滚 "#%E4%BA%94%E5%9C%BA%E6%99%AF3%E5%90%88%E5%B9%B6%E6%8F%90%E4%BA%A4%E5%B7%B2%E6%8E%A8%E9%80%81%E5%88%B0%E8%BF%9C%E7%A8%8B%E5%9B%A2%E9%98%9F%E5%AE%89%E5%85%A8%E5%9B%9E%E6%BB%9A")
- 六、配套辅助实用命令
- 七、操作速查表
- 八、重要避坑注意事项
一、前言
日常开发中执行 git pull 拉取远程代码时,很容易出现代码冲突。
很多新手遇到冲突不想手动解决,不知道如何撤销本次 pull 操作,本文分三大场景提供全套可复制命令,兼顾单人本地开发与多人团队协作,规避代码丢失风险。
简单科普:git pull 等价于 git fetch(拉取远程代码)+ git merge(自动合并),回退逻辑分两种:终止未完成合并、撤销已生成的合并提交。
二、基础原理
- 普通
git pull:底层是 merge 合并,冲突未提交用git merge --abort终止合并 git pull --rebase:底层是变基合并,冲突未提交用git rebase --abort终止变基- 冲突处理完并提交合并记录后,本地用
git reset回退;已推送远程必须用git revert安全撤销
三、场景 1:pull 产生冲突,未 add、未 commit(最常用)
现象
执行 pull 后控制台提示合并失败,文件内出现 <<<<<<< HEAD 冲突标记,没有执行 git add、git commit。
普通 pull(merge 模式)冲突回退
bash
# 一键终止本次合并,代码恢复到pull执行前状态,无代码丢失
git merge --abort
使用 git pull --rebase 产生冲突
bash
# 终止变基操作,还原本地原始代码
git rebase --abort
四、场景 2:冲突已解决,完成 merge 提交,本地撤回
冲突手动修复完成,已经执行 git add . && git commit 生成了一条 merge 合并提交,想要撤销本次拉取带来的所有改动。
方案 1:软回退(推荐,保留所有代码)
回退到合并前版本,所有修改保留在工作区,可重新处理冲突、重新合并。
bash
# HEAD^ 代表上一次提交(本次pull生成的合并提交)
git reset --soft HEAD^
方案 2:硬回退(谨慎使用,彻底丢弃改动)
直接删除本次 pull 拉取的所有代码变更,未提交的本地修改会全部丢失,操作前建议备份文件。
bash
git reset --hard HEAD^
❗ 不推荐多人分支使用硬回退后执行
git push -f强制推送远程,会覆盖其他同事提交。
五、场景 3:合并提交已推送到远程,团队安全回滚
如果本次 pull 的合并提交已经 git push 到公共远程分支,禁止使用 reset + 强制推送,会破坏团队代码历史,统一使用 git revert。
操作步骤
- 查看提交记录,复制 merge 合并提交的 hash 值
bash
git log --oneline
- 执行 revert 撤销合并提交
bash
# -m 1 固定参数,代表保留本地分支原有代码,舍弃远程拉取的变更
git revert -m 1 你的merge提交hash值
- 将反向提交推送到远程,完成安全回退
bash
git push
六、配套辅助实用命令
1. 查看当前仓库状态,判断冲突类型
bash
git status
- 输出包含
MERGING:未完成 merge 合并冲突,执行git merge --abort - 输出包含
REBASE:未完成变基冲突,执行git rebase --abort
2. 只拉取远程代码,不自动合并(提前规避冲突)
不想自动合并引发冲突,可以先单独拉取代码,手动对比差异后再合并:
bash
# 仅拉取远程最新代码,不执行合并
git fetch
# 查看远程分支最新提交记录
git log origin/分支名称
七、操作速查表
表格
| 使用场景 | 执行命令 |
|---|---|
| git pull 普通 merge 冲突,未提交 | git merge --abort |
| git pull --rebase 变基冲突,未提交 | git rebase --abort |
| 已提交合并,保留本地所有代码 | git reset --soft HEAD^ |
| 已提交合并,彻底丢弃 pull 改动 | git reset --hard HEAD^ |
| 合并提交已推送远程,团队安全回退 | git revert -m 1 <merge提交hash> |
八、重要避坑注意事项
git reset --hard风险极高,会清空本地未提交修改,操作前务必备份重要代码;- 多人共用开发分支严禁使用
git push -f强制推送,会覆盖其他同事提交,造成代码丢失; - 公共分支、线上分支回退优先使用
git revert,不会删除历史提交记录,可追溯操作; - 遇到复杂冲突建议先和团队沟通,不要盲目回退,避免丢失远端有效更新;
- 日常开发可习惯使用
git fetch预览远程代码,确认无冲突后再手动合并,减少回退操作。