Git工作流-专业版本控制Skill git-workflow

这个技能用于高效管理Git源代码控制,包括分支策略、提交约定、合并冲突解决、变基和协作工作流如GitHub Flow或GitFlow。适用于团队环境中管理功能分支、创建有意义的提交、解决合并冲突、维护干净的Git历史记录。关键词包括Git、版本控制、工作流、团队协作、分支管理、提交规范、DevOps、代码审查。

DevOps 0 次安装 0 次浏览 更新于 3/18/2026

名称: git-workflow 描述: 使用Git高效管理源代码控制,包括分支策略、提交约定、合并冲突解决、变基和协作工作流如GitHub Flow或GitFlow。适用于管理功能分支、创建有意义的提交、解决合并冲突、变基分支、压缩提交、使用交互式变基、实现分支命名约定、遵循提交消息标准、管理拉取请求或团队环境中的协作。

Git工作流 - 专业版本控制

何时使用此技能

  • 管理功能分支和分支策略
  • 创建清晰、有意义的提交消息
  • 有效解决合并冲突
  • 变基分支以保持历史记录整洁
  • 合并前压缩提交
  • 使用交互式变基清理历史记录
  • 实现分支命名约定
  • 遵循提交消息标准(常规提交)
  • 管理拉取请求和代码审查
  • 在团队Git工作流中协作
  • 从Git错误中恢复(重置、恢复、引用日志)
  • 管理发布分支和热修复

何时使用此技能

  • 管理代码变更、与团队协作、创建分支、处理冲突和维护干净的Git历史记录。
  • 当处理相关任务或功能时
  • 在需要此专业知识的开发过程中

使用时: 管理代码变更、与团队协作、创建分支、处理冲突和维护干净的Git历史记录。

核心原则

  1. 经常提交,稳定时推送 - 小而集中的提交易于审查和恢复
  2. 主分支是神圣的 - 始终可部署,永远不要直接提交
  3. 清晰的历史讲述故事 - 未来的开发人员阅读提交消息以理解原因
  4. 共享前审查 - 在提交前检查git diff

基本命令

开始工作

# 更新本地仓库
git fetch origin
git pull origin main

# 创建功能分支
git checkout -b feature/user-authentication
# 或: git switch -c feature/user-authentication

# 分支命名约定:
# feature/描述  - 新功能
# fix/描述      - 错误修复
# refactor/描述 - 代码改进
# docs/描述     - 文档

进行更改

# 检查更改内容
git status                    # 概述
git diff                      # 未暂存的更改
git diff --staged             # 暂存的更改
git diff main...HEAD          # 分支以来的所有更改

# 暂存更改
git add path/to/file          # 特定文件
git add path/to/directory     # 整个目录
git add -p                    # 交互式暂存(推荐!)

# 提交带有良好消息
git commit -m "feat: 添加用户认证端点

- 实现JWT令牌生成
- 使用bcrypt添加密码哈希
- 创建认证验证中间件

关闭 #123"

提交消息格式

使用常规提交:

<类型>(<范围>): <主题>

<正文>

<页脚>

类型:

  • feat: 新功能
  • fix: 错误修复
  • refactor: 既不修复错误也不添加功能的代码更改
  • docs: 仅文档
  • style: 格式化、缺少分号等
  • test: 添加测试
  • chore: 维护任务
  • perf: 性能改进

示例:

# 良好提交
git commit -m "feat: 添加用户头像上传"
git commit -m "fix: 防止订单处理中的竞争条件"
git commit -m "refactor: 将验证逻辑提取到单独模块"

# 不良提交(太模糊)
git commit -m "修复东西"        # 什么东西?
git commit -m "WIP"              # 永远不要推送WIP提交
git commit -m "asdf"             # 无意义

查看历史记录

# 最近提交
git log --oneline -10

# 带差异的提交
git log -p -2

# 可视化分支图
git log --graph --oneline --all

# 查找谁更改了某行
git blame path/to/file

