GitHub Flowとmagitによるプルリクエスト開発フロー[個人開発向け]

GitHub issueを対応するときの開発フローについてまとめました。大まかな流れは以下の通りです。

  • gitブランチを作成しcheckoutする
  • ブランチ上で開発し実装完了したらコミットする
  • リモートにブランチ名でpushする(masterにpushしない)
  • GitHub上でプルリクエストを作成してmasterにマージする
  • issueをクローズする
  • ローカルにpullする

f:id:rydeenworks:20191230162741j:plain

photo credit: ben_nuttall Octocat @ GitHub's Oval Office via photopin (license)

著者について

この記事を書いている私はプログラミング歴15年です。 個人開発歴は3年、magit歴は2年程度です。

1 magitの使い方

私はSpacemacsを愛用しています。以降の操作は全てSpacemacs環境での利用を想定しています。

1.1 magit-status

git管理下にあるファイルをemacsで表示中に magit-status を実行する。

f:id:rydeenworks:20191230212249p:plain

1.2 magitヘルプ表示

magit-status画面で ?キーを押すとヘルプを表示できる。

f:id:rydeenworks:20191230212314p:plain

2 gitブランチを作成しcheckoutする

ヘルプ表示より bキーを押すとブランチが作成できることがわかりましたので bキーを押します。 そうするとブランチのメニュー表示が出ます。 今回はブランチを作成してcheckoutしたいので cキーを押します。

f:id:rydeenworks:20191230212343p:plain

次にブランチの元を入力する画面が表示されます。masterをブランチ元とします。

f:id:rydeenworks:20191230212405p:plain

ブランチ元を入力したら、今度はブランチ名を入力する画面が表示されます。 ブランチ名は feature/#issue番号/issue概要 にします。全部英語。 "feature"は機能開発用のブランチという意味です。

f:id:rydeenworks:20191230212434p:plain

入力するとmagit-status画面に戻り、ブランチが作成されてcheckoutされた状態になりました。

f:id:rydeenworks:20191230212454p:plain

一応ターミナル上でもgitの状態を確認してみると、ブランチがcheckoutされていることがわかります。

f:id:rydeenworks:20191230212520p:plain

3 ブランチ上で開発し実装完了したらコミットする

3.1 修正ファイルのstage

今回はAndroidStudioで開発しましたが、git操作は全てmagitで行うことにします。修正は完了した状態とします。

magit-statusのヘルプ表示から gキーを押すとmagit-statusの表示更新ができることがわかります。gキーを押すと修正ファイルがunstageの状態となっています。

f:id:rydeenworks:20191230212543p:plain

修正ファイルの行にカーソルを当てて sキーを押すとstage状態になります。S(大文字S)キーで一括でstageできます。

3.2 修正ファイルのcommit

stage状態の設定が終わったらcommitします。commitはcキーです。commitメニューが表示されます。メニュー画面でcキーを押すとcommitできます。

f:id:rydeenworks:20191230212605p:plain

そうするとdiff画面とcommitコメントを入力する画面が表示されます。とても便利です。 commitコメントには issue番号 を必ず入れます。issue番号を入れるとGitHubが自動でissueとcommitを紐づけてくれるからです。

今回のissue番号は #18 です。コメント記入したらC-c C-cとキー入力するとcommit実行できます。

f:id:rydeenworks:20191230212627p:plain

4 リモートにブランチ名でpushする

magit-status画面でP(大文字P)キーを押すとpushメニューが表示されます。 push先のURLが設定済みの前提ですが、uキーでpushします。

f:id:rydeenworks:20191230212650p:plain

ブランチ名を入力する画面が表示されます。origin/ + ブランチ名 を入力します。 origin/feature/#18/issue_testです。これでpush完了です。

f:id:rydeenworks:20191230212715p:plain

5 GitHub上でプルリクエストを作成してmasterにマージする

5.1 GitHub上でブランチを確認しプルリクエストを作成する

GitHubリポジトリのPullRequestsタブを開くと、ブランチがpushされたと表示されています。 Compare & pull requestボタンを押てプルリクエストを作成します。

f:id:rydeenworks:20191230212747p:plain

ボタンを押すとプルリクエスト作成画面になります。必要な情報を入力してCreate pull requestボタンを押します。

f:id:rydeenworks:20191230212831p:plain

5.2 GitHub上でmergeする

プルリクエストが作成されると、Merge pull requestボタンが出現しますので、ボタンを押します。

f:id:rydeenworks:20191230212923p:plain

次にConfirm mergeボタンを押します。confirmとはマージして良いかの確認を意味します。

f:id:rydeenworks:20191230212946p:plain

画面上にmergedと表示されました。マージ成功です。マージが終わったらブランチは不要なのでDelete baranchボタンを押してブランチを削除します。

f:id:rydeenworks:20191230213004p:plain

6 issueをクローズする

issue画面を表示するとブランチでコミットした内容とプルリクエストによってマージした内容が表示されています。 Close issueボタンを押してissueをクローズします。

f:id:rydeenworks:20191230213024p:plain

クローズしました。

f:id:rydeenworks:20191230213041p:plain

7 ローカルにpullする

リモートのmasterの内容をローカルにpullします。まずはmagit-statusで状態の確認します。 featureブランチのままだったので、masterブランチに切り替えます。

f:id:rydeenworks:20191230213102p:plain

magit-statusの画面で bキーを押してブランチメニューを表示します。ブランチメニューでも bキーを押してcheckoutするブランチを入力します。

f:id:rydeenworks:20191230213131p:plain

checkoutするのはmasterですので、masterと入力します。

f:id:rydeenworks:20191230213200p:plain

入力完了するとmagit-statusの画面に戻り、masterに切り替わった事がわかります。

f:id:rydeenworks:20191230213227p:plain

masterに対してpullします。magit-status画面でF(大文字F)キーでpullのメニュー画面が表示されます。メニューではuキーを押す事でリモートのmasterの内容をローカルに反映できます。

f:id:rydeenworks:20191230213245p:plain

反映できました。

f:id:rydeenworks:20191230213307p:plain

不要になったブランチは削除しましょう。"feature/#18/issue_test"ブランチを削除しました。bキーでブランチメニューを表示してxキーでdeleteを選択し、削除するブランチ名を入力すればOKです。

f:id:rydeenworks:20191230213330p:plain

参考

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)