JDWA 技术文档
首页
  • 数据库
  • 前端开发
  • 后端开发
  • 开发工具
  • 虚拟化技术
  • KVM显卡直通
  • FPGA仿真固件
  • 项目实战
  • 踩坑记录
  • 开发心得
  • 软件工具
  • 学习资料
  • 开发环境
更新日志
关于我
Gitee
GitHub
首页
  • 数据库
  • 前端开发
  • 后端开发
  • 开发工具
  • 虚拟化技术
  • KVM显卡直通
  • FPGA仿真固件
  • 项目实战
  • 踩坑记录
  • 开发心得
  • 软件工具
  • 学习资料
  • 开发环境
更新日志
关于我
Gitee
GitHub
  • 数据库

    • 数据库教程
    • MySQL免安装版使用指南
    • MySQL性能优化实践
    • Redis入门与实践
    • MinIO快速部署指南
    • MinIO基础使用教程
  • 前端开发

    • 前端开发教程
    • Vue.js开发最佳实践
    • CSS常用技巧与解决方案
    • JavaScript实用技巧与编程模式
    • CSS Grid布局教程
  • 后端开发

    • 后端开发教程
    • Spring Boot实战指南
    • Node.js Express 框架开发实战指南
    • Python Flask 框架开发指南
  • 开发工具

    • 开发工具教程
    • Git 基础教程
    • Git工作流实践指南
    • VS Code 全面使用指南
    • VS Code必装插件推荐
    • Docker基础入门
    • IntelliJ IDEA 使用技巧
    • Eclipse配置与优化
    • Sublime Text 高级技巧
    • Vim 从入门到精通
    • Maven 详解
    • Gradle 入门与进阶
    • Webpack 配置指南
    • npm 与 yarn 使用技巧
    • Makefile 编写指南
    • Navicat 使用指南
    • MCP本地部署教程
  • 虚拟化技术

    • JDWA虚拟化技术专题
    • KVM虚拟机去虚拟化技术详解
  • KVM显卡直通

    • KVM显卡GPU直通教程
  • FPGA仿真固件

    • FPGA仿真固件开发指南
    • 基础-完整设备仿真定制固件开发指南
    • 中级-完整设备仿真定制固件开发指南
    • 高级-完整设备仿真定制固件开发指南

Git 基础教程

Tips

本教程基于Git 2.30及以上版本,适用于Windows、macOS和Linux平台。适合Git初学者,无需任何版本控制系统经验。

1. Git简介

Git是目前世界上最流行的分布式版本控制系统,由Linux之父Linus Torvalds于2005年创建。它专为快速、高效地处理从小型到超大型项目的所有事务而设计。

1.1 什么是版本控制系统

版本控制系统(VCS)是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。它允许你:

  • 追踪文件的历史变更
  • 查看文件的修改记录
  • 恢复到之前的版本
  • 多人协作开发
  • 管理不同版本的代码

1.2 Git的特点

与其他版本控制系统相比,Git具有以下特点:

  • 分布式:每个开发者都拥有完整的代码库副本
  • 高性能:本地操作,快速高效
  • 数据完整性:使用SHA-1哈希算法确保数据完整性
  • 分支管理:强大的分支模型,轻量级分支
  • 灵活的工作流:支持多种工作流模式
  • 开源免费:自由使用和修改
  • 广泛采用:被绝大多数开源和商业项目采用

1.3 Git与其他版本控制系统的区别

与传统的集中式版本控制系统(如SVN)相比:

特性Git (分布式)SVN (集中式)
存储方式完整仓库镜像单一中央服务器
离线工作完全支持有限支持
分支管理轻量、快速重量级、慢
历史记录完整存储在本地存储在服务器
提交操作本地提交,远程推送直接提交到服务器
学习曲线较陡峭相对平缓
存储效率快照存储,高效差异存储

2. 安装与配置

2.1 在不同操作系统上安装Git

Windows安装:

  1. 从Git官网下载安装程序
  2. 运行安装程序,按照向导操作
  3. 推荐选择默认选项,但在选择默认编辑器时可以选择你熟悉的编辑器
  4. 安装完成后,可以使用Git Bash或命令提示符/PowerShell运行Git命令

macOS安装:

  1. 方法一:通过homebrew安装
    brew install git
    
  2. 方法二:从Git官网下载安装程序
  3. 方法三:安装Xcode命令行工具,其中包含Git
    xcode-select --install
    

Linux安装:

Ubuntu/Debian:

sudo apt update
sudo apt install git

CentOS/RHEL:

sudo yum install git

2.2 初次运行Git前的配置

安装Git后,需要进行一些基本配置:

设置用户名和邮箱(全局配置):

