Skip to content

Git 学习笔记

简介

Git 是一个分布式版本控制系统,用于跟踪代码变化、协作开发和版本管理。

基础概念

Git 的三个区域

工作区 (Working Directory)
    ↓ git add
暂存区 (Staging Area / Index)
    ↓ git commit
本地仓库 (Local Repository)
    ↓ git push
远程仓库 (Remote Repository)

常用术语

术语说明
Repository(仓库)存放项目文件和版本历史的地方
Commit(提交)保存项目状态的快照
Branch(分支)独立的开发线
Merge(合并)将一个分支的更改整合到另一个分支
Pull Request(PR)请求将代码合并到主分支

安装

Windows

下载 Git for Windows

macOS

bash
# 使用 Homebrew
brew install git

# 或使用 Xcode Command Line Tools
xcode-select --install

Linux (Ubuntu/Debian)

bash
sudo apt-get update
sudo apt-get install git

验证安装

bash
git --version

初始配置

配置用户信息

bash
# 全局配置
git config --global user.name "你的名字"
git config --global user.email "your.email@example.com"

# 查看配置
git config --list

配置默认分支名

bash
git config --global init.defaultBranch main

配置编辑器

bash
git config --global core.editor "vim"  # 或 "code --wait" (VS Code)

基础操作

初始化仓库

bash
# 创建新仓库
git init

# 克隆远程仓库
git clone https://github.com/user/repo.git
git clone git@github.com:user/repo.git  # SSH

查看状态

bash
git status          # 查看工作区状态
git status -s       # 简洁输出

添加文件

bash
# 添加指定文件
git add file.py

# 添加所有修改
git add .

# 添加所有修改和新文件
git add -A

# 交互式添加
git add -i

提交更改

bash
# 提交并添加消息
git commit -m "提交说明"

# 添加所有更改并提交
git commit -am "提交说明"

# 修改最后一次提交
git commit --amend

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

查看提交历史

bash
git log                    # 查看完整历史
git log --oneline          # 单行显示
git log --graph            # 图形化显示
git log --all              # 所有分支的历史
git log -5                 # 最近 5 次提交
git log --author="张三"     # 按作者筛选
git log --since="2024-01-01"  # 按时间筛选

# 查看每次提交的变更
git log -p
git show <commit-id>       # 查看指定提交

分支操作

创建与切换

bash
# 创建分支
git branch feature-branch

# 切换分支
git checkout feature-branch
git switch feature-branch   # Git 2.23+

# 创建并切换分支
git checkout -b feature-branch
git switch -c feature-branch

查看分支

bash
git branch              # 本地分支列表
git branch -r           # 远程分支列表
git branch -a           # 所有分支
git branch -v           # 显示分支信息
git branch --merged     # 已合并的分支
git branch --no-merged  # 未合并的分支

合并分支

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

# 禁用快进合并
git merge --no-ff feature-branch

# 合并后删除分支
git branch -d feature-branch

变基 (Rebase)

bash
# 将当前分支变基到 main
git rebase main

# 交互式变基
git rebase -i HEAD~3

# 终止变基
git rebase --abort

# 继续变基
git rebase --continue

删除分支

bash
# 删除本地分支
git branch -d feature-branch    # 已合并
git branch -D feature-branch    # 强制删除

# 删除远程分支
git push origin --delete feature-branch
git push origin :feature-branch  # 另一种写法

远程操作

查看远程仓库

bash
git remote              # 查看远程仓库
git remote -v           # 查看详细信息
git remote show origin  # 查看远程仓库详情

添加远程仓库

bash
git remote add origin https://github.com/user/repo.git
git remote set-url origin git@github.com:user/repo.git  # 修改 URL

推送

bash
# 推送到远程
git push origin main

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

# 推送并建立跟踪关系
git push -u origin main

# 强制推送(危险!)
git push --force origin main

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

拉取

bash
# 拉取并合并
git pull origin main

