Git 协作入门:核心指令与主流工具速学指南
# Git 协作入门:核心指令与主流工具速学指南 v1.0
# 概述
本篇文章属于速学指南,目标是使得读者能够尽快的拥有 Git 协作的基本技能。通过本篇文章,读者将能够掌握 Git 的基本操作,了解 Git 的协作流程,以及如何使用主流的 Git 工具进行协作。如需要深入的了解 Git 命令,可以参考官方文档或其他进阶教程。
文章由以下几部分组成,可根据自身需要自行跳转到相应章节浏览:
- Git 基础配置与命令速览
- Git 团队协作标准流程
- 主流 Git 工具操作指南
- 典型 Git 问题诊断与解决方案 本文操作系统以 Windows 系统为例,Linux/Mac 同理。
# Git 基础配置与命令速览
# Git 安装和对接 GitHub 和 Gitee 全流程
下载并安装 Git:访问 Git 官网 (opens new window) 下载适合自己操作系统的 Git 安装包,按照提示下一步即可完成安装。
配置 Git 用户信息:在 Git 自带的 Git Bash 终端中输入以下命令,将您的姓名和邮箱地址设置为 Git 用户信息。
git config --global user.name "Your Name" git config --global user.email "your.email@example.com"1
2生成 SSH 密钥(同时支持 GitHub 与 Gitee)
ssh-keygen -t rsa -b 4096 -C "your.email@example.com"1将生成的 SSH 密钥添加到 GitHub 或 Gitee 的账户中,以便后续使用 SSH 协议进行 Git 操作。
cat ~/.ssh/id_rsa.pub # 公钥1将生成的 SSH 密钥添加到 GitHub 或 Gitee 的账户中,以便后续使用 SSH 协议进行 Git 操作。 Gitee公钥添加位置:主页 - 设置 - SSH 公钥 - 添加公钥 GitHub公钥添加位置:主页 - Settings - SSH and GPG keys - SSH keys - New SSH key
# Git 核心概念
- 代码状态区域:工作区是编辑代码的地方,暂存区暂存准备提交的修改,版本库保存永久提交历史。
工作区 → 暂存区 → 版本库 - 提交(Commit):Git 的原子快照,每个提交有唯一哈希值,包含完整项目状态、作者信息和提交说明。
- 分支(Branch):指向提交的轻量级指针,允许并行开发互不干扰,HEAD 指针指向当前分支。
- 合并(Merge):将两个分支的修改整合,线性时快进合并,分叉时创建新的合并提交。
- 变基(Rebase):将提交重新应用到另一分支,使历史更线性整洁,但不要对已推送的提交使用。
- 远程仓库:服务器上的仓库副本,origin 是默认远程别名,是团队共享和协作代码的基础。
- 克隆(Clone):复制远程仓库到本地,包含完整历史并自动设置 origin 指向源仓库。
- 拉取(Pull):从远程获取最新代码并合并到当前分支,等同于 fetch + merge 或 fetch + rebase。
- 推送(Push):将本地提交上传到远程仓库,需要是快进关系否则需谨慎强制推送。
- 贮藏(Stash):临时保存未提交的修改清空工作区,便于切换分支或拉取代码后恢复继续工作。
- 合并冲突:两人修改同一处代码时 Git 无法自动决定保留哪个版本,需手动编辑解决。
- 忽略文件(.gitignore):指定编译产物、依赖目录等不应被 Git 跟踪的文件,支持通配符模式匹配。
# Git 基础命令
| 命令 | 作用 | 示例 |
|---|---|---|
| 初始化与克隆 | ||
git init | 初始化新仓库 | git init |
git clone [URL] | 克隆远程仓库到本地 | git clone git@github.com:user/repo.git |
| 提交与推送 | ||
git add . | 将所有修改加入暂存区 | git add . |
git add [文件名] | 将指定文件加入暂存区 | git add src/App.java |
git commit -m "消息" | 提交暂存区的修改 | git commit -m "fix: 修复登录bug" |
git commit --amend | 修改最后一次提交 | git commit --amend --no-edit |
git push | 推送到远程仓库 | git push |
git push -u origin [分支] | 推送并设置上游分支 | git push -u origin feature-login |
git pull | 拉取并合并远程更新 | git pull |
git pull --rebase | 以 rebase 方式拉取 | git pull --rebase |
| 分支操作 | ||
git branch | 查看本地分支 | git branch |
git branch [名称] | 创建新分支 | git branch feature-test |
git checkout [分支名] | 切换分支 | git checkout develop |
git checkout -b [名称] | 创建并切换到新分支 | git checkout -b feature-api |
git merge [分支名] | 合并分支到当前分支 | git merge feature-login |
git branch -d [分支名] | 删除已合并的分支 | git branch -d feature-test |
git branch -D [分支名] | 强制删除分支 | git branch -D test-branch |
| 查看状态与历史 | ||
git status | 查看工作区状态 | git status |
git log | 查看提交历史 | git log |
git log --oneline | 单行显示提交历史 | git log --oneline -10 |
git log --graph | 图形化显示分支历史 | git log --graph --all |
git diff | 查看工作区与暂存区差异 | git diff |
git diff [分支名] | 查看与指定分支的差异 | git diff develop |
| 常用辅助 | ||
git remote -v | 查看远程仓库地址 | git remote -v |
git fetch | 获取远程更新但不合并 | git fetch |
git fetch origin [分支] | 获取指定远程分支 | git fetch origin develop |
git stash | 暂存当前工作区修改 | git stash |
git stash pop | 恢复暂存的修改 | git stash pop |
git reset HEAD [文件] | 取消暂存区文件 | git reset HEAD README.md |
git checkout -- [文件] | 撤销工作区文件修改 | git checkout -- config.json |
# Git 团队协作标准流程
# 协作流程
协作流程为:从主分支拉取最新代码后创建功能分支,在功能分支上进行开发和频繁提交,开发完成后推送代码并提交 Pull Request,经团队 Code Review 通过后合并到主分支,最后删除功能分支。
具体步骤如下:
- 拉取最新代码:开始新任务前确保本地代码最新,图形化工具中点击「拉取」或「更新」按钮同步主分支更新
- 创建新分支:基于主分支创建新分支用于开发,创建分支不影响主分支,所有修改在新分支上进行,起一个能说明用途的名字
- 提交代码:完成一部分功能或修复问题后及时提交,保存工作进度,建议频繁提交而非一次性提交大量修改,每次提交附清晰的说明
- 推送到远程:提交到本地后推送到远程仓库,备份工作进度避免丢失,让团队成员看到进度更新
- 同步主分支更新:开发期间主分支有新更新时同步到分支,避免合并时产生大量冲突
- 提交 Pull Request:功能开发完成测试通过后提交 PR,请求团队审查代码并同意合并到主分支,说明改动内容、解决的问题和测试说明
- Code Review:团队成员查看 PR 代码,提出问题和改进建议,检查代码逻辑、Bug、风格一致性、冗余代码等
- 处理反馈:根据 Review 意见修改代码,再次推送更新,直到团队满意
- 合并代码:审查通过后选择合并方式(直接合并保留完整历史,压缩合并简化历史),将分支合并到主分支
- 删除分支:合并完成后删除功能分支,保持分支列表整洁
# 冲突解决
冲突产生的原理
Git 在对比代码时,如果发现两个人修改了同一文件的同一行或多行相邻代码,Git 无法自动判断应该保留哪个版本,就会产生冲突。这不是 Git 的问题,而是语义层面的选择问题——需要团队成员根据业务逻辑判断哪个版本才是正确的。
冲突不是故障,而是协作过程的正常组成部分,就像团队讨论时需要达成一致意见一样。
图形化工具解决冲突
现代 Git 图形化工具都提供了可视化的冲突解决界面,核心原理都相同:
- 左右分屏对比:左侧显示当前分支的代码,右侧显示合并进来的代码,差异部分高亮显示
- 逐个决策冲突:每个冲突节点都可以单独处理,选择「接受左侧」、「接受右侧」或「手动合并」
- 实时预览:选择后立即显示合并结果,可以反复调整直到满意
- 一键完成:所有冲突处理完毕后,点击「解决冲突」或「继续合并」按钮即可
这个过程在所有主流工具中都非常直观,不需要理解 Git 的底层标记符号,也不用手动编辑文件。
如何避免冲突
- 开始开发前先拉取最新代码
- 开发过程中定期同步主分支更新
- 与团队成员沟通开发计划,避免重复修改同一文件
- 将大功能拆分成多个小的提交
# 主流 Git 工具操作指南
本章节将介绍三种最常用的 Git 图形化工具的操作方法,帮助您快速上手团队协作。每种工具都有其特点和优势,您可以根据自己的使用习惯选择合适的工具。
# GitHub Desktop
工具介绍与下载
GitHub Desktop 是 GitHub 官方开发的桌面客户端,界面简洁、操作直观,非常适合 Git 初学者。支持 Windows 和 macOS 系统。
- 官方下载地址:https://desktop.github.com/ (opens new window)
- 特点:免费、轻量、与 GitHub 深度集成
基础界面说明
打开 GitHub Desktop 后,主界面分为三个主要区域:
- 左侧栏:显示当前仓库列表和分支列表
- 中间区域:显示文件变更列表和差异对比
- 右下角:提交信息输入区域
克隆仓库
- 点击菜单栏
File→Clone repository - 在弹出窗口中选择以下方式之一:
- GitHub.com (opens new window):显示您 GitHub 账户中的所有仓库,直接选择即可
- URL:输入仓库的 Git 地址(支持 HTTPS 或 SSH)
- 选择本地保存路径
- 点击
Clone按钮开始克隆
创建分支与提交
创建新分支:
- 点击顶部的当前分支名称(默认为
main或master) - 在下拉菜单中点击
New Branch - 输入分支名称,如
feature-login - 点击
Create Branch完成创建
提交代码:
- 修改代码后,GitHub Desktop 会自动检测变更
- 在左侧勾选要提交的文件(默认全选)
- 在右下角输入提交信息:
- Summary:简短描述(必填)
- Description:详细说明(可选)
- 点击
Commit to [分支名]按钮完成提交
推送与拉取
推送到远程:
- 提交后,顶部会显示
Push origin按钮 - 点击该按钮将本地提交推送到远程仓库
拉取远程更新:
- 顶部显示
Fetch origin时,点击获取远程更新 - 如果有新的提交,按钮会变为
Pull origin,点击合并到本地
合并与冲突解决
合并分支:
- 切换到目标分支(如
main) - 点击菜单
Branch→Merge into current branch - 选择要合并的分支
- 点击
Merge按钮
解决冲突:
- 合并时如果出现冲突,GitHub Desktop 会提示有冲突文件
- 点击冲突文件右侧的
Open in [编辑器]按钮 - 在编辑器中手动解决冲突(删除冲突标记,保留需要的代码)
- 保存文件后返回 GitHub Desktop
- 点击
Continue merge完成合并
# VSCode Git 集成
VSCode Git 功能概览
Visual Studio Code 内置了强大的 Git 支持,无需安装额外插件即可完成大部分 Git 操作。对于前端开发者和使用 VSCode 的开发者来说,这是最便捷的选择。
前提条件:
- 已安装 Git
- 已安装 VSCode
- VSCode 会自动检测系统中的 Git
源代码管理面板使用
打开源代码管理面板:
- 点击左侧活动栏的 源代码管理图标(分支图标)
- 或使用快捷键:
Ctrl + Shift + G(Windows/Linux)或Cmd + Shift + G(macOS)
面板功能:
- CHANGES:显示已修改但未暂存的文件
- STAGED CHANGES:显示已暂存的文件
- SOURCE CONTROL:显示提交历史和分支信息
克隆仓库
- 按
F1或Ctrl+Shift+P打开命令面板 - 输入
Git: Clone并选择 - 输入仓库 URL
- 选择本地保存位置
- 克隆完成后选择
Open打开项目
提交与推送
暂存文件:
- 在源代码管理面板中,点击文件右侧的 + 图标暂存单个文件
- 点击 CHANGES 右侧的 + 图标暂存所有文件
提交代码:
- 在源代码管理面板顶部的输入框中输入提交信息
- 点击 ✓ (对勾)图标提交
- 或使用快捷键:
Ctrl + Enter(Windows/Linux)或Cmd + Enter(macOS)
推送到远程:
- 提交后,点击状态栏左下角的 ↑ 图标推送
- 或点击源代码管理面板顶部的 ... →
Push
拉取远程更新:
- 点击状态栏左下角的 ↓ 图标拉取
- 或点击源代码管理面板顶部的 ... →
Pull
分支切换与创建
查看和切换分支:
- 点击状态栏左下角的分支名称
- 在弹出的列表中选择要切换的分支
创建新分支:
- 点击状态栏左下角的分支名称
- 选择
Create new branch... - 输入分支名称并按 Enter
- 新分支会自动基于当前分支创建并切换
或使用命令面板:
- 按
F1打开命令面板 - 输入
Git: Create Branch并选择 - 输入分支名称
冲突解决
当拉取或合并代码时出现冲突:
- VSCode 会自动标记冲突文件,在源代码管理面板中显示 ! 标记
- 打开冲突文件,VSCode 会高亮显示冲突区域
- 冲突区域会显示四个操作按钮:
- Accept Current Change:保留当前分支的修改
- Accept Incoming Change:保留合并进来的修改
- Accept Both Changes:同时保留两者
- Compare Changes:对比差异
- 选择合适的操作或手动编辑代码
- 解决所有冲突后,暂存文件并提交
常用插件推荐
GitLens —— Git 增强插件(强烈推荐)
安装方式:
- 点击左侧活动栏的扩展图标
- 搜索
GitLens - 点击
Install安装
主要功能:
- 行内 Git 信息:在每行代码末尾显示最后修改者和时间
- 文件历史:可视化查看文件的完整修改历史
- 代码作者追踪:快速定位某行代码的作者和提交信息
- 分支对比:可视化对比不同分支的差异
- 提交图表:图形化显示提交历史和分支关系
使用技巧:
- 点击代码行末尾的 Git 信息可查看详细的提交详情
- 在源代码管理面板中查看
FILE HISTORY了解文件演变 - 使用
Git: Show Commit Graph命令查看可视化提交图
# IDEA 系列 Git 集成
IDEA/WebStorm/PyCharm Git 功能
JetBrains 系列 IDE(IntelliJ IDEA、WebStorm、PyCharm、GoLand 等)都内置了功能强大的 Git 工具,操作方式基本一致。本节以 IDEA 为例,其他 IDE 操作完全相同。
前提条件:
- 已安装 Git
- IDE 会在首次使用时自动配置 Git 路径
- 如需手动配置:
Settings→Version Control→Git
克隆仓库
- 启动 IDEA,在欢迎界面选择
Get from VCS - 或在已打开项目中选择
Git→Clone - 在弹出窗口中:
- URL:输入仓库地址
- Directory:选择本地保存路径
- 点击
Clone开始克隆 - 克隆完成后 IDEA 会自动打开项目
VCS 操作面板
IDEA 的 Git 功能主要分布在以下位置:
- 顶部菜单:
Git菜单包含所有 Git 操作 - 工具栏:快捷操作按钮(更新、提交、推送等)
- 左侧项目树:文件颜色标记修改状态
- 蓝色:文件已修改
- 绿色:新增文件
- 红色:文件未加入版本控制
- 灰色:文件被忽略
- 底部工具窗口:
Git窗口显示提交历史和分支
提交与推送
提交代码:
- 点击工具栏的 √ 图标或使用快捷键
Ctrl + K(Windows/Linux)或Cmd + K(macOS) - 在提交窗口中:
- 勾选要提交的文件
- 在
Commit Message中输入提交信息 - 可选:点击右侧的
Commit Checks查看代码检查结果
- 点击
Commit按钮(仅提交到本地) - 或点击
Commit and Push...(提交并立即推送)
推送到远程:
- 点击工具栏的 ↑ 图标或使用快捷键
Ctrl + Shift + K(Windows/Linux)或Cmd + Shift + K(macOS) - 在弹出窗口中确认要推送的提交
- 点击
Push按钮
拉取远程更新:
- 点击工具栏的 ↓ 图标或使用快捷键
Ctrl + T(Windows/Linux)或Cmd + T(macOS) - 在弹出窗口中选择更新方式:
- Merge:合并远程更新
- Rebase:变基方式更新
- 点击
OK执行更新
分支管理
查看和切换分支:
- 点击右下角的当前分支名称
- 在弹出的分支列表中:
- Local Branches:本地分支
- Remote Branches:远程分支
- 点击分支名称选择
Checkout切换分支
创建新分支:
- 点击右下角的分支名称
- 选择
New Branch - 输入分支名称
- 勾选
Checkout branch自动切换到新分支 - 点击
Create完成创建
合并分支:
- 切换到目标分支(如
main) - 点击右下角分支名称
- 选择要合并的分支,点击
Merge into Current - 确认合并操作
删除分支:
- 点击右下角分支名称
- 找到要删除的分支,右键选择
Delete - 确认删除操作
冲突解决
当拉取或合并代码时出现冲突:
- IDEA 会弹出
Conflicts对话框,显示所有冲突文件 - 点击
Merge按钮打开三方合并工具 - 三方合并界面说明:
- 左侧:当前分支的代码(Your Version)
- 中间:合并结果(Result)
- 右侧:合并进来的代码(Server Version)
- 底部:原始代码(Base Version)
- 操作方式:
- 点击左右两侧的 >> 或 X 图标选择接受或拒绝某个修改
- 或在中间结果区域直接手动编辑代码
- 解决完所有冲突后点击
Apply保存 - 返回提交窗口,提交解决冲突后的代码
Git 工具窗口使用
打开 Git 工具窗口:
- 点击底部的
Git标签 - 或使用快捷键
Alt + 9(Windows/Linux)或Cmd + 9(macOS)
Git 窗口功能:
Log 标签(提交历史):
- 查看所有分支的提交历史
- 图形化显示分支关系
- 右键提交可执行:
Cherry-Pick:挑选提交Revert Commit:撤销提交Reset Current Branch to Here:重置分支到此提交
- 双击提交查看详细修改内容
Console 标签(控制台):
- 显示所有 Git 操作的命令行输出
- 可直接输入 Git 命令执行
实用技巧:
- 对比差异:右键文件选择
Compare with...可对比不同版本 - 文件历史:右键文件选择
Git→Show History查看文件的完整修改历史 - 注释追踪:右键代码行选择
Git→Annotate查看每行代码的最后修改者和时间 - 本地历史:IDEA 独有功能,即使没有提交也会自动保存本地历史,
右键→Local History查看
# 典型 Git 问题诊断与解决方案
本章节汇总了团队协作中最常遇到的 Git 问题及其解决方法。遇到问题时,先不要慌张,按照提示逐步操作即可。如果图形化工具无法解决,可以尝试使用命令行工具。
# 提交相关问题
问题 1:提交了错误的文件或信息
场景:刚刚提交后发现提交信息写错了,或者不小心提交了不该提交的文件。
解决方法(仅针对最后一次提交,且未推送到远程):
# 修改最后一次提交的信息(不改文件)
git commit --amend -m "正确的提交信息"
# 添加遗漏的文件到最后一次提交
git add forgotten-file.txt
git commit --amend --no-edit
# 从最后一次提交中移除某个文件
git reset HEAD^ -- unwanted-file.txt
git commit --amend --no-edit
2
3
4
5
6
7
8
9
10
注意:
--amend会修改提交历史,只能用于未推送的提交- 如果已经推送到远程,不建议使用此方法
问题 2:想撤销最后一次提交
场景:提交后发现整个提交都有问题,想完全撤销。
解决方法:
# 撤销提交,保留文件修改(推荐)
git reset --soft HEAD^
# 撤销提交,文件修改保留在工作区
git reset --mixed HEAD^
# 撤销提交,完全删除修改(危险!)
git reset --hard HEAD^
2
3
4
5
6
7
8
三种模式对比:
--soft:撤销提交,修改回到暂存区--mixed:撤销提交,修改回到工作区--hard:撤销提交,完全丢弃修改
问题 3:想修改历史提交记录
场景:需要修改几个提交之前的某个提交。
解决方法(高级操作,谨慎使用):
# 交互式变基,修改最近 3 个提交
git rebase -i HEAD~3
# 在打开的编辑器中:
# pick → edit(修改该提交)
# pick → squash(合并到前一个提交)
# pick → drop(删除该提交)
2
3
4
5
6
7
注意:
- 不要修改已推送到远程的提交
- 修改历史会改变提交哈希值,影响其他协作者
# 分支相关问题
问题 4:误删了分支
场景:不小心删除了还需要的分支。
解决方法:
# 查看最近的操作记录
git reflog
# 找到删除前的提交哈希值(如 abc1234),恢复分支
git checkout -b recovered-branch abc1234
2
3
4
5
说明:
reflog记录了所有 HEAD 的移动历史- 通常可以恢复最近 30 天内的操作
问题 5:切换分支时提示有未提交的修改
场景:想切换分支,但当前分支有未提交的修改,Git 不允许切换。
解决方法:
# 方法 1:暂存当前修改
git stash
git checkout other-branch
# 切换回来后恢复修改
git checkout original-branch
git stash pop
# 方法 2:强制切换(会丢失修改,慎用)
git checkout -f other-branch
# 方法 3:先提交修改
git add .
git commit -m "临时提交"
git checkout other-branch
2
3
4
5
6
7
8
9
10
11
12
13
14
推荐使用 stash 方法,最安全。
问题 6:分支合并错误,想撤销合并
场景:合并后发现合并错了分支,或者合并产生了问题。
解决方法(未推送到远程):
# 撤销最后一次合并
git reset --hard HEAD~1
# 或者使用 ORIG_HEAD(指向合并前的状态)
git reset --hard ORIG_HEAD
2
3
4
5
解决方法(已推送到远程):
# 创建一个反向提交来撤销合并
git revert -m 1 <merge-commit-hash>
2
# 远程仓库问题
问题 7:推送被拒绝(rejected)
场景:执行 git push 时提示 rejected,推送失败。
常见原因及解决方法:
原因 1:远程有新提交
# 先拉取远程更新,再推送
git pull
git push
# 或使用 rebase 方式(历史更整洁)
git pull --rebase
git push
2
3
4
5
6
7
原因 2:本地分支未关联远程分支
# 推送并设置上游分支
git push -u origin branch-name
2
原因 3:强制推送需要权限
# 确认无误后,强制推送(危险操作)
git push --force
# 更安全的强制推送(不会覆盖他人提交)
git push --force-with-lease
2
3
4
5
注意:除非明确知道在做什么,否则不要使用 --force。
问题 8:远程仓库地址错误或需要修改
场景:克隆时使用了 HTTPS,想改成 SSH;或者仓库迁移了。
解决方法:
# 查看当前远程仓库地址
git remote -v
# 修改远程仓库地址
git remote set-url origin git@github.com:user/repo.git
# 添加新的远程仓库
git remote add upstream git@github.com:original/repo.git
# 删除远程仓库
git remote remove origin
2
3
4
5
6
7
8
9
10
11
问题 9:本地与远程分支不一致
场景:提示 Your branch is ahead/behind 或无法同步。
解决方法:
# 本地领先远程(本地有未推送的提交)
git push
# 本地落后远程(远程有未拉取的提交)
git pull
# 本地和远程完全分叉
git pull --rebase
# 或者
git fetch
git merge origin/main
2
3
4
5
6
7
8
9
10
11
# 冲突处理进阶
问题 10:复杂冲突不知如何解决
场景:冲突涉及多个文件和多处修改,不确定该保留哪个版本。
解决策略:
# 查看冲突文件列表
git status
# 查看冲突的详细差异
git diff
# 完全接受当前分支的版本
git checkout --ours conflicted-file.txt
# 完全接受合并进来的版本
git checkout --theirs conflicted-file.txt
# 如果实在无法解决,中止合并
git merge --abort
2
3
4
5
6
7
8
9
10
11
12
13
14
建议:
- 一次只解决一个文件的冲突
- 与代码作者沟通确认正确的版本
- 使用图形化工具的三方对比功能
问题 11:中断合并后的恢复
场景:合并到一半出现问题,执行了 git merge --abort,想重新合并。
解决方法:
# 确保工作区干净
git status
# 重新执行合并
git merge branch-name
# 如果需要恢复到合并前的状态
git reset --hard ORIG_HEAD
2
3
4
5
6
7
8
问题 12:二进制文件冲突
场景:图片、PDF 等二进制文件产生冲突。
解决方法:
# 二进制文件无法合并,只能选择一个版本
# 保留当前分支的版本
git checkout --ours image.png
# 保留合并进来的版本
git checkout --theirs image.png
# 标记为已解决
git add image.png
2
3
4
5
6
7
8
9
建议:尽量避免多人同时修改二进制文件。
# 常见错误提示
问题 13:detached HEAD 状态
提示信息:You are in 'detached HEAD' state
含义:HEAD 指向了某个具体的提交,而不是分支。
解决方法:
# 如果不需要保留修改,直接切换到分支
git checkout main
# 如果需要保留修改,创建新分支
git checkout -b new-branch-name
# 或者将修改应用到现有分支
git checkout main
git merge <commit-hash>
2
3
4
5
6
7
8
9
问题 14:fatal: refusing to merge unrelated histories
场景:合并两个没有共同祖先的仓库。
解决方法:
# 允许合并不相关的历史
git pull origin main --allow-unrelated-histories
2
常见于:
- 本地初始化仓库后连接远程仓库
- 合并两个独立的项目
问题 15:Permission denied (publickey)
场景:使用 SSH 推送或拉取时提示权限错误。
解决方法:
# 检查 SSH 密钥是否存在
ls -al ~/.ssh
# 如果没有,生成新密钥
ssh-keygen -t rsa -b 4096 -C "your.email@example.com"
# 将公钥添加到 GitHub/Gitee
cat ~/.ssh/id_rsa.pub
# 测试 SSH 连接
ssh -T git@github.com
2
3
4
5
6
7
8
9
10
11
# 工作区与暂存区问题
问题 16:撤销工作区的修改
场景:修改了文件但还未暂存,想恢复到修改前的状态。
解决方法:
# 撤销单个文件的修改
git checkout -- filename.txt
# 撤销所有文件的修改
git checkout -- .
# 或使用新版本命令
git restore filename.txt
git restore .
2
3
4
5
6
7
8
9
问题 17:取消已暂存的文件
场景:执行了 git add 后想撤销暂存。
解决方法:
# 取消单个文件的暂存
git reset HEAD filename.txt
# 取消所有文件的暂存
git reset HEAD .
# 或使用新版本命令
git restore --staged filename.txt
git restore --staged .
2
3
4
5
6
7
8
9
问题 18:删除未跟踪的文件
场景:工作区有很多未跟踪的文件(编译产物等),想清理。
解决方法:
# 查看会删除哪些文件(预览)
git clean -n
# 删除未跟踪的文件
git clean -f
# 删除未跟踪的文件和目录
git clean -fd
# 删除未跟踪的文件、目录和被忽略的文件
git clean -fdx
2
3
4
5
6
7
8
9
10
11
注意:git clean 会永久删除文件,使用前请确认。
# 附录
# Git 最佳实践
分支命名规范
命名原则:
- 使用小写字母和连字符
- 简洁明了,能说明分支用途
- 包含类型前缀和具体描述
代码提交频率建议
- 小步快跑:完成一个小功能就提交,不要积累太多修改
- 原子提交:每次提交只做一件事,便于回滚和代码审查
- 有意义的提交:避免「临时保存」「测试」等无意义的提交信息
- 推送前整理:可以使用
git rebase -i整理本地提交后再推送
分支管理策略
Git Flow(适合版本发布明确的项目)
main:生产环境代码develop:开发环境代码feature/*:功能分支release/*:发布分支hotfix/*:热修复分支
# .gitignore 常用模板
.gitignore 文件用于指定哪些文件不应被 Git 跟踪。
通用模板
# 操作系统文件
.DS_Store
Thumbs.db
# 编辑器和 IDE
.vscode/
.idea/
*.swp
*.swo
*~
# 日志文件
*.log
logs/
# 临时文件
*.tmp
*.temp
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Java 项目
# 编译输出
target/
out/
*.class
# Maven
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
# Gradle
.gradle/
build/
# IDE
.idea/
*.iml
# 日志
*.log
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
前端项目(React/Vue)
# 依赖
node_modules/
# 构建输出
dist/
build/
.next/
.nuxt/
# 缓存
.cache/
.parcel-cache/
# 环境变量
.env
.env.local
.env.*.local
# 测试
coverage/
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
创建 .gitignore 文件:
# 在项目根目录创建
touch .gitignore
# 用文本编辑器去编辑文件添加规则
2
3
4
提示:可以访问 gitignore.io (opens new window) 在线生成适合您项目的 .gitignore 模板。
# 进阶学习资源
官方文档
Git 官方文档:https://git-scm.com/doc (opens new window)
最权威的 Git 文档,包含完整的命令参考和使用指南
Git 官方教程:https://git-scm.com/book/zh/v2 (opens new window)
《Pro Git》中文版,全面系统的 Git 学习书籍
GitHub 文档:https://docs.github.com (opens new window)
GitHub 平台使用指南,包含协作流程和最佳实践
推荐教程
Learn Git Branching:https://learngitbranching.js.org/ (opens new window)
交互式 Git 分支学习工具,可视化展示 Git 操作,强烈推荐
Git 简明指南:https://rogerdudler.github.io/git-guide/index.zh.html (opens new window)
简洁易懂的 Git 入门指南
廖雪峰 Git 教程:https://www.liaoxuefeng.com/wiki/896043488029600 (opens new window)
适合中文读者的详细教程
实践平台
GitHub Skills:https://skills.github.com/ (opens new window)
GitHub 官方提供的实践课程
Gitee 学习资源:https://gitee.com/help (opens new window)
Gitee 平台的帮助文档
进阶话题
学完本指南后,可以继续深入学习:
- Git Hooks:自动化脚本,在特定 Git 事件时触发
- Git Submodules:在项目中包含其他 Git 仓库
- Git LFS:大文件存储方案
- CI/CD 集成:将 Git 与持续集成工具结合
- 代码审查工具:Gerrit、Review Board 等
结语
恭喜您完成本篇 Git 协作速学指南!通过本文的学习,您应该已经掌握了:
✅ Git 的基本概念和核心命令
✅ 团队协作的标准流程
✅ 主流 Git 工具的使用方法
✅ 常见问题的诊断与解决方案
Git 是一个功能强大的工具,实践是最好的学习方式。建议您:
- 创建一个测试仓库,尝试本文介绍的各种操作
- 在实际项目中应用所学知识
- 遇到问题时查阅本文的问题诊断章节
- 持续学习进阶话题,提升 Git 使用技能
记住:犯错是学习的一部分,Git 的强大之处在于几乎所有操作都可以撤销。保持耐心,多加练习,很快就能熟练掌握 Git!祝各使用愉快!🎉