git config --global user.name "你的名字"
git config --global user.email "你的邮箱"

设置默认编辑器:

# 例如,设置为VS Code
git config --global core.editor "code --wait"

# 或设置为Vim
git config --global core.editor "vim"

配置行尾设置(在Windows上很重要):

# 自动转换行尾
git config --global core.autocrlf true  # Windows
git config --global core.autocrlf input # macOS/Linux

查看所有配置:

git config --list

配置别名(可选但推荐):

git config --global alias.st status
git config --global alias.ci commit
git config --global alias.co checkout
git config --global alias.br branch

2.3 Git配置文件位置

Git配置存储在三个不同的位置:

  1. 系统级配置:/etc/gitconfig
  2. 用户级配置:~/.gitconfig 或 ~/.config/git/config
  3. 仓库级配置:位于仓库中的 .git/config

配置的优先级:仓库级 > 用户级 > 系统级

3. Git基本概念

3.1 Git的三个区域

Git将文件管理分为三个区域:

  1. 工作区(Working Directory):实际的文件目录,你直接编辑的地方
  2. 暂存区(Staging Area/Index):临时存储你的改动,等待提交
  3. 仓库(Repository):永久存储提交的历史记录

Git三个区域

3.2 Git的文件状态

Git中的文件有四种主要状态:

  1. 未跟踪(Untracked):Git不知道的新文件
  2. 已跟踪(Tracked):Git已知道的文件,分为三种子状态:
    • 未修改(Unmodified):与上次提交相比没有变化
    • 已修改(Modified):与上次提交相比有变化
    • 已暂存(Staged):已将修改标记为下次提交的一部分

Git文件状态

3.3 Git对象模型

Git的内部是一个内容寻址文件系统,使用四种主要对象:

  1. 数据对象(blob):存储文件内容
  2. 树(tree):存储目录结构和文件名
  3. 提交(commit):指向树,包含作者、提交者、提交信息等元数据
  4. 标签(tag):指向特定提交的指针

每个对象都有一个SHA-1哈希值,用作其唯一标识符。

4. 基本Git操作

4.1 创建仓库

初始化新仓库:

# 在当前目录创建一个空仓库
git init

克隆现有仓库:

# 从远程服务器克隆仓库
git clone https://github.com/username/repository.git

# 克隆并指定本地目录名
git clone https://github.com/username/repository.git myproject

4.2 保存修改

检查状态:

# 查看文件状态
git status

# 查看简洁状态
git status -s

添加文件到暂存区:

# 添加单个文件
git add filename.txt

# 添加多个文件
git add file1.txt file2.txt

# 添加所有修改过的文件
git add .

# 添加特定类型的文件
git add *.txt

提交修改:

# 提交暂存的修改
git commit -m "提交说明信息"

# 跳过暂存区,直接提交所有已跟踪文件的修改
git commit -a -m "提交说明信息"

查看差异:

# 查看工作区与暂存区的差异
git diff

# 查看暂存区与最后一次提交的差异
git diff --staged

# 查看两次提交之间的差异
git diff commit1 commit2

4.3 撤销与恢复

撤销工作区修改:

# 撤销对单个文件的修改
git checkout -- filename.txt

# Git 2.23+的新命令
git restore filename.txt

取消暂存:

# 取消已暂存文件
git reset HEAD filename.txt

# Git 2.23+的新命令
git restore --staged filename.txt

修改最后一次提交:

# 修改最后一次提交信息
git commit --amend -m "新的提交信息"

# 在不修改提交信息的情况下添加遗漏的文件
git add forgotten_file.txt
git commit --amend --no-edit

回退到之前的提交:

# 软重置(保留修改但取消提交)
git reset --soft HEAD~1

# 混合重置(默认模式,保留修改但取消提交和暂存)
git reset HEAD~1
# 或
git reset --mixed HEAD~1

# 硬重置(完全丢弃修改)
git reset --hard HEAD~1

4.4 查看历史

查看提交历史:

# 查看完整历史
git log

# 查看简化历史(每次提交一行)
git log --oneline

# 查看图形化历史
git log --graph --oneline --all

# 查看特定文件的历史
git log --follow filename.txt

# 查看特定作者的提交
git log --author="名字"

# 按日期范围查看
git log --since="2023-01-01" --until="2023-12-31"

查看文件内容:

# 查看指定提交中的文件内容
git show commit:filename.txt

# 查看工作区中的文件内容
cat filename.txt

4.5 忽略文件

Git可以通过.gitignore文件忽略不需要跟踪的文件:

创建.gitignore文件:

touch .gitignore

常见的.gitignore规则:

# 忽略所有.log文件
*.log

