本文是关于使用 Git 进行团队协作的一种实践,目的是使得 Git 的历史清晰明了,团队成员责任明确。

编辑

从 master 分支上新建分支,通过git checkout -b new-feature创建new-feature分支,开始工作

  • 编辑
  • 提交
  • 重复上述步骤

完成之后,提交到仓库git push origin new-feature

Code Review

提交之后,发 pull request,拉同事来做 code review。Code review 完成之后,在本地执行git fetch,从远端下载最新的更新。

合并与提交

开始合并工作—使用 rebase 而不是 merge:使用 rebase 将自己的更改提交合并成一个功能性的提交,这样在 master 分支的历史就会清晰明了,而 merge 会将每一个 commit 插入到历史里,增加了 review 的复杂度。如图所示,merge 提交之后,commit b 插入到 master 的历史纪录里;而 rebase 不会破坏 master 的提交记录。

git merge and rebase
git merge and rebase

git rebase -i origin/master
# 该命令会新建一个未命名的分支,在该分支上执行合并
# 执行后会跳到编辑页面,保留第一个 pick,其他 pick 改成 squash,保存退出
git status
# 执行下 git status,会看到分支已经更改
# 此时一般会出现冲突,执行 git status 查看冲突
# 编辑冲突
  # 编辑冲突完成,继续,循环上述操作直到没有冲突
  # 编辑完可能需要使用 git add -u 加入
  git add -u
  git rebase --continue
  # 如果遇到问题,abort 掉这次rebase,重新执行
  git rebase --abort
# 冲突编辑完毕后
# 复制 git log 的最新 commit id
git checkout master
git rebase #得到远端最新 master 内容
# 上面获取远端 master 内容如有异常,可以尝试 git reset --hard origin/master
git cherry-pick commit_id #该 commit id 就是刚才复制的内容
# 修改 commit 信息,使用简洁的描述,比如 fixed #99: user management
git commit --amend
# 检查一下,提交更改
git push origin master

little tips:

在做衍合的时候,先衍合到共同的历史记录,然后再衍合

# a--b--c
# \--d--e
git rebase -i a
git rebase -i origin/master