# 等价于
git fetch origin
git merge origin/main

# 拉取并变基
git pull --rebase origin main

获取

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

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

撤销操作

撤销工作区修改

bash
# 撤销指定文件的修改
git restore file.py
git checkout file.py      # 旧版命令

# 撤销所有修改
git restore .
git checkout .

撤销暂存

bash
# 从暂存区移除文件
git restore --staged file.py
git reset HEAD file.py    # 旧版命令

# 移除所有暂存
git restore --staged .
git reset HEAD .

回退提交

bash
# 回退到指定提交(保留更改)
git reset --soft HEAD~1

# 回退到指定提交(不保留更改)
git reset --hard HEAD~1

# 回退到指定提交(保留更改在暂存区)
git reset --mixed HEAD~1

# 回退到指定提交 ID
git reset <commit-id>

撤销已推送的提交

bash
# 创建一个新的提交来撤销(推荐)
git revert <commit-id>

# 强制推送(谨慎使用)
git reset --hard <commit-id>
git push --force

查看差异

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

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

# 查看工作区与上一次提交的差异
git diff HEAD

# 查看两次提交之间的差异
git diff <commit-id-1> <commit-id-2>

# 查看指定文件的差异
git diff file.py

# 查看分支间的差异
git diff main feature-branch

标签 (Tags)

创建标签

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

# 创建附注标签
git tag -a v1.0.0 -m "版本 1.0.0"

# 为指定提交打标签
git tag -a v1.0.0 <commit-id> -m "版本 1.0.0"

查看标签

bash
git tag                    # 所有标签
git show v1.0.0           # 查看标签详情
git ls-remote --tags      # 远程标签

推送标签

bash
# 推送指定标签
git push origin v1.0.0

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

删除标签

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

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

储藏 (Stash)

储藏更改

bash
# 储藏当前更改
git stash

# 储藏并添加消息
git stash save "工作进度"

# 储藏未跟踪文件
git stash -u

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

查看储藏

bash
git stash list           # 查看储藏列表
git stash show           # 查看储藏内容
git stash show -p         # 查看储藏差异

应用储藏

bash
# 应用最近储藏
git stash apply

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

# 应用并删除储藏
git stash pop

# 删除储藏
git stash drop
git stash clear          # 删除所有储藏

常见场景

场景 1: 开始新功能开发

bash
# 1. 确保在主分支
git checkout main

# 2. 拉取最新代码
git pull origin main

# 3. 创建并切换到新分支
git checkout -b feature/new-feature

# 4. 开发并提交
git add .
git commit -m "feat: add new feature"

# 5. 推送分支
git push -u origin feature/new-feature

场景 2: 修复 Bug

bash
# 1. 从 main 创建修复分支
git checkout -b fix/bug-name

# 2. 修复并提交
git add .
git commit -m "fix: resolve bug issue"

# 3. 推送并创建 PR
git push -u origin fix/bug-name

场景 3: 合并冲突解决

bash
# 1. 尝试合并
git merge feature-branch

# 2. 如果出现冲突,查看冲突文件
git status

# 3. 手动编辑冲突文件,保留需要的代码

# 4. 标记冲突已解决
git add <conflicted-file>

# 5. 完成合并
git commit

# 6. 如果需要中止合并
git merge --abort

场景 4: 提交历史整理

bash
# 1. 交互式变基
git rebase -i HEAD~3

# 2. 编辑提示:
# pick - 保留提交
# reword - 修改提交消息
# edit - 编辑提交
# squash - 合并到前一个提交
# fixup - 合并到前一个提交(丢弃消息)
# drop - 删除提交

# 3. 保存后完成变基
git rebase --continue

场景 5: 临时保存工作

bash
# 1. 储藏当前工作
git stash save "临时工作"

# 2. 切换到其他任务
git checkout other-branch

# 3. 完成其他任务后回来
git checkout main

# 4. 恢复工作
git stash pop

