Git
一、Git 历史背景
Git 诞生于 Linux 内核开源项目的协作需求中。1991-2002 年,Linux 内核维护工作主要依赖繁琐的补丁提交与归档;2002 年起采用分布式版本控制系统 BitKeeper 管理代码。2005 年,BitKeeper 商业公司终止与 Linux 内核开源社区的合作,收回免费使用权。为避免依赖第三方工具,Linux 缔造者 Linus Torvalds 牵头开发了 Git,其设计目标明确:
- 速度快,能高效处理代码提交、分支切换等操作
- 设计简洁,降低使用与维护门槛
- 强力支持非线性开发,可容纳上千个并行开发分支
- 完全分布式架构,无需依赖中央服务器
- 能高效管理超大规模项目(如 Linux 内核),兼顾速度与数据量
二、Git 与 SVN 对比
| 特性 | SVN(Subversion) | Git |
|---|---|---|
| 架构类型 | 集中式版本控制系统 | 分布式版本控制系统 |
| 核心依赖 | 依赖中央服务器,所有操作需联网 | 每个人的电脑都是完整版本库,本地可独立工作,联网仅用于协作同步 |
| 容错性 | 服务器单点故障,故障期间无法进行版本管理操作 | 本地仓库完整保存历史版本,无单点故障风险 |
| 分支管理 | 分支创建与合并效率低,操作复杂 | 分支创建仅需新增指针,合并速度快,操作简洁 |
| 暂存区 | 无暂存区概念,修改直接提交到版本库 | 有暂存区(Stage/Index),支持分批提交修改 |
| 网络依赖 | 所有操作(如查看历史、提交)均需联网 | 本地可执行提交、查看历史等操作,仅同步时需联网 |
1. SVN 工作模式
SVN 需先从中央服务器获取最新版本代码,在本地修改后,再将修改推送回中央服务器。管理员可便捷掌握成员开发权限,也能查看其他开发者工作进度,但中央服务器一旦故障,整个团队版本管理工作将停滞。
2. Git 工作模式
Git 无需中央服务器,每个开发者本地都有完整版本库。多人协作时,只需互相推送修改即可共享代码。其工作模式示意图如下:

三、Git 工作流程
Git 标准工作流程分为 5 步,确保代码管理有序、可追溯,流程示意图如下:

