Git 完整学习指南

目录


1. Git 基础概念

1.1 什么是 Git?

Git 是一个分布式版本控制系统,用于跟踪文件的变化并协调多人协作开发。

核心特点
  • 分布式: 每个开发者都有完整的代码历史
  • 快速: 大部分操作都在本地进行
  • 数据完整性: 使用 SHA-1 哈希确保数据完整性
  • 分支管理: 轻量级的分支创建和合并

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

特性Git (分布式)SVN (集中式)
存储方式每个节点都有完整历史只有中央服务器有完整历史
离线工作支持不支持
分支操作快速、轻量慢、重量级
合并能力强大相对较弱

1.3 Git 的三个区域

工作区 (Working Directory)
    ↓ git add
暂存区 (Staging Area)
    ↓ git commit
本地仓库 (Local Repository)
    ↓ git push
远程仓库 (Remote Repository)
  • 工作区: 你正在编辑的文件所在的目录
  • 暂存区: 准备提交的文件快照
  • 本地仓库: Git 存储项目历史的地方
  • 远程仓库: 托管在服务器上的仓库

1.4 文件状态

Git 中的文件有四种状态:

  • 未跟踪 (Untracked): 新创建的文件,Git 还不知道
  • 已修改 (Modified): 文件已修改但未暂存
  • 已暂存 (Staged): 文件已添加到暂存区
  • 已提交 (Committed): 文件已保存到本地仓库

2. Git 安装与配置

2.1 安装 Git

Windows
  1. 访问 Git 官网
  2. 下载 Windows 版本
  3. 运行安装程序,建议选择以下选项:
    • 选择 “Git from the command line and also from 3rd-party software”
    • 选择 “Use the OpenSSL library”
    • 选择 “Checkout Windows-style, commit Unix-style line endings”
macOS
# 使用 Homebrew
brew install git

# 或者下载官方安装包
# 访问 https://git-scm.com/download/mac
Linux (Ubuntu/Debian)
sudo apt update
sudo apt install git
Linux (CentOS/RHEL)
sudo yum install git
# 或者
sudo dnf install git

2.2 验证安装

git --version

2.3 初始配置

设置用户信息
# 设置全局用户名和邮箱
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"

# 查看配置
git config --list

# 查看特定配置
git config user.name
git config user.email
其他有用的配置
# 设置默认编辑器
git config --global core.editor "code --wait"  # VS Code
git config --global core.editor "vim"          # Vim

# 设置默认分支名
git config --global init.defaultBranch main

# 启用颜色输出
git config --global color.ui auto

# 设置换行符处理 (Windows)
git config --global core.autocrlf true

# 设置换行符处理 (macOS/Linux)
git config --global core.autocrlf input

# 忽略文件权限变化 (仅限 Unix 系统)
git config --global core.filemode false
配置级别
# 系统级配置 (影响所有用户)
git config --system

# 全局配置 (影响当前用户)
git config --global

# 本地配置 (仅影响当前仓库)
git config --local

3. Git 基本操作

3.1 创建仓库

初始化新仓库
# 在当前目录初始化
git init

# 在指定目录初始化
git init my-project
cd my-project
克隆现有仓库
# 克隆远程仓库
git clone https://github.com/user/repo.git

# 克隆到指定目录
git clone https://github.com/user/repo.git my-folder

# 克隆指定分支
git clone -b branch-name https://github.com/user/repo.git

3.2 基本工作流程

1. 查看状态
# 查看工作区状态
git status

# 简洁输出
git status -s
2. 添加文件到暂存区
# 添加单个文件
git add filename.txt

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

# 添加所有文件
git add .

# 添加所有 .js 文件
git add *.js

# 交互式添加
git add -i
3. 提交更改
# 提交暂存区的文件
git commit -m "提交信息"

# 提交并添加详细描述
git commit -m "简短描述" -m "详细描述"

# 跳过暂存区直接提交 (仅限已跟踪文件)
git commit -am "提交信息"

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

