プルリクエストのマージについて
フィーチャブランチにすべてのコミットを保ち、すべてのコミットを単一のコミットにsquashするか、個々のコミットをhead
ブランチからbase
ブランチにリベースすることによって、プルリクエストをマージできます。
使用している 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 の履歴で残すことができます。
プルリクエストコミットのリベースとマージ
使用している 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 のブランチ機能 - リベースを参照してください。
以下の場合、使用している GitHub Enterprise Serverインスタンス上で自動的にリベースおよびマージすることはできません:
- プルリクエストにマージコンフリクトがある。
- ベースブランチからヘッドブランチへのコミットのリベースでコンフリクトが生じる。
- たとえば、マージコンフリクトなしにリベースできるものの、マージとは異なる結果が生成されるような場合、コミットのリベースは「安全ではない」と考えられます。
それでもコミットをリベースしたいにもかかわらず、使用している GitHub Enterprise Serverインスタンス 上で自動的にリベースとマージが行えない場合、以下のようにしなければなりません:
- トピックブランチ (あるいは head ブランチ) をベースブランチにローカルでコマンドラインからリベースする
- コマンドライン上でマージコンフリクトを解決する
- リベースされたコミットをプルリクエストのトピックブランチ (あるいはリモートの head ブランチ) にフォースプッシュする。
リポジトリに書き込み権限を持つ人は、続いて使用している GitHub Enterprise Serverインスタンス上のリベース及びマージボタンを使って変更をマージできます。