Pull-Request 駆動開発(?)のススメ

2021/04/29に公開

はじめに

Branchを切って作業するような場合、Branchの寿命が長くなるに連れ、Branch自体の目的を忘れがち。

Branchには一応Description(説明)という属性があるものの、
これはgit configによって設定されている値で、RemoteにPushされるようなものではない。

そこで、GitHub Pull RequestをBranchに対するメモ代わりに使うと割と便利だったので、
GitHub CLIも組み合わせて上手く扱う方法を軽くまとめた。

背景: GitHub CLI便利

GitHub CLIの利便性は本当にすごい。
たとえば、さっと「今のBranchから作ったPull Request」が見られたりして、とても便利。

$ gh pr view

Strict validation for email address in registration form

Draft • kyoh86 wants to merge 3 commits into master from velidate-email
Assignees: kyoh86

Summary

Now, ...

fix: https://github.com/kyoh86/dotfiles#1

To ready

  • Create validation function
  • Check the email in Registration API
  • Check the email in Change Profile API

NOTE

I'm not sure if the "ValidateEmail" function is correct.
Review "TestValidateEmail" carefuly plz.

View this pull request on GitHub: https://github.com/kyoh86/dotfiles/pull/7

具体的な操作

今回のテーマである「Branchのメモ代わりにPull Requestを用意する」には、
次のような操作をすることになる。

  1. Branchを切る
  2. Empty Commitを作る
  3. Draft Pull Requestを作る

コマンドにすると次の通り

$ git checkout -b feat-1
$ git commit --allow-empty -m 'wip: feat-1'
$ gh pr create --draft --assignee @me

便利な支援設定

毎回これを覚えて操作するのは面倒くさいので、GitHub CLIのAlias機能を使う。

$ gh alias set --shell branch 'git fetch origin && git branch --no-track "$1" "$(git symbolic-ref refs/remotes/origin/HEAD || { { git remote set-head origin --auto >/dev/null } && git symbolic-ref refs/remotes/origin/HEAD })"  && git switch "$1" && git commit --allow-empty -m "wip: $1" && gh pr create --assignee "@me" --draft'

これで

$ gh branch foo

とすれば、新しいBranch foo が作られて、Draft Pull Requestまで出来上がる。

このエイリアスが何をしているかは以下の通り。

  • git fetch origin : originをfetchする
  • git branch --no-track "$1" "$(...)" : HEAD BranchのRefから分岐するBranchを作る
    • git symbolic-ref refs/remotes/origin/HEAD : HEAD BranchのRefを取得する
    • git remote set-head origin --auto >/dev/null : HEAD が未設定の場合、HEADのSymbolic Refを作る
  • git switch "$1" : 新しいBranchに切り替える
  • git commit --allow-empty -m "wip: $1" : ブランチ名を元に空コミットを作る
  • gh pr create --assignee "@me" --draft : 自分にAssignしたDraft Pull Requestを作る

Pull Requestはコミュニケーションの場

個人開発プロジェクトだから出来る贅沢かもしれない。
Draftとはいえ、Pull Requestを先に作っちゃうという方法が嫌われる可能性もある。

いやがられたらこのやり方を強引に押したりしないように気をつけよう。

Discussion