# 搜索提交消息
git log --grep="authentication"

# 按作者查找提交
git log --author="alice"

分支与合并

# 列出分支
git branch                    # 本地
git branch -r                 # 远程
git branch -a                 # 全部

# 切换分支
git checkout main
# 或: git switch main

# 合并功能分支
git checkout main
git merge feature/user-auth   # 创建合并提交
git merge --squash feature/user-auth  # 压缩成一个提交

# 合并后删除分支
git branch -d feature/user-auth       # 安全删除(仅合并后)
git branch -D feature/user-auth       # 强制删除
git push origin --delete feature/user-auth  # 删除远程

处理冲突

# 当发生合并冲突时:

# 1. 查看冲突文件
git status

# 2. 打开文件,手动解决冲突
# 查找: <<<<<<< HEAD, =======, >>>>>>> branch

# 3. 标记为已解决
git add path/to/resolved-file

# 4. 完成合并
git commit  # 将使用默认合并消息

# 或中止合并
git merge --abort

冲突示例:

<<<<<<< HEAD
const apiUrl = 'https://api.prod.example.com';
=======
const apiUrl = 'https://api-v2.example.com';
>>>>>>> feature/update-api

# 解决后(选择适当版本):
const apiUrl = 'https://api-v2.example.com';

撤销更改

# 撤销工作目录更改(未暂存)
git checkout -- path/to/file
# 或: git restore path/to/file

# 取消暂存文件(保留更改)
git reset HEAD path/to/file
# 或: git restore --staged path/to/file

# 撤销最后一次提交(保留更改)
git reset --soft HEAD~1

# 撤销最后一次提交(丢弃更改) ⚠️ 危险
git reset --hard HEAD~1

# 恢复一个提交(创建新提交)
git revert abc123

# 修改最后一次提交(推送前)
git commit --amend
git commit --amend --no-edit  # 保留消息

储藏

# 保存进行中的工作
git stash

# 带消息储藏
git stash save "WIP: 处理用户配置文件"

# 列出储藏
git stash list

# 应用最近储藏
git stash apply

# 应用并从储藏列表中移除
git stash pop

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

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

# 清除所有储藏
git stash clear

变基

# 用主分支更改更新分支
git checkout feature/user-auth
git rebase main

# 交互式变基(清理历史记录)
git rebase -i HEAD~5

# 变基期间:
# - pick: 保留提交
# - reword: 更改提交消息
# - squash: 与前一个提交合并
# - fixup: 类似squash但丢弃消息
# - drop: 移除提交

# 如果出错,中止变基
git rebase --abort

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

⚠️ 永远不要变基已推送到共享分支的提交!

拣选

# 将特定提交应用到当前分支
git cherry-pick abc123

# 拣选多个提交
git cherry-pick abc123 def456

# 拣选而不提交(仅暂存)
git cherry-pick -n abc123

工作流模式

功能分支工作流

# 1. 从主分支创建分支
git checkout main
git pull origin main
git checkout -b feature/new-feature

# 2. 进行更改并提交
# ... 工作 ...
git add .
git commit -m "feat: 实现新功能"

# 3. 用主分支更新分支
git fetch origin
git rebase origin/main

# 4. 推送到远程
git push origin feature/new-feature

# 5. 在GitHub/GitLab上创建拉取请求

# 6. PR批准并合并后,清理
git checkout main
git pull origin main
git branch -d feature/new-feature

Gitflow工作流

# 主分支:
# - main (生产)
# - develop (集成)

# 支持分支:
# - feature/* (新功能)
# - release/* (发布准备)
# - hotfix/* (紧急修复)

# 开始功能
git checkout develop
git checkout -b feature/awesome-feature

# 完成功能
git checkout develop
git merge --no-ff feature/awesome-feature
git branch -d feature/awesome-feature

# 创建发布
git checkout develop
git checkout -b release/1.2.0
# ... 更新版本,更新变更日志 ...
git checkout main
git merge --no-ff release/1.2.0
git tag -a v1.2.0 -m "发布 1.2.0"