3.3 查看历史

查看提交历史
# 查看提交历史
git log

# 简洁的一行显示
git log --oneline

# 显示图形化分支
git log --graph --oneline

# 显示最近 n 次提交
git log -n 5

# 显示某个文件的历史
git log filename.txt

# 显示提交的详细信息
git log -p

# 显示统计信息
git log --stat
查看具体更改
# 查看工作区与暂存区的差异
git diff

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

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

# 查看特定文件的差异
git diff filename.txt

3.4 撤销操作

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

# 撤销所有文件的修改
git checkout -- .

# 新版本 Git 推荐使用
git restore filename.txt
git restore .
撤销暂存区的文件
# 将文件从暂存区移除 (保留工作区修改)
git reset HEAD filename.txt

# 新版本 Git 推荐使用
git restore --staged filename.txt

4. 分支管理

4.1 分支基础概念

分支是 Git 最强大的功能之一,它允许你在不影响主代码的情况下开发新功能。

分支的优势
  • 并行开发: 多个功能可以同时开发
  • 实验安全: 可以安全地尝试新想法
  • 版本隔离: 不同版本的代码可以独立存在

4.2 分支基本操作

查看分支
# 查看本地分支
git branch

# 查看所有分支 (包括远程)
git branch -a

# 查看远程分支
git branch -r

# 查看分支详细信息
git branch -v
创建分支
# 创建新分支
git branch feature-login

# 创建并切换到新分支
git checkout -b feature-login

# 新版本 Git 推荐使用
git switch -c feature-login

# 基于特定提交创建分支
git branch feature-login commit-hash
切换分支
# 切换到指定分支
git checkout feature-login

# 新版本 Git 推荐使用
git switch feature-login

# 切换到上一个分支
git switch -
删除分支
# 删除已合并的分支
git branch -d feature-login

# 强制删除分支 (即使未合并)
git branch -D feature-login

# 删除远程分支
git push origin --delete feature-login

4.3 分支合并

快进合并 (Fast-forward)
# 切换到目标分支
git switch main

# 合并分支
git merge feature-login
三方合并 (Three-way merge)
# 当分支有分叉时,Git 会创建合并提交
git merge feature-login

# 禁用快进合并,强制创建合并提交
git merge --no-ff feature-login
变基合并 (Rebase)
# 将当前分支的提交重新应用到目标分支
git rebase main

# 交互式变基
git rebase -i main

# 变基时解决冲突后继续
git rebase --continue

# 取消变基
git rebase --abort

4.4 解决合并冲突

当两个分支修改了同一文件的同一部分时,会产生冲突:

冲突标记
<<<<<<< HEAD
当前分支的内容
=======
要合并分支的内容
>>>>>>> feature-branch
解决冲突步骤
  1. 查看冲突文件:git status
  2. 编辑冲突文件,删除冲突标记,保留需要的内容
  3. 添加解决后的文件:git add filename.txt
  4. 完成合并:git commit
冲突解决工具
# 使用图形化工具解决冲突
git mergetool

# 配置合并工具
git config --global merge.tool vimdiff

5. 远程仓库

5.1 远程仓库基础

查看远程仓库
# 查看远程仓库
git remote

# 查看远程仓库详细信息
git remote -v

# 查看特定远程仓库信息
git remote show origin
添加远程仓库
# 添加远程仓库
git remote add origin https://github.com/user/repo.git

# 添加多个远程仓库
git remote add upstream https://github.com/original/repo.git
修改远程仓库
# 修改远程仓库 URL
git remote set-url origin https://github.com/user/new-repo.git

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

# 删除远程仓库
git remote remove origin

5.2 推送和拉取

推送到远程仓库
# 推送当前分支到远程仓库
git push origin main

# 推送所有分支
git push origin --all

# 推送标签
git push origin --tags

# 设置上游分支 (首次推送)
git push -u origin main

# 强制推送 (危险操作)
git push --force origin main
从远程仓库拉取
# 获取远程仓库的更新 (不合并)
git fetch origin

