当前位置: 首页 > news >正文

git 原理

一、git 原理图

二、初始同步状态

远程仓库 (origin/main): A---B ← 指向 B 本地版本库 (main): A---B ← 指向 B 本地工作区: 文件和 B 提交时完全一致

三、本地一个文件中添加了"bbbb"

你的操作执行前状态`git reset --hard` 结果bbbb 还在吗?
`add` + `commit``A---B---D` (D含bbbb)不变,还是 `A---B---D`✅ 在(已提交)
只 `add``A---B`,暂存区有bbbb`A---B`,暂存区清空❌ 没了
什么都没做`A---B`,工作区有bbbb`A---B`,工作区恢复❌ 没了

四、正常提交流程

1. 修改 a.c(在工作区) ↓ 2. git add a.c → 改动进入暂存区 ↓ 3. git commit -m "xxx" → 暂存区内容打包成提交,进入版本库 ↓ 4. git push → 版本库的提交推送到远程仓库

五、本地修改远程也修改不同文件

# 1. 你在本地修改 a.c vim a.c # 工作区:a.c 加了 bbbb # 2. 加入暂存区 git add a.c # 暂存区:a.c (staged) # 3. 提交到本地版本库 git commit -m "a.c加bbbb" # 本地:A---B---D # 4. 推送到远程?先 pull! git push # ❌ 失败!提示:reject non-fast-forward # 远程有 C,你的历史不是 C 的后代 # 5. 先拉取远程最新代码 git pull # 内部执行: # git fetch origin main → 下载 C 到 origin/main # git merge origin/main → 合并 C 和 D,产生 merge commit E # 结果: # 本地变成:A---B---C---E---D (merge 方式) # 6. 现在可以 push 了 git push # ✅ 成功!远程也更新到包含你的提交
# 1. 你在本地修改 a.c vim a.c # 工作区:a.c 加了 bbbb # 2. 加入暂存区 git add a.c # 暂存区:a.c (staged) # 3. 提交到本地版本库 git commit -m "a.c加bbbb" # 本地:A---B---D # 4. 推送到远程?先 pull! git push # ❌ 失败!提示:reject non-fast-forward # 远程有 C,你的历史不是 C 的后代 # 5. 先拉取远程最新代码 git pull --rebase origin main #A---B---C---D' (rebase 方式) # 6. 现在可以 push 了 git push # ✅ 成功!远程也更新到包含你的提交

五、本地修改远程也修改(不同文件) 现在不管git add 和git commit 都不要了就是和远程一样

git fetch origin main git reset --hard origin/main

六、已经push 成功现在要取消

情况一:还没人拉取(紧急撤销)

# 本地先回退到上一个提交 git reset --hard HEAD~1 # 强制推送到远程(覆盖远程历史) git push --force origin main

结果:

远程原来: A---B---C---D (D是你的提交) 远程现在: A---B---C (D被删掉了) 本地: A---B---C

⚠️危险!如果同事已经pull了 D,他们下次 push 会冲突或把 D 又带回来。

情况二:已经有人拉取了(安全撤销)

不要 force push!用 revert 生成一个"反向提交":

# 生成一个新提交,内容刚好抵消 D git revert HEAD # 正常 push git push origin main

结果:

远程: A---B---C---D---D' (D' 是 revert 提交,内容和 D 相反) # 比如 D 是 "加了 a.c 一行 bbbb" # D' 就是 "删了 a.c 那行 bbbb"

七、Git 冲突标记

// 原始文件 int a = 10; // 你改成 int a = 20; // 远程改成 int a = 30;
<<<<<<< HEAD int a = 20; // 你的修改 ← "HEAD 指向的提交"里的代码 = 你的本地代码 ======= int a = 30; // 远程的修改 >>>>>>> origin/main // "origin/main 指向的提交"里的代码 = 远程代码

八、解决冲突

git pull # Auto-merging a.c # CONFLICT (content): Merge conflict in a.c # Automatic merge failed; fix conflicts and then commit the result.

