GitHub上のマージ方法について
リポジトリへのプッシュアクセスを持つコントリビューターに対し、使用している GitHub Enterprise Serverインスタンス上でプルリクエストを様々なマージオプションでマージすることを許可するか、リポジトリへのすべてのプルリクエストに特定のマージ方法を強制することができます。
使用している GitHub Enterprise Serverインスタンス 上でプルリクエストのマージオプションを設定して、ワークフローの要求と Git の履歴管理への要望を満たすことができます。 コミットsquashingあるいはリベースのようなマージの1つの種類を、リポジトリでその方法だけを有効化することで強制できます。
使用している GitHub Enterprise Serverインスタンス 上のプルリクエストでデフォルトの [Merge pull request(プルリクエストのマージ)] をクリックすると、フィーチャブランチのすべてのコミットがマージコミット中でベースブランチに追加されます。プルリクエストは --no-ff
オプションを使ってマージされます。
プルリクエストをマージするには、リポジトリの書き込み権限が必要です。
マージコミットのsquash
使用している GitHub Enterprise Serverインスタンス 上のプルリクエストの [Squash and merge] オプションを選択した場合、プルリクエストのコミットは単一のコミットに squash されます。コミット群はトピックブランチからのすべてのコントリビューターの個々のコミットとしてではなく、1 つのコミットとしてまとめられ、デフォルトブランチにマージされます。squash されたコミットを持つプルリクエストはfast-forward オプションを使ってマージされます。
プルリクエストを squash してマージするには、リポジトリの書き込み権限が必要で、リポジトリは squash マージを許可していなければなりません。
squash とマージを使って、リポジトリの Git の履歴をスムーズにすることができます。作業途中でのコミットはフィーチャブランチでの作業の際には役立ちますが、必ずしも Git の履歴として残すことは重要ではありません。デフォルトのブランチの際にそれらのコミットを 1 つのコミットに squash すれば、オリジナルの変更を明快な Git の履歴で残すことができます。
コミットの squash を有効化する前に、以下の欠点について考慮してください:
- 特定の変更が元々いつ行われたのか、そして squash されたコミットを誰が作成したのかという情報が失われます。
- "SHA" あるいは "hash" ID を使う Git コマンドの中には、オリジナルのコミット中の SHA ID が失われるので使うことが難しくなるものが生じるかもしれません。 たとえば
git rerere
はそれほど効果的ではなくなるかもしれません。
詳しい情報についてはプルリクエストのためのコミットsquashingの設定を参照してください。
リベースとコミットのマージ
使用している GitHub Enterprise Serverインスタンス 上のプルリクエストで [Rebase and merge] オプションを選択すると、トピックブランチ (あるいは head ブランチ) からのすべてのコミットは、マージコミットなしに個別にベースブランチへと追加されます。リベースされたコミットを持つプルリクエストは、fast-forward オプションを使ってマージされます。
プルリクエストをリベースしてマージするには、リポジトリの書き込み権限を持っていなければならず、リポジトリは リベースマージを許可していなければなりません。
GitHub Enterprise 上のリベースとマージの動作は、git rebase
とはやや異なります。GitHub 上のリベースとマージは、常にコミッタの情報を更新し、新しいコミット SHA を作成しますが、GitHub 外の git rebase
は先祖のコミット上でリベースが行われたときにコミッタの情報を変更しません。git rebase
に関する詳しい情報については、書籍 Pro Git の "Git rebase" の章を参照してください。
git rebase
のビジュアルな表現については書籍 Pro Git の "Git のブランチ機能 - リベースを参照してください。
コミットのリベースを有効化する前に、以下の欠点について考慮してください:
- リポジトリのコントリビューターは、コマンドライン上でリベースし、コンフリクトがあれば解決し、変更をプルリクエストのトピックブランチ (あるいはリモートの head ブランチ) へフォースプッシュしなければ、使用している GitHub Enterprise Serverインスタンス 上でリベースとマージという選択肢を使えるようにならないかもしれません。 フォースプッシュは、コントリビューターが他者が作業のベースとしている作業を上書きすることがないよう、慎重に行わなければなりません。 使用している GitHub Enterprise Serverインスタンスでリベースとマージの選択肢が無効化されている場合と、それを再度有効にするワークフローについてもっと知るには、プルリクエストのマージについてを参照してください。
詳しい情報についてはプルリクエストのためのコミットのリベースの設定を参照してください。