コンテンツにスキップ

GitHub@Git

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. Issue

作業内容

▼ 作成

テンプレートを元に、Issueを作成する。

1個のIssueとブランチにたくさんの実装をコミットすることは望ましくない。

そこで、大きな対応を個々の対応に分割する。

そして、大きな対応に関する基点Issueと基点ブランチを作成し、個々の対応に関連する子Issueと子ブランチを作成していく。

個別の対応が終了したら、親ブランチへマージしていく。

▼ 削除

リポジトリの管理者権限があれば削除できる。


テンプレート

▼ 配置場所

リポジトリの直下に.githubディレクトリを配置し、ISSUE_TEMPLATE.mdファイルやPULL_REQUEST_TEMPLATE.mdファイルを配置する。

Issueのテンプレートに関して、代わりにISSUE_TEMPLATEディレクトリを配置し、任意の名前のmdファイルを配置すると、複数のテンプレートを作成できる。

repository/
├── .github/
│   ├── ISSUE_TEMPLATE.md
│   └── PULL_REQUEST_TEMPLATE.md

repository/
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── FIX.md
│   │   └── UPDATE.md
│   │
│   └── PULL_REQUEST_TEMPLATE.md

▼ タイトル

タイトルは『〇〇する。

』とする。

句読点の有無は好み。

▼ 内容

内容は『背景』と『対応方針』さえ伝われば、文言自体はそのリポジトリのルールに合わせる。

*例*

# 背景

<!-- Issue作成の理由になった要望やバグを記載する -->
<!-- 関連するIssueやプルリクエストがあればリンクを共有する -->

# 対応方針

<!-- どのような方法で対応する予定なのかを箇条書きで記載する -->
<!-- 方法に関するドキュメントや技術記事があればリンクを共有する -->


02. プルリクエスト

作業内容

▼ 呼び名

GitHubだとプルリクエストであるが、GitLabだとマージリクエストという。

▼ 作成

テンプレートを元に、プルリクエストを作成する。

▼ 削除

削除できないため、クローズするしかない。

犯した罪は背負って生きていかなければならない。


テンプレート

▼ 配置場所

Issueテンプレートと同じ階層に配置する。

▼ タイトル

タイトルは『〇〇した。

』とする。

句読点の有無は好み。

▼ WIP

実装途中のプルリクエストであり、実装方法などを質問したい場合、タイトルに『WIP』とつけておく。

レビューしてもらいたくなったら、これをはずす。

レビュー修正時に、実装に時間がかかりそうであったら、再び付けても良い。

▼ 内容

内容は『対応内容』と『レビューしてほしいところ』さえ伝われば、文言自体はそのリポジトリのルールに合わせる。

もし、レビュー期限や動作確認手順を知らせる必要があれば『レビュー期限』『確認手順』の項目を設ける。

*例*

# リリース予定日

<!-- リリース予定日を記載する -->

# 対応内容

<!-- どのように対応したのか箇条書きで記載する -->
<!-- 関連するIssueやプルリクエストがあればリンクを共有する -->

# レビューしていただきたいところ

<!-- 対応内容の中で適切か否かが不安なものを記載する -->


コミットの粒度

DBからフロント出力までに至る実装をコミットする場合、以下の3個を意識する。

  • DBからコミット
  • 関連性のある実装をまとめてコミット
  • 一回のコミットが持つコードサイズが少なくなるようにコミット


レビュー観点

▼ ビジネスルールや要件通りか

実装の条件文や、コメントから、ビジネスルールや仕様を理解する。

(1)

条件文でvar_dumpメソッド を実行する。

(2)

どういった入力がされた時にtrueとして判断しているのかを確認。例えば、受注済区分値が設定されている時に、それが失注区分値に変わった場合、値を返却しているならば、そこから、『失注』のビジネスルールが垣間見える。

(3)

定数に添えられたコメントから、仕様を理解。