提交信息规范 (Conventional Commits)

格式

<type>(<scope>): <subject>

<body>

<footer>

类型 (Type)

类型说明
feat新功能
fix修复 Bug
docs文档更新
style代码格式(不影响功能)
refactor重构
test测试相关
chore构建或辅助工具变动

示例

bash
git commit -m "feat(auth): add user login functionality"

git commit -m "fix(api): resolve null pointer exception in user endpoint"

git commit -m "docs(readme): update installation instructions"

git commit -m "refactor(database): optimize query performance

- Add index on user.email
- Use prepared statements
- Reduce query time by 50%

Closes #123"

Git 工作流

Git Flow

main (生产环境)

develop (开发环境)

feature/* (功能分支)

hotfix/* (紧急修复)

GitHub Flow

main (主分支)

feature/* (功能分支 → Pull Request → 合并到 main)

Trunk-Based Development

main (主分支,所有提交直接推送到 main)

short-lived feature branches (短期功能分支,快速合并)

GitHub 知识

简介

GitHub 是基于 Git 的代码托管平台,提供协作开发、代码审查、项目管理等功能。

账号设置

SSH 密钥配置

bash
# 1. 生成 SSH 密钥
ssh-keygen -t ed25519 -C "your.email@example.com"

# 2. 启动 ssh-agent
eval "$(ssh-agent -s)"

# 3. 添加私钥
ssh-add ~/.ssh/id_ed25519

# 4. 复制公钥到 GitHub
cat ~/.ssh/id_ed25519.pub

# 5. 在 GitHub 设置中添加 SSH 密钥
# Settings → SSH and GPG keys → New SSH key

验证连接

bash
ssh -T git@github.com

仓库操作

创建仓库

bash
# 方式 1: 在 GitHub 网页创建后克隆
git clone git@github.com:user/repo.git

# 方式 2: 本地初始化后推送到新仓库
git init
git add .
git commit -m "Initial commit"
git branch -M main
git remote add origin git@github.com:user/repo.git
git push -u origin main

Fork 仓库

bash
# 1. 在 GitHub 网页上 Fork 原仓库

# 2. 克隆 Fork 后的仓库
git clone git@github.com:your-username/repo.git

# 3. 添加上游仓库(原仓库)
git remote add upstream https://github.com/original-user/repo.git

# 4. 拉取上游更新
git fetch upstream
git merge upstream/main

Pull Request (PR)

创建 PR

bash
# 1. 推送功能分支
git push -u origin feature/new-feature

# 2. 在 GitHub 网页上创建 PR
# Pull requests → New pull request

PR 命名规范

bash
# 标题格式
<type>: <description>

# 示例
feat: add user authentication
fix: resolve login timeout issue
docs: update API documentation

PR 描述模板

markdown
## 变更类型
- [ ] 新功能
- [ ] Bug 修复
- [ ] 文档更新
- [ ] 代码重构
- [ ] 其他

## 描述
简要描述这个 PR 的目的和内容

## 相关 Issue
Closes #123

## 变更内容
- 变更 1
- 变更 2

## 测试
- [ ] 已添加单元测试
- [ ] 所有测试通过
- [ ] 已手动测试

## 截图
(如果适用,添加截图)

更新 PR

bash
# 添加新提交到 PR 分支
git add .
git commit -m "fix: address review comments"
git push origin feature/new-feature

# 如果需要修改历史提交
git rebase -i HEAD~n
git push --force origin feature/new-feature

GitHub CLI (gh)

安装

bash
# macOS
brew install gh

# Linux
sudo apt install gh

# 验证登录
gh auth login

常用命令

bash
# 创建仓库
gh repo create my-project --public

# 克隆仓库
gh repo clone user/repo

# 创建 PR
gh pr create --title "feat: add feature" --body "Description"

# 查看 PR
gh pr list
gh pr view 123

# 查看 Issue
gh issue list
gh issue create --title "Bug found" --body "Description"

# 查看 CI 状态
gh run list
gh run view

# 查看仓库信息
gh repo view

# 列出仓库文件
gh repo view user/repo --files

GitHub Actions

工作流配置

yaml
# .github/workflows/ci.yml
name: CI

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3

    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: '3.10'

    - name: Install dependencies
      run: |
        pip install -r requirements.txt
        pip install pytest

    - name: Run tests
      run: pytest

    - name: Lint code
      run: flake8 .

常用事件

yaml
# 推送到特定分支
on:
  push:
    branches:
      - main
      - develop

# 定时任务 (每天 UTC 0:00)
on:
  schedule:
    - cron: '0 0 * * *'

# 手动触发
on:
  workflow_dispatch:

# Release 时触发
on:
  release:
    types: [created]

GitHub Pages

部署静态网站

yaml
# .github/workflows/deploy.yml
name: Deploy to GitHub Pages

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest

    permissions:
      contents: write

    steps:
    - uses: actions/checkout@v3

    - name: Setup Node.js
      uses: actions/setup-node@v3
      with:
        node-version: '18'

    - name: Install and Build
      run: |
        npm install
        npm run build

    - name: Deploy
      uses: peaceiris/actions-gh-pages@v3
      with:
        github_token: ${{ secrets.GITHUB_TOKEN }}
        publish_dir: ./dist

GitHub 功能

Releases(版本发布)

bash
# 创建 Release
gh release create v1.0.0 \
  --title "Version 1.0.0" \
  --notes "First stable release"

# 创建带附件的 Release
gh release create v1.0.0 ./dist/app.zip

# 列出 Releases
gh release list

# 下载 Release 资产
gh release download v1.0.0

Issues(问题追踪)

markdown
## Bug 报告模板

### 描述
简要描述遇到的问题

### 复现步骤
1. 步骤 1
2. 步骤 2
3. 步骤 3

### 期望行为
描述期望的结果

### 实际行为
描述实际发生的情况

### 环境信息
- OS: macOS 14.0
- Python: 3.10.0
- 版本: 1.0.0

### 截图/日志
(如果适用)

Wiki(项目文档)

markdown
# 在 Wiki 中创建文档

## 组织方式
- Home - 项目主页
- Installation - 安装指南
- API - API 文档
- FAQ - 常见问题

Projects(项目管理)

看板视图:
- To Do
- In Progress
- In Review
- Done

表格视图:
- 任务
- 负责人
- 状态
- 优先级
- 截止日期

协作开发

Code Review 流程

bash
# 1. 创建功能分支
git checkout -b feature/new-feature

# 2. 开发并提交
git add .
git commit -m "feat: add feature"

# 3. 推送并创建 PR
git push -u origin feature/new-feature

# 4. 等待代码审查

# 5. 根据反馈修改
git add .
git commit -m "fix: address review comments"
git push origin feature/new-feature

# 6. 合并 PR(或由维护者合并)

代码审查技巧

作为审查者:

  • 关注逻辑正确性
  • 检查代码风格一致性
  • 提供建设性建议
  • 提问而非直接命令

作为提交者:

  • 保持 PR 范围小而专注
  • 提供清晰的描述
  • 及时回应审查意见
  • 乐于接受反馈

GitHub 安全

依赖安全扫描

yaml
# .github/workflows/security.yml
name: Security Scan

on:
  schedule:
    - cron: '0 0 * * *'

jobs:
  security:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Run Security Scan
      uses: aquasecurity/trivy-action@master
      with:
        scan-type: 'fs'
        scan-ref: '.'
        format: 'sarif'
        output: 'trivy-results.sarif'

Secrets 管理

bash
# 在 GitHub 设置中添加 Secret
# Settings → Secrets and variables → Actions → New repository secret

# 在工作流中使用
- name: Deploy
  run: deploy.sh
  env:
    API_KEY: ${{ secrets.API_KEY }}
    DEPLOY_PASSWORD: ${{ secrets.DEPLOY_PASSWORD }}

GitHub 统计

贡献统计

bash
# 使用 gh 查看贡献
gh repo view user/repo --web

# 查看个人贡献
gh api user/repos | jq '.[].name'

提交统计

bash
# 统计提交数量
git shortlog -sn --all

# 按作者统计
git shortlog -sn

# 统计代码行数
git diff --stat HEAD~10 HEAD

GitHub 最佳实践

1. 使用 README

markdown
# 项目名称

简短的项目描述

## 功能

- 功能 1
- 功能 2

## 安装

```bash
pip install my-project

使用

python
import my_project

my_project.do_something()

贡献

欢迎贡献!建议创建 CONTRIBUTING.md 文件来说明贡献指南

许可证

MIT License


#### 2. 使用 License

推荐的开源许可证:
- MIT - 简单、宽松
- Apache 2.0 - 专利保护
- GPL - 强制开源
- BSD - 类似 MIT

#### 3. 使用 .github 目录

.github/ ├── workflows/ # CI/CD 工作流 ├── ISSUE_TEMPLATE/ # Issue 模板 ├── PULL_REQUEST_TEMPLATE.md # PR 模板 └── CODEOWNERS # 代码所有者


#### 4. 使用 CODEOWNERS

```markdown
# 所有 Python 文件由 @python-team 审查
*.py @python-team

# docs/ 目录由 @docs-team 审查
docs/ @docs-team

# 特定文件由特定人员审查
config.yml @admin

常用工具

Git GUI 客户端

  • GitHub Desktop - GitHub 官方客户端
  • Sourcetree - Atlassian 出品
  • GitKraken - 跨平台图形界面
  • TortoiseGit - Windows 集成工具

VS Code 集成

bash
# 内置 Git 支持
- 查看更改
- 暂存文件
- 提交更改
- 分支管理
- 解决冲突

Git 扩展工具

bash
# Git 大文件存储
git lfs install

# Git 子模块
git submodule add <repo-url>

# Git 凭证存储
git config --global credential.helper store

最佳实践

1. 频繁提交

bash
# ✅ 好:小而频繁的提交
git add feature.py
git commit -m "feat: add core functionality"

# ❌ 不好:大而少的提交
# 积累大量更改后一次性提交

2. 清晰的提交信息

bash
# ✅ 好
git commit -m "fix: resolve null pointer in user login"

# ❌ 不好
git commit -m "update"

3. 保持主分支稳定

bash
# 主分支应该是可部署的
# 使用功能分支进行开发
# 通过 Pull Request 合并代码

4. 使用 .gitignore

bash
# Python
__pycache__/
*.py[cod]
*.so
.venv/

# Node.js
node_modules/
npm-debug.log

# IDE
.idea/
.vscode/

5. 分支保护

bash
# 在 GitHub/GitLab 设置中
- 启用分支保护
- 要求 Pull Request 审查
- 要求 CI/CD 通过
- 禁止强制推送

常见问题

Q: 如何修改历史提交?

bash
# 使用交互式变基
git rebase -i HEAD~n

# 修改后需要强制推送(谨慎!)
git push --force

Q: 如何恢复删除的分支?

bash
# 找到分支最后的提交
git reflog

# 恢复分支
git branch recovered-branch <commit-id>

Q: 如何处理大文件?

bash
# 使用 Git LFS
git lfs track "*.psd"
git add .gitattributes
git add large-file.psd
git commit -m "add large file"

Q: 如何查看文件历史?

bash
# 查看文件所有历史
git log --follow -- file.py

# 查看文件每次提交的内容
git log -p -- file.py

Q: 如何忽略已跟踪的文件?

bash
# 1. 添加到 .gitignore
echo "config.env" >> .gitignore

# 2. 从缓存中移除
git rm --cached config.env

# 3. 提交
git commit -m "chore: ignore config.env"

参考资源