Git 学习笔记

前言

最近在维护一个学习用的 Vue3 项目时,遇到了两个典型的 Git 问题:

  1. 我已经 push 了两条 commit 到远程,后来发现其实可以合并成一条更干净的记录。
  2. 本地仓库是几个月前的老版本,本地 commit 了两次没 push,结果远程仓库被作者 force push 过,导致 git pull 直接报 divergent branches,完全拉不下来。

下面把两次解决过程完整记录下来,方便以后自己复习,也给同样踩坑的朋友参考。


一、已 push 的两条 commit,如何合并成一条干净记录?

场景: 我本地连续 commit 了两次(比如一次改标题、一次去除无用信息),已经 git push 上去。之后发现这两条 commit 其实可以合并成一条更清晰的记录。

目标🎯:

解决思路

  • 使用 git reset --soft 把两条 commit "撤回",但保留所有代码修改。
  • 重新 commit 成一条干净的记录。
  • 因为历史已经被改写,必须用 force push 把远程分支的引用指向新的 commit(旧的 commit 只是失去引用,并非真正删除)。

完整操作步骤

perl 复制代码
# 1. 先确认当前历史
git log --oneline --graph -5
​
# 2. 用 --soft 模式撤回最近两条 commit(修改保留在暂存区)
git reset --soft HEAD~2
​
# 3. 重新提交成一条干净的 commit
git commit -m "feat: 合并配置修改和测试代码优化"
​
# 4. 强制推送
git push --force-with-lease origin master
# 或者 git push -f origin master

执行后效果

  • 远程仓库的 Commits 页面只剩下一条新的合并 commit。
  • 原来的两条旧 commit 不再被 master 分支引用,从主历史中消失(但 GitHub 服务器短期内可能还保留)。
  • 本地和远程历史保持一致,干净清晰。

二、本地老仓库 + 远程被 force push,如何快速跟上最新代码?

场景

  • 本地是几个月前的 clone 版本,还在 master 分支上自己 commit 了两次(没 push)。
  • 这期间项目作者对 master 进行了 force push(重写了历史)。
  • 执行 git pull 直接报错:
vbnet 复制代码
hint: You have divergent branches...
fatal: Need to specify how to reconcile divergent branches.

核心原因: 本地和远程的历史从某个老 commit 开始就"分叉"了(diverged),加上远程做了 forced update,Git 新版本默认不再自动合并,要求手动指定。

目标只想拿到最新的远程代码,完全不在意本地那两个旧 commit

解决办法

bash 复制代码
# 1. 先拉取远程最新内容(只下载,不合并)
git fetch origin
​
# 2. 强制把本地 master 重置为远程最新状态
git reset --hard origin/master
​
# 3. 检查状态
git status

执行完后:

  • 本地所有文件都会被更新成 远程仓库 上最新的代码。
  • 本地那两个旧 commit 被彻底丢弃。

总结

  • git reset --soft:撤回 commit 但保留修改
  • git reset --hard origin/分支:当本地和远程严重分叉时,这是最快速、最干净的"丢弃本地历史、跟上远程最新"的方式。
相关推荐
刘马想放假13 小时前
Git 从入门到进阶:一篇吃透版本管理的实战指南
git·gitlab
开发者联盟league15 小时前
git commit报错No .pre-commit-config.yaml file was found
git
猫老板的豆20 小时前
git实战
git
风曦Kisaki20 小时前
# Linux实战笔记-HIS项目实战Day01:版本控制与Git基础
linux·笔记·git
鲸~屿1 天前
Git上传本地文件到GitHub教学指南
git·github
减瓦2 天前
Windows 环境使用 Git Bash 最佳实践
windows·git
史呆芬2 天前
CodeX多仓库提交Skill搭建
git·后端·openai
城东2 天前
Git使用[原意要新建分支提交但是误提交到原来分支恢复办法]
git·原意要新建分支提交·但是误提交到原来分支
开发者联盟league2 天前
git 压缩本地最近多个commit
git