# 热修复
git checkout main
git checkout -b hotfix/critical-bug
# ... 修复错误 ...
git checkout main
git merge --no-ff hotfix/critical-bug
git checkout develop
git merge --no-ff hotfix/critical-bug
git tag -a v1.2.1 -m "热修复 1.2.1"

主干开发

# 每个人频繁提交到主分支
# 短期功能分支(<1天)
# 功能标志用于未完成工作

git checkout main
git pull origin main
git checkout -b feature/quick-change

# ... 进行小更改 ...
git commit -am "feat: 添加按钮"
git push origin feature/quick-change

# 创建PR,快速审查,合并
# 合并后立即删除分支

Git配置

基本配置

# 用户身份
git config --global user.name "您的名字"
git config --global user.email "you@example.com"

# 编辑器
git config --global core.editor "code --wait"  # VS Code
# 或: vim, nano, emacs, 等

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

# 有用别名
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global alias.visual 'log --graph --oneline --all'

# 自动纠正拼写错误
git config --global help.autocorrect 20

# 彩色输出
git config --global color.ui auto

# 仅推送当前分支
git config --global push.default current

# 默认变基调取
git config --global pull.rebase true

.gitignore

# 创建全局gitignore
git config --global core.excludesfile ~/.gitignore_global

# 常见条目:
# 操作系统文件
.DS_Store
Thumbs.db

# 编辑器文件
.vscode/
.idea/
*.swp
*.swo
*~

# 依赖项
node_modules/
venv/
vendor/

# 构建输出
dist/
build/
*.pyc
*.class

# 秘密
.env
.env.local
secrets.yml
*.pem

# 日志
*.log
logs/

高级技巧

Git工作树

# 同时处理多个分支
git worktree add ../project-feature2 feature/feature2
cd ../project-feature2  # 单独目录,相同仓库

# 列出工作树
git worktree list

# 移除工作树
git worktree remove ../project-feature2

二分查找(查找破坏性提交)

# 二分查找错误提交
git bisect start
git bisect bad                # 当前状态是坏的
git bisect good v1.0.0        # 最后已知好版本

# Git检出提交进行测试
# 手动测试或: git bisect run ./test.sh

git bisect good  # 如果测试通过
git bisect bad   # 如果测试失败

# 重复直到找到
# git bisect reset 返回原始状态

引用日志(安全网)

# 查看所有最近操作(即使重置后)
git reflog

# 恢复“丢失”的提交
git checkout abc123  # 从引用日志

# 撤销错误重置
git reset --hard HEAD@{2}

最佳实践

✅ 做

  • 编写清晰、描述性的提交消息
  • 提交逻辑更改单元
  • 提交前审查差异(git diff --staged
  • 推送前拉取
  • 保持提交小而集中
  • 对所有更改使用分支
  • 合并后删除分支

❌ 不做

  • 提交秘密或凭据
  • 提交生成的文件(构建工件)
  • 直接提交到主分支
  • 在共享分支上重写历史
  • 创建包含无关更改的大规模提交
  • 使用模糊的提交消息
  • 推送损坏的代码

故障排除

常见问题

“分离的HEAD”:

# 您直接检出了一个提交
# 要保存工作:
git checkout -b new-branch-name

“大文件中的合并冲突”:

# 使用他们的或我们的版本:
git checkout --theirs path/to/file  # 采用他们的版本
git checkout --ours path/to/file    # 保留我们的版本
git add path/to/file

“意外提交到主分支”:

# 将提交移动到新分支
git branch feature/accidental
git reset --hard origin/main
git checkout feature/accidental

“推送了敏感数据”:

# 使用BFG Repo Cleaner或git-filter-repo
# 警告: 重写历史,与团队协调

# 然后强制推送(⚠️ 危险)
git push --force-with-lease

资源


记住: Git是您代码的时间机器。用它来创建检查点,安全探索替代解决方案,并保持为什么进行更改的清晰历史记录。