← 返回目录

第 1 卷

第 1 / 3 卷日期:

Git 中 Pull、Fetch、Merge 和 Rebase 的差异

解析

一、Git与SVN的本质区别

Git和SVN(Subversion)的核心差异在于版本控制系统的架构类型,这决定了两者的核心行为差异:

  1. 架构类型不同(核心本质)

◦ Git:分布式版本控制系统(DVCS)。每个开发者本地都会完整克隆整个仓库的所有版本历

史、分支、标签等数据,无需依赖中央服务器即可完成提交、分支创建、版本回溯等核心操作,仅在需要同步协作时与远程仓库交互。

◦ SVN:集中式版本控制系统(CVCS)。所有版本历史、分支信息都存储在唯一的中央服务器

上,开发者本地仅保留当前工作副本的文件,几乎所有核心操作(提交、更新、查看历史)都必须联网依赖中央服务器。

  1. 其他关键衍生差异

◦ 离线工作能力:Git支持完全离线工作(本地提交、版本对比等),SVN无网络无法进行版本相

关操作;

◦ 分支/标签效率:Git的分支/标签是轻量级的(仅指向特定提交的指针),创建、切换、合并几

乎瞬间完成;SVN的分支/标签是完整文件拷贝,操作缓慢且占用大量存储空间;

◦ 数据安全性:Git本地仓库完整备份,单个仓库损坏可通过其他开发者的本地仓库恢复;SVN中

央服务器损坏若无备份,所有版本历史丢失。

二、开发中常用的Git命令

按工作流程分类,核心常用命令如下:

  1. 仓库初始化与克隆
  • git init:在当前目录初始化一个本地Git仓库;
  • git clone <远程仓库地址>:克隆远程仓库到本地(完整拷贝所有版本历史)。
  1. 工作区与暂存区操作
  • git add <文件名>:将指定文件的修改添加到暂存区;
  • git add .:将当前目录下所有修改(新增、修改、删除)添加到暂存区;

◦ git status:查看工作区、暂存区的文件状态(哪些文件未跟踪、已修改未暂存、已暂存

  • git diff:查看工作区与暂存区的文件差异;
  • git diff:查看工作区与暂存区的文件差异;
  • git diff --cached:查看暂存区与最近一次提交(HEAD)的差异。
  • git commit -m "提交说明":将暂存区的修改提交到本地仓库,生成版本记录;

◦ git commit --amend:修改最近一次提交的说明(或补充暂存区的修改到最近一次提

交);

  • git log:查看本地仓库的提交历史(按时间倒序排列);
  • git log --oneline:简洁显示提交历史(仅显示提交ID前7位和提交说明)。
  1. 分支操作
  • git branch:查看本地所有分支(当前分支前标 *);
  • git branch <分支名>:创建新分支;
  • git checkout <分支名>:切换到指定分支;
  • git checkout -b <分支名>:创建并切换到新分支(常用快捷命令);
  • git branch -d <分支名>:删除本地已合并的分支;
  • git push origin <分支名>:将本地分支推送到远程仓库。
  1. 远程仓库与同步
  • git remote -v:查看远程仓库的关联信息;
  • git pull:拉取远程仓库对应分支的更新并合并到本地当前分支;
  • git push:将本地当前分支的提交推送到远程对应分支;
  • git fetch:拉取远程仓库的最新版本到本地(不自动合并)。
  1. 撤销与回滚
  • git reset --hard <提交ID>:彻底回滚到指定提交版本,丢弃后续所有修改;

◦ git checkout -- <文件名>:撤销工作区中该文件的未暂存修改(恢复到暂存区或最近

提交状态);

  • git rm --cached <文件名>:将文件从暂存区移除(保留本地文件,取消跟踪)。
三、Git分支冲突的解决方法

分支冲突通常发生在多个分支修改了同一文件的同一部分内容,且合并/拉取时Git无法自动合并的场景,解决步骤如下:

  1. 识别冲突:执行 git merge <分支名> 或 git pull 后,Git会提示“CONFLICT (content):

Merge conflict in <文件名>”,此时合并进入暂停状态;通过 git status 可查看冲突文件(标

◦ 打开冲突文件,Git会用特殊标记标注冲突区域:

1<<<<<<< HEAD(当前分支的内容)

2本地分支修改的代码 3=======(冲突分隔线)

4待合并分支修改的代码 5>>>>>>> <分支名/提交ID>(待合并分支的内容)

◦ 手动编辑文件:删除冲突标记(<<<<<<<、=======、>>>>>>>),根据业务需求保留正确代码

(可保留双方有效内容,或舍弃其中一方)。

  1. 标记冲突已解决:编辑完成后,将修改后的文件添加到暂存区,确认冲突解决:

Code block

1git add <冲突文件名>

  1. 完成合并/提交:

◦ 若为 git merge 触发的冲突:执行 git commit 即可完成合并(Git会自动生成合并提交说

明);

  • 若为 git pull 触发的冲突:完成上述步骤后,合并自动完成(无需额外commit);

5.(可选)放弃合并(紧急情况):若冲突复杂暂时无法解决,可放弃当前合并,恢复到合并前状态:

Code block

1git merge --abort

四、Git rebase 与 merge 的区别

git rebase 和 git merge 的核心目的都是将一个分支的修改整合到另一个分支,但整合方式和提交历史表现截然不同:

  1. 核心原理差异

◦ git merge:合并提交(三方合并)。保留两个分支的原始提交历史,在两者的最新共同祖

先基础上,创建一个新的“合并提交”,将两个分支的修改整合到该提交中。

◦ git rebase:变基(重写提交历史)。将当前分支的所有提交,“移植”到目标分支的最

全站分卷索引 · 3 卷
  1. 1第 1 卷
  2. 2第 2 卷
  3. 3第 3 卷