Skip to content
OpenInfoHub
Go back

工作中常用的 Git 工作流完整指南

本教程将介绍工作中最常用的 Git 工作流程和最佳实践。内容基于 Git 官方文档 和实际项目经验整理,涵盖从基础操作到团队协作的完整流程。

Table of contents

Open Table of contents

Git 工作流概述

Git 工作流是团队在使用 Git 进行版本控制时遵循的一套规范和流程。选择合适的工作流可以提高团队协作效率,减少代码冲突,确保代码质量。

常见的 Git 工作流类型

本教程将重点介绍最实用的功能分支工作流和 Git Flow。

基础准备

配置 Git 用户信息

首次使用 Git 需要配置用户信息:

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

# 查看配置
git config --list

配置常用别名

设置别名可以提高工作效率:

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.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

配置默认编辑器

# 使用 vim
git config --global core.editor vim

# 使用 VS Code
git config --global core.editor "code --wait"

功能分支工作流

功能分支工作流是最常用的工作模式,每个新功能都在专门的分支上开发。

1. 克隆仓库

# 克隆远程仓库
git clone https://github.com/username/repository.git
cd repository

2. 创建功能分支

# 从 main 分支创建新的功能分支
git checkout -b feature/user-authentication

# 或者使用两步操作
git branch feature/user-authentication
git checkout feature/user-authentication

分支命名规范:

3. 开发和提交

# 查看文件状态
git status

# 添加文件到暂存区
git add filename.js
# 或添加所有修改
git add .

# 提交更改
git commit -m "feat: add user authentication module"

提交信息规范

遵循约定式提交(Conventional Commits):

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

<body>

<footer>

常用类型:

示例:

git commit -m "feat(auth): implement JWT token validation"
git commit -m "fix(api): resolve null pointer exception in user service"
git commit -m "docs(readme): update installation instructions"

4. 推送到远程仓库

# 首次推送需要设置上游分支
git push -u origin feature/user-authentication

# 后续推送
git push

5. 保持分支更新

在开发过程中,定期同步主分支的更新:

# 切换到主分支
git checkout main

# 拉取最新代码
git pull origin main

# 切回功能分支
git checkout feature/user-authentication

# 合并主分支的更新
git merge main

# 或使用 rebase(保持提交历史线性)
git rebase main

6. 创建 Pull Request

功能开发完成后,在 GitHub/GitLab 上创建 Pull Request(或 Merge Request):

  1. 推送最新代码到远程分支
  2. 在代码托管平台创建 PR
  3. 填写 PR 描述,说明改动内容
  4. 指定审查者(Reviewers)
  5. 等待代码审查和批准
  6. 合并到主分支

7. 合并后清理

# 切换到主分支
git checkout main

# 拉取最新代码(包含已合并的功能)
git pull origin main

# 删除本地功能分支
git branch -d feature/user-authentication

# 删除远程分支
git push origin --delete feature/user-authentication

Git Flow 工作流

Git Flow 是一个更严格的分支模型,适合有明确发布周期的项目。

分支结构

1. 初始化 Git Flow

# 安装 git-flow 工具(可选)
# macOS
brew install git-flow

# Ubuntu
sudo apt-get install git-flow

# 初始化
git flow init

2. 开发新功能

# 创建功能分支
git flow feature start user-profile

# 开发和提交
git add .
git commit -m "feat: add user profile page"

# 完成功能(合并到 develop)
git flow feature finish user-profile

等效的标准 Git 命令:

# 创建功能分支
git checkout -b feature/user-profile develop

# 开发完成后合并
git checkout develop
git merge --no-ff feature/user-profile
git branch -d feature/user-profile

3. 准备发布

# 创建发布分支
git flow release start 1.0.0

# 在发布分支上进行版本号更新、文档完善等
git commit -am "chore: bump version to 1.0.0"

# 完成发布(合并到 main 和 develop)
git flow release finish 1.0.0

4. 紧急修复

# 创建热修复分支
git flow hotfix start critical-bug

# 修复问题
git commit -am "fix: resolve critical security vulnerability"

# 完成热修复(合并到 main 和 develop)
git flow hotfix finish critical-bug

常用 Git 操作

查看提交历史

# 查看提交日志
git log

# 简洁格式
git log --oneline

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

# 查看某个文件的历史
git log -- filename.js

# 查看最近 5 次提交
git log -5

撤销和修改

# 撤销工作区的修改
git checkout -- filename.js

# 撤销暂存区的文件
git reset HEAD filename.js

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

# 回退到某个提交
git reset --soft HEAD~1  # 保留更改在暂存区
git reset --mixed HEAD~1 # 保留更改在工作区(默认)
git reset --hard HEAD~1  # 完全丢弃更改(危险)

# 撤销某次提交(创建新提交)
git revert <commit-hash>

暂存工作进度

# 暂存当前工作
git stash

# 暂存并添加描述
git stash save "work in progress on feature X"

# 查看暂存列表
git stash list

# 恢复最近的暂存
git stash pop

# 恢复指定的暂存
git stash apply stash@{0}

# 删除暂存
git stash drop stash@{0}

# 清空所有暂存
git stash clear

分支管理

# 查看所有分支
git branch -a

# 查看远程分支
git branch -r

# 重命名分支
git branch -m old-name new-name

# 删除本地分支
git branch -d branch-name
git branch -D branch-name  # 强制删除

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

# 查看分支合并情况
git branch --merged
git branch --no-merged

标签管理

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

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

