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/分支:当本地和远程严重分叉时,这是最快速、最干净的"丢弃本地历史、跟上远程最新"的方式。
相关推荐
深海鱼在掘金2 天前
Git 完全指南 —— 第1章:Git 概览与版本控制演进
git
noravinsc3 天前
关于Git Flow
git
蜜獾云3 天前
在Git中配置用户名和密码
git
scx_link3 天前
通过git bash在本地创建分支,并推送到远程仓库中
开发语言·git·bash
南大白3 天前
IntelliJ IDEA 运行时的 JVM 本地内存溢出崩溃
git
码农小旋风3 天前
Claude Code 基础用法大全:对话、分析、修改、测试、Git 和工作流
人工智能·git·chatgpt·claude
南大白3 天前
Git 撤回提交完整方案
git
像风一样的男人@3 天前
python --实现代理服务器
git·ui
sbjdhjd3 天前
从零搭建企业级 CI/CD(下):Jenkins+GitLab+Harbor 全链路实战指南
git·servlet·ci/cd·云原生·云计算·gitlab·jenkins
码云数智-大飞3 天前
Go Channel 详解:并发通信的正确姿势
前端·数据库·git