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
macOS
bash
# 使用 Homebrew
brew install git
# 或使用 Xcode Command Line Tools
xcode-select --installLinux (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 mainFork 仓库
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/mainPull Request (PR)
创建 PR
bash
# 1. 推送功能分支
git push -u origin feature/new-feature
# 2. 在 GitHub 网页上创建 PR
# Pull requests → New pull requestPR 命名规范
bash
# 标题格式
<type>: <description>
# 示例
feat: add user authentication
fix: resolve login timeout issue
docs: update API documentationPR 描述模板
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-featureGitHub 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 --filesGitHub 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: ./distGitHub 功能
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.0Issues(问题追踪)
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 HEADGitHub 最佳实践
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 --forceQ: 如何恢复删除的分支?
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.pyQ: 如何忽略已跟踪的文件?
bash
# 1. 添加到 .gitignore
echo "config.env" >> .gitignore
# 2. 从缓存中移除
git rm --cached config.env
# 3. 提交
git commit -m "chore: ignore config.env"