Git 会在工作区生成带冲突标记的文件,你直接用编辑器打开修改:

vim a.c # 或 VS Code、IDEA 等

文件里长这样

<<<<<<< HEAD int a = 20; // 你的代码 ======= int a = 30; // 远程代码 >>>>>>> origin/main

手动编辑,三选一:

// 方案1: 保留你的 int a = 20; // 方案2: 保留远程的 int a = 30; // 方案3: 合并两者 int a = 25; // 或者别的处理方式

改完后的流程

git pull # 拉取,产生冲突 vim a.c # 手动解决冲突 # 1. 保存文件 # 2. 告诉 Git 冲突已解决 git add a.c # 3. 完成合并提交 git commit -m "解决a.c冲突" # 或直接用 git merge --continue # 4. # 现在才能推送到远程 git push
http://www.jsqmd.com/news/851155/

相关文章:

  • 2026 国产 UHPC 品牌推荐 桥梁隧道风电大型工程稳定供应商 - 品牌企业智选官
  • 不踩坑!2026 钢格板厂家实力排名TOP5 :多场景优质企业全面选购指南 - 速递信息
  • 5分钟快速上手:B站缓存转换与无损合并的终极解决方案
  • 163MusicLyrics:免费解锁网易云QQ音乐歌词,告别本地音乐“哑巴“时代
  • 2026年全国医用微动力系统与无刷电机供应商深度评测|手术动力设备精准适配完全指南 - 企业名录优选推荐
  • PCAP01硬件SPI驱动踩坑实录:对比模拟SPI,在STM32CubeIDE环境下如何配置DMA提升效率
  • 10分钟精通专业术语识别:FunASR热词优化终极指南
  • 差分
  • 对比直接使用官方 API 体验 Taotoken 在路由与容灾上的差异
  • 金融行业:OpenClaw批量处理理财客户信息、生成理财方案,提升服务效率
  • VSCode里Code Runner跑Python总报9009?别慌,检查一下你的setting.json文件
  • 武汉新鹏源环保工程:黄陂专业的不锈钢制品加工公司推荐几家 - LYL仔仔
  • 告别纯理论:手把手教你用Simulink复现三相电机调压调速,看波形学控制
  • 从Anaconda到PyTorch:搞懂conda安装的cudatoolkit和系统CUDA到底啥关系?
  • 数字生产实践Codex:AI 编程助手进化到桌面办公智能体
  • 福州晋安鼓山李国秀保洁:长乐居家开荒保洁公司选哪家 - LYL仔仔
  • 别再只让电机傻转了!给JGB37-520加上TB6612和STM32编码器模式,实现精准速度与位置控制
  • 别再只调步数了!So-VITS-SVC音质优化的三个隐藏开关:编码器、F0和响度匹配
  • python的enum通过int进行初始化
  • Unity 2D基础:Rigidbody2D刚体的运动控制
  • 告别VS Code!用CLion 2024.3 + CUDA 12.1搭建高效GPU开发环境(附CMake配置避坑指南)
  • AMD Ryzen性能调优终极指南:SMUDebugTool完全掌握教程
  • 亨得利高端腕表售后维修地址查询:2026年5月全国七大官方网点汇总(附百达翡丽、江诗丹顿、爱彼、理查德・米勒、宝玑、宝珀、朗格、积家、卡地亚、欧米茄、劳力士等品牌服务指南) - 亨得利腕表维修中心
  • AsNumpy vs NumPy:昇腾NPU加速下的1000×1000矩阵运算性能对比实测
  • 【信息科学与工程学】【物理/化学科学和工程技术】知识体系32 对称性破缺
  • 社保基金管理系统全解析:核心痛点、核心功能、应用场景、价值、案例、FAQ(2026)
  • 精通AI斗地主:3个实战步骤实现智能出牌决策
  • Android Studio中文界面配置:专业开发者效率提升指南
  • 2026平阳口.腔医院排行榜:这几家实力派上榜 - 速递信息
  • Slide离线阅读功能详解:随时随地浏览Reddit内容的完整教程