# 获取并合并远程分支
git pull origin main

# 拉取时使用变基
git pull --rebase origin main

# 拉取所有远程分支
git fetch --all

5.3 跟踪分支

设置跟踪分支
# 创建跟踪远程分支的本地分支
git checkout -b feature origin/feature

# 设置当前分支跟踪远程分支
git branch --set-upstream-to=origin/main main

# 查看跟踪关系
git branch -vv

5.4 常见远程操作场景

协作开发流程
# 1. 克隆仓库
git clone https://github.com/team/project.git

# 2. 创建功能分支
git checkout -b feature-new-function

# 3. 开发并提交
git add .
git commit -m "Add new function"

# 4. 推送分支
git push origin feature-new-function

# 5. 在 GitHub/GitLab 创建 Pull Request/Merge Request

# 6. 合并后删除本地分支
git checkout main
git pull origin main
git branch -d feature-new-function
同步 Fork 仓库
# 添加上游仓库
git remote add upstream https://github.com/original/repo.git

# 获取上游更新
git fetch upstream

# 合并上游主分支
git checkout main
git merge upstream/main

# 推送到自己的仓库
git push origin main

6. 版本回退与修改

6.1 查看历史版本

查看提交历史
# 查看提交历史
git log --oneline

# 查看文件的修改历史
git log -p filename.txt

# 查看某个提交的详细信息
git show commit-hash

# 查看引用日志 (包括被删除的提交)
git reflog

6.2 版本回退

软回退 (保留工作区和暂存区)
# 回退到上一个版本
git reset --soft HEAD~1

# 回退到指定版本
git reset --soft commit-hash
混合回退 (保留工作区,清空暂存区)
# 默认的回退方式
git reset HEAD~1
git reset --mixed HEAD~1

# 回退到指定版本
git reset commit-hash
硬回退 (清空工作区和暂存区)
# 危险操作:完全回退到指定版本
git reset --hard HEAD~1
git reset --hard commit-hash

# 回退到远程分支状态
git reset --hard origin/main

6.3 撤销特定提交

使用 revert (推荐)
# 撤销最后一次提交
git revert HEAD

# 撤销指定提交
git revert commit-hash

# 撤销多个提交
git revert commit1..commit3

# 撤销但不自动提交
git revert --no-commit commit-hash

6.4 修改历史

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

# 添加文件到最后一次提交
git add forgotten-file.txt
git commit --amend --no-edit
交互式变基
# 修改最近 3 次提交
git rebase -i HEAD~3

# 在编辑器中可以进行以下操作:
# pick: 保留提交
# reword: 修改提交信息
# edit: 修改提交内容
# squash: 合并到上一个提交
# drop: 删除提交

7. 标签管理

7.1 标签基础

标签用于标记重要的版本节点,如发布版本。

查看标签
# 查看所有标签
git tag

# 查看标签详细信息
git show tag-name

# 搜索标签
git tag -l "v1.*"

7.2 创建标签

轻量标签
# 在当前提交创建标签
git tag v1.0

# 在指定提交创建标签
git tag v1.0 commit-hash
附注标签 (推荐)
# 创建带信息的标签
git tag -a v1.0 -m "Version 1.0 release"

# 在指定提交创建标签
git tag -a v1.0 commit-hash -m "Version 1.0 release"

7.3 标签操作

推送标签
# 推送单个标签
git push origin v1.0

# 推送所有标签
git push origin --tags
删除标签
# 删除本地标签
git tag -d v1.0

# 删除远程标签
git push origin --delete v1.0
检出标签
# 检出标签 (分离头指针状态)
git checkout v1.0

# 基于标签创建分支
git checkout -b hotfix-v1.0 v1.0

8. Git 工作流

8.1 集中式工作流

适合小团队,所有人都在 main 分支上工作。

# 开发者 A
git clone https://github.com/team/project.git
# 修改文件
git add .
git commit -m "Feature A"
git push origin main