# 不忽略特定的.log文件
!important.log

# 忽略build目录中的所有内容
build/

# 忽略特定文件
config.ini

查看忽略的文件:

git status --ignored

5. 分支管理

5.1 分支基础

查看分支:

# 列出本地分支
git branch

# 列出远程分支
git branch -r

# 列出所有分支(本地和远程)
git branch -a

# 查看每个分支的最后一次提交
git branch -v

创建分支:

# 创建新分支(但不切换)
git branch new-branch

# 创建并切换到新分支
git checkout -b new-branch

# Git 2.23+的新命令
git switch -c new-branch

切换分支:

# 切换到现有分支
git checkout branch-name

# Git 2.23+的新命令
git switch branch-name

删除分支:

# 删除已合并的分支
git branch -d branch-name

# 强制删除未合并的分支
git branch -D branch-name

5.2 合并分支

合并分支:

# 先切换到目标分支
git checkout main

# 合并指定分支到当前分支
git merge feature-branch

# 使用非快进方式合并(始终创建合并提交)
git merge --no-ff feature-branch

解决合并冲突: 当合并时发生冲突,需要手动解决:

  1. 查看冲突文件:git status
  2. 编辑冲突文件,寻找 <<<<<<<、=======、>>>>>>> 标记
  3. 修改文件内容以解决冲突
  4. 添加解决后的文件:git add filename.txt
  5. 完成合并:git commit

5.3 变基操作

变基(rebase)是另一种合并分支的方式,它会重写提交历史:

# 在feature分支上变基到main
git checkout feature
git rebase main

# 如果有冲突,解决后继续
git add .
git rebase --continue

# 放弃变基
git rebase --abort

交互式变基:

# 修改最近的3个提交
git rebase -i HEAD~3

5.4 远程分支

查看远程仓库:

# 列出远程仓库
git remote -v

# 添加远程仓库
git remote add origin https://github.com/username/repo.git

# 重命名远程仓库
git remote rename origin upstream

# 删除远程仓库引用
git remote remove upstream

推送到远程:

# 推送到远程分支
git push origin branch-name

# 设置上游分支并推送
git push -u origin branch-name

# 强制推送(谨慎使用)
git push --force origin branch-name

拉取远程更新:

# 获取远程更新但不合并
git fetch origin

# 获取并合并(相当于fetch+merge)
git pull origin branch-name

# 使用变基而不是合并
git pull --rebase origin branch-name

6. 高级Git功能

6.1 暂存工作

当需要临时切换到其他分支但又不想提交当前工作时:

# 保存当前工作
git stash

# 保存并添加描述
git stash save "暂存修改的描述"

# 查看暂存列表
git stash list

# 应用最近的暂存(但不删除)
git stash apply

# 应用并删除最近的暂存
git stash pop

# 应用特定的暂存
git stash apply stash@{2}

# 删除特定暂存
git stash drop stash@{1}

# 清除所有暂存
git stash clear

6.2 标签管理

Git可以给特定的提交创建标签,通常用于标记版本发布:

# 列出所有标签
git tag

# 创建轻量标签
git tag v1.0.0

# 创建附注标签(推荐)
git tag -a v1.0.0 -m "版本1.0.0发布"

# 为特定提交创建标签
git tag -a v0.9.0 -m "Beta版本" 9fceb02

# 推送标签到远程
git push origin v1.0.0

# 推送所有标签
git push origin --tags

# 删除本地标签
git tag -d v1.0.0

# 删除远程标签
git push origin --delete v1.0.0

6.3 查找问题

使用bisect二分查找:

当你想找出哪个提交引入了bug时,可以使用二分查找:

# 开始二分查找
git bisect start

# 标记当前版本有问题
git bisect bad

# 标记一个已知好的版本
git bisect good v1.0.0

# Git会检出中间的提交,测试后标记
git bisect good  # 或 git bisect bad

# 重复上述步骤直到找到问题提交

# 结束查找
git bisect reset

使用blame查看每行的最后修改:

# 查看文件每行的最后修改者
git blame filename.txt

# 只查看特定行
git blame -L 10,20 filename.txt

6.4 子模块

子模块允许你将一个Git仓库作为另一个Git仓库的子目录:

# 添加子模块
git submodule add https://github.com/username/library.git lib

# 初始化子模块(克隆仓库后)
git submodule init

# 更新子模块
git submodule update

# 克隆包括子模块的仓库
git clone --recurse-submodules https://github.com/username/project.git

# 更新所有子模块
git submodule update --remote

7. Git工作流

7.1 集中式工作流

最简单的工作流,类似于SVN:

  1. 所有开发者使用同一个主分支(通常是main)
  2. 直接在主分支上开发,不使用功能分支
  3. 适合小型团队和简单项目