- 克隆远程仓库:从远程仓库(如 GitHub、Gitee)克隆代码到本地,生成完整的本地仓库,命令为
git clone <远程仓库地址>(支持 HTTPS 和 SSH 协议地址)。 - 检出与修改代码:从本地仓库检出(checkout)代码到工作区,在工作区进行代码编写或修改。
- 提交到暂存区:将工作区中需要提交的修改文件添加到暂存区,命令为
git add <文件名>(添加单个文件)或git add .(添加所有修改文件),暂存区临时存储待提交的修改,便于分批管理。 - 提交到本地仓库:将暂存区的所有修改提交到本地仓库,生成版本记录,命令为
git commit -m "提交日志信息",日志信息需清晰描述修改内容(如“修复登录功能验证码失效问题”),本地仓库会保存所有历史版本,支持后续追溯与回滚。 - 推送到远程仓库:当需要与团队共享代码时,将本地仓库的修改推送到远程仓库,命令为
git push <远程仓库别名> <分支名>(如git push origin master),推送后团队其他成员可获取最新代码。
四、Git 安装
1. Windows 系统安装
1.1 软件下载
- Git 官方下载地址:https://git-scm.com/download,进入页面后自动识别 Windows 系统,点击“Download for Windows”即可下载对应版本(32 位/64 位,根据系统选择,推荐 64 位)。
- 辅助工具 TortoiseGit(图形化界面工具,简化操作)下载地址:https://tortoisegit.org/download/,需同时下载对应版本的中文语言包(TortoiseGit-LanguagePack-xxx-zh_CN.msi)。
- 下载文件列表示例:
- Git-2.16.2-32-bit.exe(32 位 Git 安装包)
- Git-2.16.2-64-bit.exe(64 位 Git 安装包)
- TortoiseGit-2.6.0.0-32bit.msi(32 位 TortoiseGit 安装包)
- TortoiseGit-2.6.0.0-64bit.msi(64 位 TortoiseGit 安装包)
- TortoiseGit-LanguagePack-2.6.0.0-32bit-zh_CN.msi(32 位中文语言包)
- TortoiseGit-LanguagePack-2.6.0.0-64bit-zh_CN.msi(64 位中文语言包)
1.2 软件安装步骤
- 安装 Git for Windows:双击 Git 安装包(如 Git-2.16.2-64-bit.exe),进入安装向导,除特殊需求外,一路点击“Next”使用默认选项,直至安装完成。
- 安装 TortoiseGit:双击 TortoiseGit 安装包(如 TortoiseGit-2.6.0.0-64bit.msi),同样使用默认选项“Next”安装,在“Completing the Setup Wizard”页面需勾选“Run first start wizard”(启动首次设置向导),点击“Finish”进入配置。
- 语言配置:首次启动向导中,若已安装中文语言包,在“Language”下拉框选择“中文(简体)”,若未安装则默认英文,后续可通过语言包补充。
- 配置 Git 路径:向导会自动检测 Git 安装目录(如
C:\Program Files\Git\bin),若未检测到,需手动选择 Git.exe 所在路径。 - 配置用户信息:设置用户名(如“ZhangSan”)和邮箱(如“zhangsan@example.com”),此信息会附加到每次提交记录中,用于标识开发者。
- 认证配置:默认使用 TortoiseGitPlink 作为 SSH 客户端,Credential helper 选择“manager”,无需额外修改,点击“完成”结束配置。
- 安装中文语言包:双击中文语言包安装包,一路“Next”完成安装,安装后在桌面右键菜单选择“TortoiseGit”→“设置”,在“常规设置”的“语言”选项中选择“中文(简体)”,点击“确定”生效。
2. Linux 系统安装
源码安装,以 CentOS/RHEL 为例。
2.1 安装依赖包
# 安装编译 Git 所需的依赖库与工具
yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
2.2 卸载旧版本 Git
若系统已预装旧版本 Git,需先卸载:
yum remove -y git
2.3 下载并编译 Git 源码
- 从 Git 官网(https://git-scm.com/downloads)下载最新源码包,或使用
wget命令直接下载(以版本 2.37.1 为例):
wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.37.1.tar.gz
- 解压源码包并进入目录:
tar -zxvf git-2.37.1.tar.gz
cd git-2.37.1
- 编译并安装(指定安装路径为
/usr/local/git):
./configure --prefix=/usr/local/git
make
make install
2.4 配置环境变量
- 编辑
/etc/profile文件,添加 Git 环境变量:
vim /etc/profile
# 在文件末尾添加以下内容
GIT_HOME=/usr/local/git
export PATH=$PATH:$GIT_HOME/bin
- 使环境变量立即生效:
source /etc/profile
2.5 验证安装
# 查看 Git 版本,确认安装成功
git --version
3. macOS 系统安装
- 通过官网下载:访问 https://git-scm.com/download,点击“macOS”下载安装包,双击安装即可(默认安装路径无需修改)。
- 通过 Homebrew 安装(推荐,需先安装 Homebrew):
brew install git
- 验证安装:
git --version
五、Git 核心概念
1. 版本库(Repository)
版本库又名仓库,本质是一个目录(隐藏目录 .git),用于存储 Git 管理的所有文件版本信息、分支指针、配置等数据。只有包含 .git 目录的上级目录(工作区)中的文件,才能被 Git 跟踪管理。.git 目录结构如下:
hooks:存储 Git 钩子脚本(如提交前验证脚本)objects:存储 Git 对象(如文件内容、提交记录)refs:存储分支与标签的引用指针config:Git 仓库配置文件(本地仓库配置)HEAD:指向当前所在分支的指针
2. 工作区(Working Directory)
工作区是用户在电脑中能直接看到的目录,即包含 .git 隐藏目录的上级目录。用户在工作区中进行文件创建、修改、删除等操作,所有未提交的修改均先在工作区进行。
3. 暂存区(Stage/Index)
暂存区是 Git 特有的概念,位于 .git 目录下(.git/index 文件),用于临时存储待提交的文件修改。通过 git add 命令将工作区的修改添加到暂存区,再通过 git commit 命令将暂存区的所有修改提交到本地仓库。暂存区的存在允许用户分批提交修改,避免一次性提交所有变更。
六、Git 基础操作
1. 创建版本库
1.1 使用 Git Bash(命令行)
- 选择合适目录(如桌面),创建空文件夹(如“GitTest”),进入该文件夹:
cd /c/Users/YourName/Desktop/GitTest
- 初始化本地版本库,生成
.git隐藏目录:
git init
# 输出示例:Initialized empty Git repository in C:/Users/YourName/Desktop/GitTest/.git/
1.2 使用 TortoiseGit(图形化)
- 在目标目录(如桌面)右键点击,选择“Git 在这里创建版本库”。
- 弹出确认窗口,点击“确定”,目录下会生成
.git隐藏目录(Windows 需开启“显示隐藏文件”才能看到,开启方式:文件夹选项→查看→勾选“显示隐藏的文件、文件夹和驱动器”)。
2. 添加文件到版本库
以在“GitTest”目录下创建“mytest.txt”文件为例:
2.1 使用 Git Bash
- 创建文件后,将文件添加到暂存区:
git add mytest.txt
# 若添加所有文件,使用 git add .
- 将暂存区文件提交到本地仓库,添加提交日志(日志需简洁描述修改,必填):
git commit -m "新增 mytest.txt 文件"
# 输出示例:[master (root-commit) 516bd65] 新增 mytest.txt 文件
# 1 file changed, 1 insertion(+)
# create mode 100644 mytest.txt
2.2 使用 TortoiseGit
- 右键点击“mytest.txt”,选择“TortoiseGit”→“添加”,弹出“加入完成”窗口,点击“确定”,文件图标会显示“+”号(表示已添加到暂存区)。
- 再次右键点击“mytest.txt”,选择“Git 提交© -> ‘master’…”,在提交窗口中填写日志信息(如“新增 mytest.txt 文件”),勾选待提交文件,点击“提交”,提交成功后文件图标显示对勾(表示已纳入版本管理)。
3. 修改文件
3.1 提交修改
- 直接编辑“mytest.txt”文件(如添加内容“Hello Git!”)。
- 使用 Git Bash 提交:
# 添加到暂存区
git add mytest.txt
# 提交到本地仓库
git commit -m "修改 mytest.txt,添加 'Hello Git!' 内容"
- 使用 TortoiseGit 提交:右键点击修改后的文件,选择“Git 提交…”,填写日志后提交即可(对应原文档中 TortoiseGit 提交修改窗口图)。
3.2 查看修改历史
3.2.1 使用 Git Bash
# 查看详细历史,包含作者、日期、修改内容
git log
# 简洁查看,每行显示一条记录
git log --oneline
# 输出示例:e83082a (HEAD -> master) 修改 mytest.txt,添加 'Hello Git!' 内容
# 516bd65 新增 mytest.txt 文件
3.2.2 使用 TortoiseGit
右键点击文件或目录,选择“TortoiseGit”→“显示日志”,弹出日志窗口,可查看所有提交记录,包括作者、日期、日志信息、修改文件列表及增减行数。
3.3 差异比较
3.3.1 使用 Git Bash
# 查看工作区与暂存区的差异
git diff mytest.txt
# 查看工作区与本地仓库最新版本的差异
git diff HEAD mytest.txt
3.3.2 使用 TortoiseGit
右键点击修改后的文件,选择“TortoiseGit”→“比较差异”,弹出差异对比窗口,红色表示删除内容,绿色表示新增内容。
3.4 还原修改
3.4.1 使用 Git Bash
# 还原单个文件
git checkout -- mytest.txt
# 还原所有未提交修改(谨慎使用)
git checkout .
3.4.2 使用 TortoiseGit
右键点击文件,选择“TortoiseGit”→“还原”,弹出确认窗口,点击“确定”(注意:此操作会彻底删除未提交的修改,无法恢复,需谨慎确认)。
4. 删除文件
4.1 使用 Git Bash
- 删除文件并从版本库中移除:
git rm 新建文本文档.txt
# 若仅删除版本库记录,保留本地文件,使用 git rm --cached 新建文本文档.txt
- 提交删除操作:
git commit -m "删除 新建文本文档.txt 文件"
4.2 使用 TortoiseGit
- 右键点击待删除文件,选择“删除”,弹出确认窗口点击“删除®”。
- 右键点击目录空白处,选择“Git 提交…”,填写日志,勾选“已删除”的文件,点击“提交”。
5. 忽略文件(.gitignore)
在项目中,部分文件(如编译生成的 Debug 目录、IDE 配置文件 .idea/、日志文件 log.txt 等)无需纳入版本管理,可通过 .gitignore 文件指定忽略规则。
5.1 忽略文件语法规范
- 空行或
#开头的行视为注释,会被 Git 忽略。 - 路径前加
/表示仅忽略当前目录下的文件,不递归忽略子目录文件(如/TODO仅忽略根目录的TODO文件,不忽略subdir/TODO)。 - 路径后加
/表示忽略整个目录(如Debug/忽略所有Debug目录及其中文件)。 !表示否定忽略,即排除指定文件(如先通过*.apk忽略所有.apk文件,再通过!app.apk保留app.apk)。- 通配符
*匹配零个或多个字符(如*.o忽略所有.o后缀文件),?匹配单个字符(如test?.txt忽略test1.txt、test2.txt等),[]匹配括号内任意字符(如[abc].txt忽略a.txt、b.txt、c.txt)。
5.2 配置 .gitignore
5.2.1 手动创建
在项目根目录(.git 所在目录)创建 .gitignore 文件,编辑规则(示例):
# 忽略所有 .o 文件
*.o
# 不忽略 lib.o
!lib.o
# 忽略根目录的 TODO 文件
/TODO
# 忽略所有 Debug 目录
Debug/
# 忽略 doc 目录下所有 .txt 文件,但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc 目录及其子目录下所有 .pdf 文件
doc/**/*.pdf
5.2.2 使用 TortoiseGit
右键点击待忽略的文件/目录(如 Debug 目录),选择“TortoiseGit”→“添加到忽略列表”,弹出窗口选择“保留本地文件”(仅忽略版本库跟踪,不删除本地文件),点击“确定”,目录下会自动生成 .gitignore 文件并添加对应规则。
七、远程仓库协作
1. 常用远程仓库平台
- GitHub:https://github.com/(国际平台,开源项目集中)
- Gitee(码云):https://gitee.com/(国内平台,访问速度快,支持私有仓库)
2. 添加远程仓库
以 GitHub 为例。
2.1 在 GitHub 上创建远程仓库
- 登录 GitHub 账号,点击右上角“+”→“New repository”。
- 填写仓库信息:
- Repository name:仓库名(如“MyTest1”)
- Description(可选):仓库描述
- Visibility:选择“Public”(公开)或“Private”(私有)
- 取消勾选“Initialize this repository with a README”(若本地已有仓库,无需初始化 README)
- 点击“Create repository”,创建成功后获取仓库地址(支持 HTTPS 和 SSH 协议,如 HTTPS:
https://github.com/YourUsername/MyTest1.git;SSH:git@github.com:YourUsername/MyTest1.git)。
2.2 HTTPS 协议同步远程仓库
2.2.1 使用 TortoiseGit
- 在本地仓库目录(如“GitTest”)右键点击,选择“Git 同步…”。
- 在同步窗口“远端 URL(U)”中输入 GitHub 仓库的 HTTPS 地址(如
https://github.com/YourUsername/MyTest1.git),点击“推送(H)”。 - 弹出登录窗口,输入 GitHub 用户名和密码(若开启二次验证,需使用个人访问令牌作为密码,令牌生成路径:GitHub 设置→Developer settings→Personal access tokens→Generate new token),验证通过后完成推送,本地代码同步到远程仓库。
2.2.2 使用 Git Bash
- 关联远程仓库(首次操作):
git remote add origin https://github.com/YourUsername/MyTest1.git
- 推送本地分支到远程仓库(以 master 分支为例):
git push -u origin master
# 首次推送加 -u 关联本地与远程分支,后续可直接使用 git push
- 输入用户名和密码(或个人访问令牌),完成推送。
2.3 SSH 协议同步远程仓库
2.3.1 生成 SSH 密钥对
- 打开 Git Bash,执行以下命令(邮箱替换为 GitHub 绑定邮箱):
ssh-keygen -t rsa -C "your_email@example.com"
- 执行过程中按回车默认配置(无需设置密码),最终在
C:/Users/YourName/.ssh目录下生成id_rsa(私钥,需妥善保管,不可泄露)和id_rsa.pub(公钥,用于配置到 GitHub)。
2.3.2 在 GitHub 配置 SSH 公钥
- 用记事本打开
id_rsa.pub文件,复制全部内容(公钥字符串)。 - 登录 GitHub,点击右上角头像→“Settings”→“SSH and GPG keys”→“New SSH key”。
- 填写“Title”(如“Kevin’s Windows PC”),在“Key”文本框粘贴公钥内容,点击“Add SSH key”,配置成功后可在 SSH keys 列表中看到新增记录。
2.3.3 验证 SSH 连接
在 Git Bash 中执行:
ssh -T git@github.com
首次连接会提示确认主机指纹,输入“yes”,若输出“Hi YourUsername! You’ve successfully authenticated, but GitHub does not provide shell access.”,表示 SSH 连接成功。
2.3.4 使用 SSH 推送代码
2.3.4.1 使用 TortoiseGit
- 配置 TortoiseGit 的 SSH 客户端:右键点击桌面→“TortoiseGit”→“设置”→“网络”→“SSH 客户端(S)”,选择 Git 自带的 SSH 客户端路径(如
C:\Program Files\Git\usr\bin\ssh.exe),点击“确定”。 - 打开本地仓库同步窗口,“远端 URL(U)”输入 GitHub 仓库的 SSH 地址(如
git@github.com:YourUsername/MyTest1.git),点击“推送(H)”,无需输入密码即可完成推送。
2.3.4.2 使用 Git Bash
- 关联远程仓库(若已关联 HTTPS 地址,可先删除旧关联:
git remote rm origin):
git remote add origin git@github.com:YourUsername/MyTest1.git
- 推送代码:
git push -u origin master
3. 从远程仓库克隆
3.1 使用 Git Bash
# SSH 协议(推荐)
git clone git@github.com:YourUsername/MyTest1.git
# HTTPS 协议
git clone https://github.com/YourUsername/MyTest1.git
# 克隆后会在当前目录生成“MyTest1”文件夹(仓库名),包含完整本地仓库
3.2 使用 TortoiseGit
- 在目标目录(如桌面)右键点击,选择“Git 克隆…”。
- 在克隆窗口“URL”输入远程仓库地址(SSH 或 HTTPS),“目录(D)”选择本地存储路径(如
C:\Users\YourName\Desktop\MyTest1),点击“确定”,克隆完成后生成包含.git目录的本地仓库。
4. 从远程仓库获取代码
4.1 git fetch(获取远程更新,不自动合并)
从远程仓库获取最新版本到本地,但不合并到当前工作分支,需手动确认后合并,更安全。
- 使用 Git Bash:
# 获取所有远程分支更新
git fetch origin
# 获取指定分支(如 master)更新
git fetch origin master
# 查看远程分支与本地分支差异
git diff master origin/master
# 手动合并远程更新到本地分支
git merge origin/master
- 使用 TortoiseGit:右键点击目录,选择“TortoiseGit”→“获取(E)…”,获取完成后需手动合并(选择“合并(M)…”)。
4.2 git pull(获取并自动合并远程更新)
相当于 git fetch + git merge,获取远程更新后自动合并到当前工作分支,操作简便但可能触发冲突(需解决冲突)。
- 使用 Git Bash:
# 拉取远程 master 分支并合并到本地当前分支
git pull origin master
- 使用 TortoiseGit:右键点击目录,选择“TortoiseGit”→“拉取§…”,选择远程分支后点击“确定”,自动完成获取与合并。
八、分支管理
1. 分支核心概念
- 主分支(master/main):Git 初始化仓库时自动创建的默认分支,用于存放稳定、可发布的代码,一般不直接在主分支上开发。
- 开发分支(dev):用于团队协作开发的分支,开发者在 dev 分支上进行功能开发,完成后合并到主分支。
- 功能分支(feature/*):针对单个功能的分支(如
feature/login),从 dev 分支创建,功能开发完成后合并回 dev 分支,再删除该分支。 - 修复分支(hotfix/*):用于修复生产环境 bug 的分支(如
hotfix/login-error),从 master 分支创建,修复完成后同时合并到 master 和 dev 分支,再删除该分支。
Git 分支本质是指向提交记录的指针,创建分支仅需新增指针,无需复制文件,操作高效。HEAD 指针指向当前所在分支,通过切换 HEAD 指向实现分支切换。
2. 分支基本操作
以创建 dev 分支为例。
2.1 创建分支
2.1.1 使用 Git Bash
# 创建 dev 分支
git branch dev
# 查看所有分支(当前分支前带 *)
git branch
# 输出示例:
# * master
# dev
2.1.2 使用 TortoiseGit
- 在本地仓库目录右键点击,选择“TortoiseGit”→“创建分支(B)…”。
- 在创建分支窗口“名称(N)”输入“dev”,“基于”选择“HEAD(H)(master)”,若需创建后直接切换到 dev 分支,勾选“切换到新分支(S)”,点击“确定”。
2.2 切换分支
2.2.1 使用 Git Bash
# 切换到 dev 分支
git checkout dev
# 输出示例:Switched to branch 'dev'
# 也可创建并切换分支(一步操作):git checkout -b dev
2.2.2 使用 TortoiseGit
- 右键点击目录,选择“TortoiseGit”→“切换/检出(W)…”。
- 在切换窗口“切换到”选择“分支(B)”→“dev”,点击“确定”。
2.3 合并分支
将 dev 分支合并到 master 分支。
2.3.1 使用 Git Bash
- 先切换到 master 分支:
git checkout master
- 合并 dev 分支到当前分支(master):
git merge dev
# 若合并无冲突,输出类似:Updating e83082a..f123456
# Fast-forward
# mytest.txt | 1 +
# 1 file changed, 1 insertion(+)
# (Fast-forward 表示快进合并,即 master 指针直接指向 dev 最新提交)
2.3.2 使用 TortoiseGit
- 切换到 master 分支(操作同分支切换)。
- 右键点击目录,选择“TortoiseGit”→“合并(M)…”。
- 在合并窗口“从”选择“分支(B)”→“dev”,点击“确定”,若无冲突,合并成功。
2.4 删除分支
合并后删除 dev 分支。
2.4.1 使用 Git Bash
# 删除 dev 分支(需先切换到其他分支,如 master)
git branch -d dev
# 若分支未合并,强制删除使用 git branch -D dev
2.4.2 使用 TortoiseGit
- 右键点击目录,选择“TortoiseGit”→“分支(B)…”。
- 在分支管理窗口选中“dev”分支,点击“删除®”,确认后删除。
3. 解决分支冲突
当两个分支修改了同一文件的同一部分内容,合并时会触发冲突,需手动解决。
3.1 冲突场景示例
- 在 master 分支修改“mytest.txt”,添加内容“master 分支添加内容”,提交:
git checkout master
# 编辑文件后提交
git add mytest.txt
git commit -m "master 分支修改 mytest.txt"
- 切换到 dev 分支,修改“mytest.txt”同一位置,添加内容“dev 分支添加内容”,提交:
git checkout dev
# 编辑文件后提交
git add mytest.txt
git commit -m "dev 分支修改 mytest.txt"
- 切换到 master 分支,合并 dev 分支,触发冲突:
git checkout master
git merge dev
# 输出示例:Auto-merging mytest.txt
# CONFLICT (content): Merge conflict in mytest.txt
# Automatic merge failed; fix conflicts and then commit the result.
3.2 解决冲突
3.2.1 使用 Git Bash
- 查看冲突文件,冲突部分会被特殊标记:
cat mytest.txt
# 输出示例:
# helloworld
# <<<<<<< HEAD
# master 分支添加内容
# =======
# dev 分支添加内容
# >>>>>>> dev
- 手动编辑文件,删除冲突标记(
<<<<<<<、=======、>>>>>>>),修改内容为最终需要的版本(如保留两者内容):
helloworld
master 分支添加内容
dev 分支添加内容
- 提交解决冲突后的文件:
git add mytest.txt
git commit -m "解决 master 与 dev 分支冲突"
# 无需填写日志,Git 会自动生成冲突解决日志,直接 git commit 即可
3.2.2 使用 TortoiseGit
- 合并触发冲突后,文件图标会显示感叹号,右键点击冲突文件,选择“TortoiseGit”→“解决冲突(O)…”。
- 弹出冲突解决窗口,查看冲突内容,手动编辑文件(或使用图形化对比工具选择保留内容),解决后点击“确定”。
- 右键点击目录,选择“Git 提交…”,提交解决冲突后的文件,完成合并。
九、Git 实用技巧
1. 设置 git commit 模板
通过模板强制规范提交日志格式,便于团队协作与版本追溯。
1.1 创建模板文件
在 C:/Users/YourName/.git 目录下创建 .gitmessage 文件,内容如下:
# -------------------------- Git Commit 规范模板 --------------------------
# 【必填】提交类型(scope): 简短描述(不超过50字符,结尾不加标点)
# 类型可选值:
# feat: 新功能(feature)
# fix: 修复 bug
# docs: 仅文档修改(如 README、注释)
# style: 仅格式调整(不影响代码逻辑,如空格、缩进、分号)
# refactor: 重构(既不是新功能也不是 bug 修复)
# perf: 性能优化
# test: 增加/修改测试用例
# chore: 构建/工具链变动(如依赖更新、配置修改、脚本调整)
# revert: 回滚某次提交
# scope:可选,指定修改范围(如模块/功能,例:user、payment、api)
# ------------------------------------------------------------------------
<type>(<scope>): <subject>
# 【可选】详细描述(多行,解释为什么改、改了什么、影响范围)
# 格式:
# - 采用 bullet 点说明(可选)
# - 每行不超过72字符
# - 空行分隔标题和正文
# ------------------------------------------------------------------------
[body]
# 【可选】脚注(用于标注特殊信息)
# 常用场景:
# 1. 关闭 Issue:Closes #123 / Fixes #456
# 2. 破坏性变更:BREAKING CHANGE: <描述>
# 3. 回滚说明:Reverts commit <commit-hash>
# ------------------------------------------------------------------------
[footer]
# -------------------------- 示例参考 --------------------------
# 示例1(新功能):
# feat(user): 新增用户手机号验证功能
#
# - 增加手机号格式校验规则
# - 对接短信验证码接口
# - 完善表单错误提示文案
#
# Closes #789
#
# 示例2(修复bug):
# fix(payment): 修复微信支付回调签名验证失败问题
#
# - 修复签名算法中参数排序错误
# - 增加回调日志打印便于排查
#
# 示例3(文档修改):
# docs(readme): 更新项目部署步骤说明
#
# 示例4(破坏性变更):
# refactor(api): 重构接口响应格式
#
# - 统一响应码和消息格式
# - 移除旧版兼容字段
#
# BREAKING CHANGE: 接口响应结构变更,需前端同步适配
1.2 配置模板
项目级配置(仅当前项目生效)
-
将上述模板保存为项目根目录的
.gitmessage文件; -
执行以下命令绑定模板:
git config --local commit.template .gitmessage -
后续执行
git commit时,编辑器会自动加载该模板,按提示填写即可。
全局配置(所有 Git 项目生效)
-
将模板保存到全局目录(如
~/.gitmessage); -
执行以下命令:
git config --global commit.template ~/.gitmessage
1.3 使用模板提交
执行 git commit 时,会自动打开模板文件,按模板格式填写日志后保存关闭,完成提交。
2. Pull Request(PR,代码审查流程)
PR 是团队协作中重要的代码审查机制,适用于向他人仓库贡献代码或团队内部代码审核,流程如下(对应原文档中 PR 流程说明):
- Fork 仓库:在 GitHub/Gitee 上点击目标仓库的“Fork”按钮,将仓库复制到自己账号下(如 Fork 他人的
project-demo仓库,生成YourUsername/project-demo)。 - Clone 到本地:将 Fork 后的仓库克隆到本地:
git clone git@github.com:YourUsername/project-demo.git
- 创建分支开发:创建功能分支并开发:
git checkout -b feature/new-function
# 开发完成后提交
git add .
git commit -m "feat(new-function): 添加新功能"
git push origin feature/new-function
- 发起 PR:在自己 Fork 的仓库页面(GitHub/Gitee),点击“Pull request”→“New pull request”,选择源分支(自己的
feature/new-function)和目标分支(原仓库的dev或master),填写 PR 描述(功能说明、修改内容等),点击“Create pull request”。 - 代码审查:原仓库维护者会查看 PR 中的代码,提出修改意见,开发者根据意见修改后推送,PR 会自动更新。
- 合并 PR:审查通过后,维护者点击“Merge pull request”,将代码合并到原仓库,PR 流程完成。
- 同步原仓库更新(可选):若后续需继续贡献,需同步原仓库最新代码到本地 Fork 仓库:
# 添加原仓库为远程仓库(命名为 upstream)
git remote add upstream git@github.com:OriginalOwner/project-demo.git
# 拉取原仓库更新
git fetch upstream
# 合并到本地分支
git merge upstream/master
十、常见问题与注意事项
- 忘记添加文件到暂存区:提交后发现遗漏文件,可补充添加并合并到上一次提交:
git add 遗漏文件.txt
git commit --amend --no-edit
# --no-edit 表示不修改上一次提交日志
- 误提交到错误分支:将修改提交到 master 分支,需转移到 dev 分支:
# 撤销 master 分支的提交(保留修改)
git reset --soft HEAD~1
# 切换到 dev 分支
git checkout dev
# 重新提交
git add .
git commit -m "原提交日志"
- 回滚已推送的错误提交:若错误提交已推送到远程仓库,需创建回滚提交:
# 查看提交记录,获取错误提交的哈希值(如 f123456)
git log --oneline
# 创建回滚提交
git revert f123456
# 推送回滚提交到远程
git push origin master
- 避免提交敏感信息:如密码、密钥等,需在
.gitignore中添加对应文件(如config.ini、secret.key),若已提交,需从版本库中删除并保留本地文件:
git rm --cached config.ini
# 更新 .gitignore 后提交
git add .gitignore
git commit -m "忽略 config.ini,移除版本库中的敏感文件"
-
SSH 连接失败:检查以下几点:
- 私钥文件(
id_rsa)权限是否正确(Windows 需设置为“仅当前用户可读写”,Linux/macOS 权限设置为chmod 600 ~/.ssh/id_rsa)。 - 公钥是否正确配置到 GitHub/Gitee,无多余空格或换行。
- 远程仓库地址是否为 SSH 协议(以
git@开头),而非 HTTPS 协议。
- 私钥文件(
-
冲突解决后提交:冲突解决后需先执行
git add标记冲突已解决,再执行git commit完成合并,不可直接提交。