# 查看标签
git tag
git tag -l "v1.*"

# 查看标签信息
git show v1.0.0

# 推送标签到远程
git push origin v1.0.0
git push origin --tags  # 推送所有标签

# 删除标签
git tag -d v1.0.0
git push origin --delete v1.0.0

远程仓库操作

# 查看远程仓库
git remote -v

# 添加远程仓库
git remote add upstream https://github.com/original/repository.git

# 修改远程仓库 URL
git remote set-url origin https://github.com/username/repository.git

# 删除远程仓库
git remote remove upstream

# 拉取远程更新
git fetch origin
git fetch --all

# 拉取并合并
git pull origin main

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

解决冲突

合并冲突

当合并分支时出现冲突:

# 尝试合并
git merge feature/new-feature

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

# 手动编辑冲突文件,解决冲突标记
# <<<<<<< HEAD
# 当前分支的内容
# =======
# 要合并分支的内容
# >>>>>>> feature/new-feature

# 标记冲突已解决
git add conflicted-file.js

# 完成合并
git commit

Rebase 冲突

# 开始 rebase
git rebase main

# 如果出现冲突,解决后继续
git add resolved-file.js
git rebase --continue

# 跳过当前提交
git rebase --skip

# 放弃 rebase
git rebase --abort

团队协作最佳实践

1. 提交频率

2. 分支策略

3. 代码审查

4. 提交信息

5. 同步策略

6. 保护分支

在代码托管平台设置分支保护规则:

高级技巧

交互式 Rebase

整理提交历史:

# 交互式 rebase 最近 3 次提交
git rebase -i HEAD~3

# 在编辑器中可以:
# pick - 保留提交
# reword - 修改提交信息
# edit - 修改提交内容
# squash - 合并到前一个提交
# fixup - 合并到前一个提交,丢弃提交信息
# drop - 删除提交

Cherry-pick

将特定提交应用到当前分支:

# 应用单个提交
git cherry-pick <commit-hash>

# 应用多个提交
git cherry-pick <commit-hash1> <commit-hash2>

# 应用提交范围
git cherry-pick <start-commit>..<end-commit>

查找问题提交

使用二分查找定位引入 bug 的提交:

# 开始二分查找
git bisect start

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

# 标记某个已知正常的版本
git bisect good v1.0.0

# Git 会自动切换到中间的提交
# 测试后标记为 good 或 bad
git bisect good  # 或 git bisect bad

# 重复直到找到问题提交

# 结束二分查找
git bisect reset

子模块管理

# 添加子模块
git submodule add https://github.com/user/repo.git path/to/submodule

# 克隆包含子模块的仓库
git clone --recursive https://github.com/user/repo.git

# 初始化和更新子模块
git submodule init
git submodule update

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

# 删除子模块
git submodule deinit path/to/submodule
git rm path/to/submodule

常见问题和解决方案

1. 误提交敏感信息

# 从历史中完全删除文件
git filter-branch --force --index-filter \
  "git rm --cached --ignore-unmatch path/to/sensitive-file" \
  --prune-empty --tag-name-filter cat -- --all

# 或使用 BFG Repo-Cleaner(更快)
bfg --delete-files sensitive-file
git reflog expire --expire=now --all
git gc --prune=now --aggressive

# 强制推送
git push origin --force --all

2. 恢复已删除的分支

# 查看引用日志
git reflog

# 找到分支删除前的提交哈希
# 恢复分支
git checkout -b recovered-branch <commit-hash>

3. 合并大量提交

# 将功能分支的所有提交合并为一个
git checkout main
git merge --squash feature/long-running-feature
git commit -m "feat: implement complete feature X"

4. 修改历史提交的作者信息

# 修改最近一次提交的作者
git commit --amend --author="New Author <email@example.com>"

# 修改历史提交的作者
git rebase -i HEAD~5
# 将要修改的提交标记为 edit
# 然后执行
git commit --amend --author="New Author <email@example.com>"
git rebase --continue

5. 处理大文件

# 使用 Git LFS(Large File Storage)
git lfs install
git lfs track "*.psd"
git add .gitattributes
git add large-file.psd
git commit -m "Add large file with LFS"

实用工具和配置

.gitignore 配置

创建 .gitignore 文件忽略不需要版本控制的文件:

# 依赖目录
node_modules/
vendor/

# 构建输出
dist/
build/
*.o
*.exe

# 环境配置
.env
.env.local

# IDE 配置
.vscode/
.idea/
*.swp

# 日志文件
*.log
logs/

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

Git Hooks

.git/hooks/ 目录下创建钩子脚本:

# pre-commit: 提交前检查
#!/bin/sh
npm run lint
npm run test

# commit-msg: 检查提交信息格式
#!/bin/sh
commit_msg=$(cat $1)
if ! echo "$commit_msg" | grep -qE "^(feat|fix|docs|style|refactor|test|chore)(\(.+\))?: .+"; then
    echo "错误: 提交信息不符合规范"
    exit 1
fi

推荐工具

总结

掌握 Git 工作流是现代软件开发的必备技能。本教程介绍了从基础操作到高级技巧的完整流程:

建议根据团队规模和项目特点选择合适的工作流,并在实践中不断优化。记住,工作流是为了提高效率,而不是增加负担。

参考资源


内容基于 Git 官方文档和实践经验整理,遵循 Creative Commons Attribution Non Commercial Share Alike 3.0 license。


Share this post on:

Next Post
frp 内网穿透完整部署指南:服务端与客户端配置教程