# 开发者 B
git pull origin main  # 先拉取最新代码
# 修改文件
git add .
git commit -m "Feature B"
git push origin main

8.2 功能分支工作流

每个功能在独立分支上开发。

# 创建功能分支
git checkout -b feature-user-auth

# 开发功能
git add .
git commit -m "Add user authentication"

# 推送分支
git push origin feature-user-auth

# 创建 Pull Request
# 代码审查后合并到 main

8.3 Gitflow 工作流

适合有定期发布周期的项目。

分支类型
  • main: 生产环境代码
  • develop: 开发环境代码
  • feature/*: 功能分支
  • release/*: 发布分支
  • hotfix/*: 热修复分支
操作示例
# 初始化 Gitflow
git flow init

# 开始新功能
git flow feature start user-login

# 完成功能
git flow feature finish user-login

# 开始发布
git flow release start v1.0

# 完成发布
git flow release finish v1.0

# 开始热修复
git flow hotfix start critical-bug

# 完成热修复
git flow hotfix finish critical-bug

8.4 GitHub Flow

简化的工作流,适合持续部署。

# 1. 从 main 创建分支
git checkout -b feature-branch

# 2. 添加提交
git add .
git commit -m "Add feature"

# 3. 推送分支
git push origin feature-branch

# 4. 创建 Pull Request
# 5. 讨论和代码审查
# 6. 合并到 main
# 7. 部署

9. 高级功能

9.1 Git Stash (储藏)

当需要快速切换分支但当前工作未完成时使用。

基本储藏操作
# 储藏当前工作
git stash

# 储藏时添加描述
git stash save "Work in progress on feature X"

# 查看储藏列表
git stash list

# 应用最新的储藏
git stash apply

# 应用指定的储藏
git stash apply stash@{2}

# 应用储藏并删除
git stash pop

# 删除储藏
git stash drop stash@{0}

# 清空所有储藏
git stash clear
高级储藏操作
# 储藏包括未跟踪的文件
git stash -u

# 储藏包括忽略的文件
git stash -a

# 交互式储藏
git stash -p

# 从储藏创建分支
git stash branch new-branch stash@{0}

9.2 Git Submodule (子模块)

用于在一个 Git 仓库中包含另一个 Git 仓库。

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

# 初始化子模块
git submodule init

# 更新子模块
git submodule update

# 一次性初始化并更新
git submodule update --init --recursive
子模块操作
# 克隆包含子模块的仓库
git clone --recursive https://github.com/user/project.git

# 更新所有子模块到最新版本
git submodule update --remote

# 删除子模块
git submodule deinit lib
git rm lib

9.3 Git Hooks (钩子)

在特定 Git 事件发生时自动执行脚本。

常用钩子
  • pre-commit: 提交前执行
  • post-commit: 提交后执行
  • pre-push: 推送前执行
  • post-receive: 接收推送后执行
示例:pre-commit 钩子
#!/bin/sh
# .git/hooks/pre-commit

# 运行代码检查
npm run lint
if [ $? -ne 0 ]; then
    echo "Lint failed. Commit aborted."
    exit 1
fi

# 运行测试
npm test
if [ $? -ne 0 ]; then
    echo "Tests failed. Commit aborted."
    exit 1
fi

9.4 Git Worktree (工作树)

允许同时检出多个分支到不同目录。

# 创建新的工作树
git worktree add ../project-feature feature-branch

# 列出所有工作树
git worktree list

# 删除工作树
git worktree remove ../project-feature

# 清理工作树
git worktree prune

10. 常见问题解决

10.1 提交相关问题

撤销最后一次提交
# 保留文件修改
git reset --soft HEAD~1

# 完全撤销
git reset --hard HEAD~1
修改提交信息
# 修改最后一次提交信息
git commit --amend -m "新的提交信息"

# 修改历史提交信息
git rebase -i HEAD~3
合并多个提交
# 交互式变基合并提交
git rebase -i HEAD~3
# 在编辑器中将要合并的提交标记为 squash

10.2 分支相关问题

删除远程已删除的本地分支
# 清理远程跟踪分支
git remote prune origin

# 删除已合并的本地分支
git branch --merged | grep -v "\*\|main\|develop" | xargs -n 1 git branch -d
恢复删除的分支
# 查找删除的分支
git reflog

# 恢复分支
git checkout -b recovered-branch commit-hash

10.3 合并冲突解决

查看冲突文件
# 查看冲突状态
git status

# 查看冲突内容
git diff
使用工具解决冲突
# 配置合并工具
git config --global merge.tool vscode
git config --global mergetool.vscode.cmd 'code --wait $MERGED'

# 启动合并工具
git mergetool

10.4 远程仓库问题

推送被拒绝
# 先拉取远程更新
git pull origin main

# 如果有冲突,解决后再推送
git push origin main
更改远程仓库 URL
# 从 HTTPS 改为 SSH
git remote set-url origin git@github.com:user/repo.git

# 验证更改
git remote -v

10.5 文件相关问题

忽略已跟踪的文件
# 停止跟踪文件但保留在工作区
git rm --cached filename.txt

# 更新 .gitignore 文件
echo "filename.txt" >> .gitignore
git add .gitignore
git commit -m "Add filename.txt to .gitignore"
恢复删除的文件
# 恢复工作区删除的文件
git checkout HEAD -- filename.txt

# 恢复历史版本的文件
git checkout commit-hash -- filename.txt

11. 最佳实践

11.1 提交规范

提交信息格式
<type>(<scope>): <subject>

<body>

<footer>
提交类型
  • feat: 新功能
  • fix: 修复 bug
  • docs: 文档更新
  • style: 代码格式化
  • refactor: 代码重构
  • test: 添加测试
  • chore: 构建过程或辅助工具的变动
示例
git commit -m "feat(auth): add user login functionality

- Add login form component
- Implement JWT authentication
- Add password validation

Closes #123"

11.2 分支命名规范

# 功能分支
feature/user-authentication
feature/payment-integration

# 修复分支
fix/login-bug
hotfix/critical-security-issue

# 发布分支
release/v1.2.0

# 实验分支
experiment/new-ui-framework

11.3 .gitignore 最佳实践

常见忽略模式
# 依赖目录
node_modules/
vendor/

# 构建输出
dist/
build/
*.min.js

# 日志文件
*.log
logs/

# 环境配置
.env
.env.local

# IDE 文件
.vscode/
.idea/
*.swp

# 操作系统文件
.DS_Store
Thumbs.db

# 临时文件
*.tmp
*.temp

11.4 安全最佳实践

保护敏感信息
# 使用环境变量
echo "API_KEY=your-secret-key" > .env
echo ".env" >> .gitignore

# 检查是否意外提交敏感信息
git log --all --full-history -- .env
使用 SSH 密钥
# 生成 SSH 密钥
ssh-keygen -t ed25519 -C "your.email@example.com"

# 添加到 SSH 代理
ssh-add ~/.ssh/id_ed25519

# 测试连接
ssh -T git@github.com

12. 图形化工具

12.1 命令行图形化工具

Git 内置工具
# 图形化查看历史
gitk

# 图形化添加文件
git gui

# 交互式添加
git add -i
第三方命令行工具
# tig - 文本界面的 Git 仓库浏览器
sudo apt install tig  # Ubuntu
brew install tig       # macOS

# lazygit - 简单的终端 UI
brew install lazygit

# gitui - Rust 编写的快速终端 UI
cargo install gitui

12.2 桌面应用程序

免费工具
  • GitHub Desktop: 简单易用,适合初学者
  • Sourcetree: 功能丰富,支持 Git Flow
  • GitKraken: 美观的界面,强大的可视化
  • Fork: macOS 和 Windows 上的优秀工具
IDE 集成
  • VS Code: 内置 Git 支持 + GitLens 扩展
  • IntelliJ IDEA: 强大的 Git 集成
  • Sublime Merge: Sublime Text 团队开发

12.3 Web 界面

托管平台
  • GitHub: 最流行的代码托管平台
  • GitLab: 开源的 DevOps 平台
  • Bitbucket: Atlassian 的代码托管服务
  • Gitee: 国内的代码托管平台
自托管解决方案
  • GitLab CE: 社区版 GitLab
  • Gitea: 轻量级的 Git 服务
  • Gogs: 简单的自托管 Git 服务

13. 学习路径建议

13.1 初学者路径 (1-2 周)

  1. 基础概念 (1-2 天)

    • 理解版本控制的概念
    • 学习 Git 的基本原理
    • 安装和配置 Git
  2. 基本操作 (3-4 天)

    • 初始化仓库
    • 添加、提交文件
    • 查看历史和状态
    • 基本的撤销操作
  3. 分支基础 (2-3 天)

    • 创建和切换分支
    • 合并分支
    • 解决简单冲突
  4. 远程仓库 (2-3 天)

    • 克隆仓库
    • 推送和拉取
    • 基本的协作流程

13.2 进阶路径 (2-3 周)

  1. 高级分支操作

    • 变基 (rebase)
    • 交互式变基
    • 复杂冲突解决
  2. 版本管理

    • 标签管理
    • 版本回退策略
    • 历史修改
  3. 工作流程

    • Git Flow
    • GitHub Flow
    • 团队协作最佳实践
  4. 高级功能

    • Git Hooks
    • Submodules
    • Worktree

13.3 专家路径 (持续学习)

  1. 性能优化

    • 大文件处理 (Git LFS)
    • 仓库维护
    • 性能调优
  2. 自动化

    • CI/CD 集成
    • 自动化测试
    • 部署流程
  3. 高级配置

    • 自定义 Git 命令
    • 复杂的 Hook 脚本
    • 服务器端配置

14. 常用命令速查表

14.1 基础命令

git init                    # 初始化仓库
git clone <url>            # 克隆仓库
git status                 # 查看状态
git add <file>             # 添加文件
git commit -m "message"    # 提交更改
git log                    # 查看历史
git diff                   # 查看差异

14.2 分支命令

git branch                 # 查看分支
git branch <name>          # 创建分支
git checkout <branch>      # 切换分支
git checkout -b <branch>   # 创建并切换分支
git merge <branch>         # 合并分支
git branch -d <branch>     # 删除分支

14.3 远程命令

git remote -v              # 查看远程仓库
git fetch                  # 获取远程更新
git pull                   # 拉取并合并
git push                   # 推送更改
git push -u origin main    # 设置上游分支

14.4 撤销命令

git checkout -- <file>    # 撤销工作区修改
git reset HEAD <file>      # 撤销暂存区修改
git reset --soft HEAD~1    # 软回退
git reset --hard HEAD~1    # 硬回退
git revert <commit>        # 撤销提交

15. 总结

Git 是现代软件开发中不可或缺的工具。通过本指南,您应该能够:

掌握的技能

  1. 基础操作: 初始化、添加、提交、查看历史
  2. 分支管理: 创建、切换、合并、删除分支
  3. 远程协作: 克隆、推送、拉取、解决冲突
  4. 版本控制: 回退、标签、历史修改
  5. 工作流程: 选择适合的 Git 工作流
  6. 问题解决: 处理常见的 Git 问题

持续学习建议

  1. 实践为主: 在实际项目中使用 Git
  2. 阅读文档: 深入学习 Git 官方文档
  3. 参与开源: 通过开源项目学习协作
  4. 关注更新: 跟上 Git 的新功能和最佳实践

有用的资源

  • 官方文档: https://git-scm.com/doc
  • Pro Git 书籍: https://git-scm.com/book
  • Git 教程: https://learngitbranching.js.org/
  • GitHub 指南: https://guides.github.com/

记住,Git 的学习是一个渐进的过程。从基础开始,逐步掌握高级功能,在实践中不断提高。祝您学习愉快!🚀

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