▼ バリデーションは適切か

正しく区別してemptyメソッド やissetメソッド などを使えているか否かを確認する

▼ 冗長になっていないか

重複する処理をforeachメソッドにまとめられないか否かを確認する。

また、変数の格納が重複していないか否かを確認する。


03. GitHub-API

最新リリース

GitHubのAPIを使用することで、リリースページにある最新のバイナリをインストールできる。

# リリースページの最新のバイナリへのURLを取得する
$ LATEST_DOWNLOAD_URL=$(curl -sL https://api.github.com/repos/hiroki-hasegawa/foo-repository/releases/latest | jq -r ".assets[].browser_download_url" | grep linux_amd64)

$ curl -sL -O "${LATEST_DOWNLOAD_URL}"

# 解凍する
$ tar zxvf *.tar.gz

# 相対パスでバイナリを実行する
$ ./foo-bainary --version


04. Git-flow

Git-flowとは

Gitでソフトウェアを開発する場合、役割を持たせたブランチを作成し、ルールに沿ってコミットする。Git-flowを簡略化したものに、GitHub-flowやGitlab-flowがある。

git-flow


実行環境とブランチ

▼ 対応関係

ブランチのデプロイ先となる実行環境は、以下の通りに分類できる。

より上位の実行環境ほど、本番環境に近くなる。

実行環境名 ブランチ
開発環境 (ローカルマシン) feature
テスト環境 (サンドボックス環境、検証環境) develop/testing (develop/sandbox)
ステージング環境 (ユーザー受け入れ環境) develop/staging (develop/ua)
本番環境 release

mainブランチ (production)

本番環境にデプロイする機能を準備するためのブランチ。

本番環境への実際のデプロイは、releaseブランチから実行する。

hotfixブランチ

リリース後に修正点が見つかった場合、修正用ブランチを作成し、これを速やかにリリースする必要がある。

(1)

Issueを作成する。

(2)

mainブランチから、『hotfix/<issue番号>』の名前でブランチを作成する。

(3)

プルリクエストを作成し、マージの向き先をmainブランチとする。

(4)

速攻でapproveをもらい、mainブランチにマージする。この時、hotfixブランチは後でdevelopブランチにマージするため、削除しないようにする。

(5)

パッチ番号を1つ増やしたタグを付与し、再リリースする。

(6)

リリース後、エラーが解決されたら、ローカルマシンでhotfixブランチをdevelopブランチにマージする。

releaseブランチ

developブランチまたはmainブランチを基点とし (個人的にはmainブランチ基点) 、本番環境にデプロイする機能をまとめるためのブランチ。

releaseブランチの作成自体が任意であるが、もし作成しない場合にはdevelopブランチにマージできないプルリクエストがたくさん溜まることになるため、推奨である。

develop/stagingブランチ (develop/ua)

developブランチを基点とし、ステージング環境 (ユーザー受け入れ環境) に機能をデプロイするためのブランチ。

CIツールやCDツールを使用して、コミット (マージコミットを含む) によってデプロイが発火する。

develop/testingブランチ (develop/sandbox)

developブランチを基点とし、テスト環境 (サンドボックス環境、検証環境) に機能をデプロイするためのブランチ。

CIツールやCDツールを使用して、コミット (マージコミットを含む) によってデプロイが発火する。

featureブランチ

developブランチを基点とし、機能を作成/更新/削除するリクエストを作成するためのブランチ。


リリースノート

▼ 例

github_release-note

▼ タグ

release/v<セマンティックバージョニング>』とする。タグの付与先対象とするブランチは、『Taget: main』を選択する。

X.Y.Z 説明
メジャー (X) 機能の追加/変更/バグ修正である。後方のバージョンと互換性がない。ユーザーは、既存の実装を変更しないと既存機能と新機能を利用できない。
マイナー (Y) 機能の追加/変更/バグ修正である。後方のバージョンと互換性がある。ユーザーは、実装を追加するだけで新機能を利用でき、また実装を変更せずに既存機能を利用できる。
パッチ (Z) 機能のバグ修正である。後方のバージョンと互換性がある。ユーザーは、実装はそのままで既存機能を利用できる。

▼ リリース名

タグのバージョンをリリース名とする。

▼ 本文

以下の通りの本文とする。

『新規追加』『変更』『修正』ごとに、プルリクエスト番号をリスト化する。

3個のどれに当てはまるかは、プルリクエストがどういった対応なのかで判断する。

最低限リリース内容さえわかればよいので、厳密に分類できなくとも問題ない。

# リリース内容

## 新規追加

- プルリクエスト番号

## 変更

- プルリクエスト番号
- ...

プルリクエスト番号

## 修正

- プルリクエスト番号


05. コンフリクトの解決

解決方法

▼ Gitを使用して

(1)

git statusを行い、特定のファイルでのコンフリクトが表示される。

Unmerged paths:
  (use "git restore --staged <file>..." to unstage)
  (use "git add <file>..." to mark resolution)
        both modified:   foo/bar.twig
(2)

コンフリクトしていたコード行を取捨選択する。

<?php
/// Phpstromにて、コンフリクトしていたコード行を取捨選択する。
(3)

一度addを行い、コンフリクトの修正をGitに認識させる。

$ git add foo/bar.twig
(4)

git statusを行い、以下が表示される。コンフリクトが解決されたが、マージされていないと出力される。差分のファイルがたくさん表示される場合があるが、問題ない。

All conflicts fixed but you are still merging.

Changes to be committed:
        modified:   foo.twig
        modified:   foo.php
(5)

git commit (-mはつけてはいけない) を行い、vimエディタが表示される。

 Merge branch "ブランチ名" into ブランチ名
(6)

:wqでエディタを終了すれば、コンフリクトを解決したマージコミットが作成される。

(7)

git statusを実行する。場合によっては、差分のコミット数が表示されるが問題ない。

Your branch is ahead of "origin/feature/update_foo" by 10 commits.
(8)

プッシュする。この時、マージコミットを作成する時、基点ブランチ以外からマージしていると、差分のコミットが1つにまとまらず、

▼ GitHubを使用して

プルリクエスト上に『Resolve conflicts』ボタンが出現し、ここからコンフリクトを修正できる。

▼ エディタを使用して

エディタの例として、PHPStormを使用する。

一番簡単かもしれない。


ブランチ別の解決方法

▼ feature vs. develop

featureブランチからdevelopブランチへのマージ時にコンフリクトが起きることがわかった場合、まずdevelopブランチからfeatureブランチにマージを実行し、featureブランチ上のファイルを修正する。

修正でコンフリクトが解決されれば、プルリクエスト上にプッシュする。

▼ develop vs. main

developブランチからmainブランチへのマージ時にコンフリクトが起きることがわかった場合、まずdevelopブランチからコンフリクト解決用のfeatureブランチを作成する。

mainブランチからfeatureブランチにマージを実行し、このfeatureブランチ上のファイルを修正する。

この修正を基に、コンフリクトを解決するためのプルリクエストを新たに作成する。

featureブランチとdevelopブランチとの差分が最小限になるように、必要であれば、developブランチから必要なファイルをコピーしてくる。


基点ブランチからの変更の取り込み

1個の基点ブランチから数段階の派生ブランチが作成されている場合、基点ブランチから一段目、一段目から二段目、というように順にマージを行わないと、コンフリクトの原因になる。

(1)

基点ブランチから、一段目の派生ブランチにマージし、これをプッシュする。ここでプッシュしないと、2番目のブランチが1つ目のブランチとの差分を検出してしまい、大サイズの差分コミットをマージすることになってしまう。

(2)

一段目のブランチから二段目のブランチにマージし。これをプッシュする。