7.2 功能分支工作流

每个新功能都在专门的分支上开发:

  1. 从主分支创建功能分支
  2. 在功能分支上开发
  3. 完成后,合并回主分支
  4. 删除功能分支

7.3 Git Flow工作流

一个更结构化的分支模型:

  1. 使用两个长期分支:
    • main/master:生产环境代码
    • develop:开发环境代码
  2. 三种临时分支:
    • feature/*:新功能开发
    • release/*:版本发布准备
    • hotfix/*:生产环境紧急修复

7.4 Forking工作流

常用于开源项目:

  1. 开发者fork主仓库
  2. 在自己的fork中开发
  3. 通过Pull Request贡献回主仓库
  4. 项目维护者审查并合并更改

8. 最佳实践

8.1 提交规范

原子提交:

  • 每个提交应该只做一件事
  • 不要将无关的更改混在一起

提交信息规范:

<类型>(<范围>): <简短描述>

<详细描述>

<相关issue>

类型示例:

  • feat: 新功能
  • fix: 修复bug
  • docs: 文档更改
  • style: 代码风格更改(不影响代码运行)
  • refactor: 重构
  • test: 添加或修改测试
  • chore: 构建过程或辅助工具的变动

8.2 保持提交历史干净

谨慎使用force push:

  • 不要在公共分支上使用force push
  • 使用--force-with-lease代替--force

使用交互式变基整理提交:

  • 合并相关提交
  • 拆分大型提交
  • 修正提交信息

8.3 分支管理策略

分支命名规范:

  • 功能分支:feature/描述
  • 修复分支:bugfix/描述或fix/描述
  • 热修复分支:hotfix/描述
  • 发布分支:release/版本号

定期同步分支:

  • 经常从主分支拉取更新
  • 解决合并冲突越早越好

9. Git图形化工具

9.1 内置GUI

Git自带简单的图形界面:

# 启动gitk查看历史
gitk

# 启动git gui进行提交
git gui

9.2 独立GUI工具

跨平台工具:

  • GitKraken: 功能强大,界面美观
  • Sourcetree: Atlassian开发的免费客户端
  • GitHub Desktop: 简单易用,与GitHub集成

Windows特有:

  • TortoiseGit: 资源管理器集成

macOS特有:

  • Tower: 专业Git客户端
  • Fork: 快速、友好的客户端

Linux特有:

  • Git Cola: 轻量级界面
  • Gitg: GNOME桌面集成

9.3 IDE集成

大多数现代IDE都内置了Git支持:

  • VS Code: Git集成和扩展
  • JetBrains IDEs (IntelliJ IDEA, PyCharm等): 强大的Git工具
  • Eclipse: 通过EGit插件
  • Visual Studio: 内置Git支持

10. 常见问题与解决方案

10.1 提交错误修复

修改最后一次提交:

git commit --amend

回退多个提交:

git reset --hard HEAD~3  # 回退3个提交

撤销公共提交:

git revert HEAD  # 撤销最新提交
git revert a1b2c3  # 撤销特定提交

10.2 解决特殊冲突

二进制文件冲突:

# 使用ours策略
git checkout --ours -- path/to/file.bin
git add path/to/file.bin

# 使用theirs策略
git checkout --theirs -- path/to/file.bin
git add path/to/file.bin

特定工具解决冲突:

git mergetool

10.3 大文件处理

移除大文件:

git filter-branch --force --tree-filter 'rm -f path/to/large/file' HEAD

使用Git LFS:

# 安装Git LFS
git lfs install

# 跟踪大文件
git lfs track "*.psd"

# 确保.gitattributes被提交
git add .gitattributes

10.4 性能问题

提高大型仓库性能:

# 清理和优化本地仓库
git gc

# 更全面的优化
git gc --aggressive

# 检查占用空间
git count-objects -v

总结

Git是一个强大而灵活的版本控制系统,掌握它的基本概念和操作对于现代软件开发至关重要。通过本教程,你已经了解了Git的核心概念、基本命令、分支管理和工作流模式。随着实践的深入,你将能够利用Git更高级的功能来提高工作效率和代码质量。

记住,Git最强大的功能之一是它的灵活性——没有一种"正确"的使用方式,而是要根据项目需求和团队习惯选择合适的工作流程。最重要的是保持一致性,制定团队规范,并持续改进你的Git使用技巧。

相关资源

  • Git官方文档
  • Pro Git书籍
  • Git分支可视化学习
  • Git团队协作最佳实践

如有问题或建议,欢迎联系作者: 1412800823@qq.com

Prev
开发工具教程
Next
Git工作流实践指南