Git 的正确使用姿势与最佳实践:团队协作和版本控制的最佳实践 | 青训营

607 阅读7分钟

Git 是一种分布式的版本控制系统,可以让开发者在本地和远程仓库之间管理和协作代码。Git 的正确使用姿势和最佳实践可以提高代码的质量和效率,避免不必要的错误和冲突。本文将介绍 Git 的基本概念和常用命令,以及团队协作和版本控制的最佳实践,包括:

  • Git 的工作流程和状态
  • Git 的分支管理
  • Git 的提交规范
  • Git 的合并策略
  • Git 的远程协作

Git 的工作流程和状态

Git 的工作流程是指开发者在本地仓库中对代码进行修改、暂存、提交、推送等操作的过程。Git 的工作流程可以分为以下四个阶段:

  • 工作区(Working Directory):开发者在工作区中对代码进行编辑和修改,这些修改还没有被 Git 跟踪。
  • 暂存区(Staging Area):开发者可以使用 git add 命令将工作区中的修改添加到暂存区,这些修改已经被 Git 跟踪,但还没有被提交。
  • 本地仓库(Local Repository):开发者可以使用 git commit 命令将暂存区中的修改提交到本地仓库,这些修改已经被 Git 记录,并生成一个唯一的哈希值。
  • 远程仓库(Remote Repository):开发者可以使用 git push 命令将本地仓库中的修改推送到远程仓库,这些修改已经被 Git 同步,并可以与其他开发者共享。

Git 的状态是指文件在不同阶段中的状态,Git 的状态有以下三种:

  • 未跟踪(Untracked):文件在工作区中,但没有被添加到暂存区,也没有被提交到本地仓库。
  • 已跟踪(Tracked):文件已经被添加到暂存区,或者已经被提交到本地仓库。
  • 已修改(Modified):文件已经被跟踪,但是在工作区中有了新的修改,还没有被添加到暂存区或者提交到本地仓库。

Git 的分支管理

Git 的分支是指代码的不同版本,可以让开发者在不影响主分支的情况下进行功能开发或问题修复。Git 的分支管理包括以下几个方面:

  • 创建分支:开发者可以使用 git branch 命令创建一个新的分支,并给它一个有意义的名称。例如:
git branch feature-login # 创建一个名为feature-login的分支
  • 切换分支:开发者可以使用 git checkout 命令切换到另一个分支,并在该分支上进行工作。例如:
git checkout feature-login # 切换到feature-login分支
  • 合并分支:开发者可以使用 git merge 命令将一个分支合并到另一个分支,并解决可能出现的冲突。例如:
git checkout master # 切换到master分支
git merge feature-login # 将feature-login分支合并到master分支
  • 删除分支:开发者可以使用 git branch -d 命令删除一个不再需要的分支,并释放空间。例如:
git branch -d feature-login # 删除feature-login分支

Git 的提交规范

Git 的提交是指将暂存区中的修改提交到本地仓库,并生成一个唯一的哈希值。Git 的提交规范是指遵循一定的格式和风格来编写提交信息,以便于阅读和理解。Git 的提交规范包括以下几个方面:

  • 提交信息的结构:提交信息应该由标题、正文和页脚三部分组成,每部分之间用一个空行隔开。例如:
标题:用一句话概括提交的内容

正文:用多行文字描述提交的目的、原因和方法

页脚:用一行或多行文字列出相关的问题编号、合作者或其他信息
  • 提交信息的格式:提交信息应该使用一定的格式来标识不同的类型、范围和主题。一种常用的格式是:
<类型>(<范围>): <主题>

其中,类型是指提交的类别,如 feat(新功能)、fix(问题修复)、docs(文档更新)、style(代码风格调整)、refactor(代码重构)、test(测试增加或修改)、chore(杂项工作)等。

范围是指提交影响的范围,如 login(登录模块)、user(用户模块)、api(接口层)、utils(工具类)等。

主题是指提交的简要描述,应该使用祈使句,并以英文句号结尾。

例如,一个符合格式的提交信息是:

feat(login): add captcha verification for login
  • 提交信息的风格:提交信息应该使用清晰、准确和易懂的语言,避免使用不规范或不恰当的词汇。例如,不要使用以下的提交信息:
fix bug #123
update some code
try something new

而应该使用以下的提交信息:

fix(login): resolve the issue of password reset failure #123
style(user): format the code of user service according to gofmt
refactor(api): extract common logic of api handlers to a middleware

Git 的合并策略

Git 的合并是指将一个分支的修改合并到另一个分支,并生成一个新的提交。Git 的合并策略是指在合并过程中如何处理不同分支的修改,以及如何解决可能出现的冲突。Git 的合并策略有以下两种:

  • 快进(Fast-forward):这种策略是指如果被合并的分支是另一个分支的直接后继,那么只需要将指针移动到最新的提交,不需要创建一个新的提交。这种策略可以保持提交历史的线性,但是也会丢失分支信息。例如,如果 master 分支和 feature-login 分支没有冲突,那么使用快进策略合并后,master 分支的指针会直接移动到 feature-login 分支的最新提交,如下图所示:

  • 非快进(Non-fast-forward):这种策略是指如果被合并的分支不是另一个分支的直接后继,那么需要创建一个新的提交,来记录两个分支的合并情况。这种策略可以保留分支信息,但是也会使提交历史变得复杂。例如,如果 master 分支和 feature-login 分支有冲突,那么使用非快进策略合并后,会创建一个新的提交 F,并将 master 分支的指针移动到 F,如下图所示:

Git 的远程协作

Git 的远程协作是指开发者在本地仓库和远程仓库之间进行数据交换和同步的过程。Git 的远程协作可以遵循以下几个步骤:

  • 首先,需要在远程仓库中创建一个项目,并邀请团队成员加入。可以使用 git remote 命令来管理远程仓库的信息,如添加、删除、重命名、查看等。例如:
git remote add origin https://github.com/user/repo.git # 添加一个名为origin的远程仓库
git remote remove origin # 删除名为origin的远程仓库
git remote rename origin upstream # 将名为origin的远程仓库重命名为upstream
git remote show origin # 查看名为origin的远程仓库的详细信息
  • 其次,需要在本地仓库中克隆远程仓库,并创建自己的分支。可以使用 git clone 命令来克隆远程仓库到本地,使用 git branch 命令来创建和切换分支。例如:
git clone https://github.com/user/repo.git # 克隆远程仓库到本地
git branch feature-login # 创建一个名为feature-login的分支
git checkout feature-login # 切换到feature-login分支
  • 然后,需要在本地分支中修改代码,并提交到本地仓库。可以使用 git status 命令来查看文件的状态,使用 git add 命令来添加文件到暂存区,使用 git commit 命令来提交文件到本地仓库。例如:
git status # 查看文件状态
git add login.go # 添加login.go文件到暂存区
git commit -m "feat(login): add login function" # 提交login.go文件到本地仓库,并添加提交信息
  • 最后,需要将本地分支推送到远程仓库,并发起合并请求。可以使用 git push 命令来推送本地分支到远程分支,使用 git pull 命令来拉取远程分支到本地分支,并合并。例如:
git push origin feature-login # 将本地feature-login分支推送到远程origin/feature-login分支
git pull origin master # 将远程origin/master分支拉取到本地,并合并到当前分支