采用 Fork & PR 的方式工作

当我们领取了任务后,如何开展工作呢?

冒险者公会鼓励采用 Fork & PR 代码协作模型。

use-fork-and-pr

Fork 一个仓库

进入某个仓库的主页,点击Fork按钮,创建一个新的派生项目(Create a new fork)

fork-repo.webp

进入自己的仓库,将会看到一个fork的仓库

如果安装了github的命令行工具,可以使用如下命令快速完成

gh fork 36node-fcp/admin-web

如果你喜欢使用 github desktop 工具,可以参考 Github Docs 上的帮助文档,它可以很方便的帮助你 fork 一个仓库。

创建分支进行工作

现在仓库都在您自己的空间下,如何clone代码想必已经是驾轻就熟了。

git clone https://github.com/YOUR-USERNAME/Spoon-Knife

但是不要着急直接在 main 分支上开展工作,这不是一个好习惯。

根据这次任务的需要,创建一个需要的分支

## feature
git checkout -b feat/some-feature

## fix bug
git checkout -b fix/some-bug

## refactor
git checkout -b refactor/route

## docs
git checkout -b docs/some-doc

## devops
git checkout -b chore/github-ci

如果是 hotfix,则需要从 tag 迁出分支,总之我们将不再main分支上直接工作,这个可以确保我们可以有条不紊的并行好几项工作,并且在与remote同步时,保持简洁,不易出错。

代码或者文档更新完成后,commit 你的修改并推送到你自己的仓库中。

git add some-file
git commit -m "feat: finish some work"
git push -u origin feat/some-feature

创建 PR

最直观的方法是在网页上创建 PR,回到派生的repo,会看到新分支和修改的合并提交信息,点击 Compare & pull request

仔细填写 PR 的标题和内容,每个工程往往会有自己的格式要求。

如果有对应的issue,可以通过键入#添加(Github 会自动展示 issues 列表)。

#前面添加close关键字,会在PR合并后自动关闭这个 issue。

我们也可以通过gh命令来实现这一步

gh create pr

合并上游修改

请时刻记住,origin repo(我们可以称之为upstream)会不断更新前进,我们在每次开展新工作之前,尽量都要与upstream保持同步。同步也很简单,因为我们保持了main分支的纯洁,不会产生不良后果。

点击Sync fork按钮进行同步,可以只选择同步main分支。

现在回到我们的电脑上,使用如下命令将 main 分支上的代码同步到我们的工作空间。

cd ./your-code-folder
git pull

我们有几种情况需要使用rebase来推进我们当前正在工作的分支:

  • 我们需要main分支上的一些代码
  • 提交的pr与upstream有冲突(conflict)
  • 自律

不要害怕rebase,这是git最核心最有价值的一部分。

# 回到你工作的分支
git checkout feat/some-feat

# rebase main
git rebase main

在 rebase 过程中,根据提示一步接一步的操作,有冲突的文件可以在 vscode 编辑器里调整。需注意:

  • rebase 过程中,只需要使用git add而不需要git commit
  • 解决完冲突后,需要执行 git rebase --continue
  • git rebase --abort 可以帮助你撤销并退出本次操作

进阶操作

rebase 的原理是将你本地的commit,挨个调整。如果你的分支有很多稀碎的commit,rebase --continue 会需要执行多次。此时可以考虑压缩一下这些commit,将会减少 rebase 的次数。

压缩(squash)也是使用 rebase 命令。

# 查看自己分支上的提交记录,并复制希望压缩到的 commit sha
git log
# 从 head 一直到你选中的 sha 将会被压缩成一条 commit 记录
git rebase -i sha
# 此时会打开一个 vim 
# 需要压缩的条目,前缀改成 s 或者 f
# 修改完成后,esc,:wq 保存退出
# 如果想撤销这次 squash,esc, :q! 退出

具体可以参考下图

为什么我们不推荐 Branch & PR 模型

Branch & PR 模型是指当你有repo的写权限时,直接在原有仓库创建分支进行工作并提交代码。

  1. 不安全

需要为协作者开放repo的写权限,才能推送分支。

最具有威胁的操作是 push origin :main,将清空服务器仓库里的主分支。

  1. 会产生很多垃圾分支

需要优秀的分支命名和以及及时的清除政策,否则github仓库里将会充斥各种奇怪的分支,甚至会重名,例如很多人喜欢把一个分支叫fix/some

本地工作环境由于经常从origin拉取代码,也会将这些分支都拉到本地,过一段时间就需要用prune命令进行清除,繁琐且容易出错。

  1. 容易被误删除

类似github desktop工具,是可以方便的将远端分支删除,我曾经就错误的指导过同事,一下子把线上基于branchPR都删掉了。

  1. 采用fork的方式,在自己的空间下,可以一目了然的了解自己工作的repo list

参考

TODO:

  1. 哪位小伙伴研究一下,并提交一份文档。如何完全用Github Desktop工具完成fork and pr的工作,这将对产品经理有很大的帮助。根据 Desktop 的官方文档说明,这是一个比较方便的操作。

results matching ""

    No results matching ""