マージ、リベース、チェリーピックで変更を適用
Git では、あるブランチから別のブランチへの変更を統合するいくつかの方法があります。
ブランチのマージ
特定のタスクを実行するために機能ブランチを作成し、機能を完了してテストした後、作業の結果 (F1、 F2、 F3) をメインコードベースに統合するとします。
ブランチを main に マージするのが、これを行う最も一般的な方法です。
フィーチャブランチで作業している間に、チームメイトが引き続き作業 (C4、 C5) を main にコミットすることはよくあります。
フィーチャーブランチを main に マージすると、フィーチャーブランチの変更がターゲットブランチの HEAD に統合されます。
Git は、2 つのブランチが分岐したポイントから機能ブランチと main の変更を結合した結果として得られる、マージコミットと呼ばれる新しいコミットを作成します。
マージの主な利点は、 main コードベースにマージされたコミットが元のハッシュと作成者を保持し、1 つの機能の一部であるすべてのコミットをグループ化できるため、完全な追跡可能性が確保されることです。
このワークフローは、既存のブランチはまったく変更されないため、 main コードベースへの変更のコミットに プル リクエストまたはマージリクエスト 、あるいは階層的な承認手順が含まれるプロジェクトに適しています。
このアプローチの主な欠点は、変更を組み込む必要があるたびに外部のマージコミットが作成され、プロジェクト履歴を激しく汚染し、読みにくくなることです。
ブランチのマージ
ブランチ ポップアップ(メインメニュー )または Git ツールウィンドウの ブランチ ペインで、変更を統合するターゲットブランチを選択し、コンテキストメニューから チェックアウト を選択してそのブランチに切り替えます。
次のいずれかを実行します。
マージのオプションを指定する必要がない場合は、現在のブランチにマージするブランチを選択し、サブメニューから <branch_name> を <target_branch> にマージする を選択します。

マージオプションを指定する必要がある場合は、メインメニューから を選択して マージ ダイアログを開きます。

現在のブランチにマージするブランチを選択し、 オプションを変更 をクリックして、以下から選択します。
--no-ff: マージが早送りとして解決できたとしても、マージコミットはすべての場合に作成されます。--ff-only: マージは、早送りが可能な場合にのみ解決されます。--squash: すべてのプルされた変更を含む単一のコミットは、現在のブランチ上に作成されます。-m: マージコミットのメッセージを編集できます。--no-commit: マージは実行されますが、マージコミットは作成されないため、コミットする前にマージの結果をインスペクションできます。--no-verify: 通常はデフォルトで実行されるマージ前フックとコミットメッセージフックをバイパスしながらマージを実行します。--allow-unrelated-histories: 共通の祖先を持たない履歴のマージを拒否する安全ルールを無視して、マージを実行します。
マージ をクリックします。
作業ツリーがクリーンであり(つまり、コミットされていない変更がない)、機能ブランチとターゲットブランチの間で競合が発生しない場合、Git は 2 つのブランチをマージし、マージコミットは Git ツールウィンドウ Alt+9 の ログ タブに表示されます。

ブランチとターゲットのブランチの間で競合が発生した場合、競合を解決するように求められます(競合の解決を参照)。 マージ後に未解決の競合が残っている場合、 コミット ツールウィンドウ (Alt+0) の該当する変更リストに マージの競合 ノードが表示され、解決のためのリンクが付きます。
マージによって上書きされるローカルの変更がある場合、IntelliJ IDEA は スマートマージ の実行を提案します。 このオプションを選択すると、IntelliJ IDEA はコミットされていない変更を スタッシュし、マージを実行してから、変更をスタッシュ解除します。
ブランチのリベース (git-rebase)
ブランチを別のブランチに リベース するとき、最初のブランチからのコミットを 2 番目のブランチの HEAD コミット上に適用します。
特定のタスクに取り組むためにフィーチャーブランチを作成し、そのブランチ (F1、 F2、 F3) に複数のコミットを行ったとします。
ブランチで開発している間、チームメイトは作業 (C4、 C5) を main にコミットし続けます。
チームメイト(C4、 C5 )が機能ブランチに加えた変更を統合するには、ブランチを main に リベースします。 これにより、 main の現在の HEAD コミット上にコミットが適用されます。
リベースの主な利点は、他の人が読みやすく理解しやすいクリーンなプロジェクト履歴が得られることです。 ログには、 merge 操作によって生成された不要なマージコミットが含まれず、移動や検索が簡単な線形履歴が得られます。
ただし、このワークフローを採用することを決定する場合、 リベース は元の機能ブランチ (F1 ではなく F1') の各コミットに対して新しいコミットを作成するため、プロジェクト履歴を書き換え、ハッシュが異なり、トレーサビリティが妨げられることに留意する必要があります。
ブランチを別のブランチ上にリベースする
メインメニューから を選択

リストから、現在のブランチをリベースするターゲットブランチを選択します。

ブランチ全体をリベースするのではなく、特定のコミットからソースブランチをリベースする必要がある場合は、 オプションを変更 をクリックして --onto を選択します。
ソースブランチフィールドに、現在のブランチを新しいベースに適用するコミットのハッシュを入力します。

リベースするブランチが現在チェックアウトされていない場合は、 オプションを変更、 別のリベース対象ブランチを選択する 順にクリックし、表示されるリストからブランチを選択します。

IntelliJ IDEA は、リベース操作を開始する前に、このブランチをチェックアウトします。
特定のケースに応じて、 オプションを変更 リストから他のオプションを選択します。
--rebase-merges: リベースされるコミット内のブランチ構造を保持します。これらのマージコミット内の解決済みのマージ競合または手動修正は、手動で解決または再適用する必要があることに注意してください。
--keep-empty: 親から何も変更されていないコミットである空のコミットを保持します。--root: ブランチで到達可能なすべてのコミットをリベースします。--update-refs: リベース中のコミットを指すブランチを自動的に強制更新します。--autosquash:フィックスアップまたはスカッシュが指定されたコミットを自動でスカッシュします。
リベース をクリックします。
リベースのオプションを指定する必要がない場合は、リベースダイアログを呼び出さずにリベースを開始できます。 ブランチ ポップアップまたは Git ツールウィンドウの ブランチペインでブランチを選択し、次のいずれかのアクションを選択します。

<current_branch_name> にチェックアウトしてリベースする (リモートとローカルブランチの両方)を使用して、選択したブランチをチェックアウトし、現在チェックアウトされているブランチ上にリベースします。 リモートブランチがローカルに存在しない場合、IntelliJ IDEA は追跡されたローカルブランチをサイレントに作成し、チェックアウトしてリベースします。
<current_branch_name> を <selected_branch_name> にリベースする (リモートとローカルブランチの両方)は、選択したものの上に現在チェックアウトされているブランチをリベースします。
リベースを使用して <current_branch_name> にプルする (リモートブランチの場合)は、選択したブランチから変更を フェッチし、これらの変更に基づいて現在のブランチをリベースします。
このビデオを見て、リベース操作を実行する方法をよりよく理解してください。
対話的なリベースを実行して Git 履歴を編集する
IntelliJ IDEA に Git を統合すると、 対話型リベースを実行して履歴を編集し、履歴を線形かつ意味のあるものにすることができます。 これにより、機能ブランチから別のブランチに変更を統合する前に、個々のコミットを変更したり、コミットの順序を変更したり、コミットを 1 つにまとめたり、不要な変更を含むコミットをスキップしたりして、コミットの履歴をクリーンアップすることができます。
現在のブランチの履歴を編集する
IntelliJ IDEA では、変更を別のブランチに適用する前に、現在のブランチのコミット履歴を編集できます。
Git ツールウィンドウ Alt+9 を開き、 ログ タブに切り替えます。
現在のブランチからのコミットのみを表示するようにログをフィルタリングします。

編集する一連のコミットの中で最も古いコミットを選択し、右クリックして ここから対話的にリベース を選択します。
選択したコミット後に行われた現在のブランチのすべてのコミットのリストを含む 対話式リベース ダイアログが表示されます。

ここから対話的にリベース オプションが無効になっている場合は、次のいずれかの理由が考えられます。
選択したコミットには複数の親があります
選択したコミットは現在のブランチにありません
選択したコミットは 保護されたブランチにプッシュされます。
理由を特定するには、コンテキストメニューのアクションの上にマウスを置き、ステータスバーでメッセージを探します。

ブランチ履歴に対して次の変更を実行できます。
コミットを適用する 順序を変更する:
および
ボタンを使用して、コミットをリストの上下に移動します。
コミットを選択: これは、すべてのコミットのデフォルトの状態です。 コミットに対してすでに実行したアクションを取り消す必要がある場合は、 ピック
をクリックして、このコミットがそのまま適用されるようにします。
編集: 停止して編集
をクリックして、リベースを開始するときに、このコミットで停止して編集できるようにします。
コミット時にリベースが停止すると、IntelliJ IDEA ウィンドウの右下隅に通知がポップアップ表示され、リベースを続行または中止できます。

リベースを続行する前に、コンテキストアクション (元に戻す、 元に戻す、 修正 など) を使用してこのコミットを変更できます。 何もアクションを実行しないと、このコミットはそのまま適用されます。
通知を閉じた場合は、メインメニューから Git | リベースを続行 を選択して再開します。
コミットメッセージを言い換える: リワード をクリックするか、コミットをダブルクリックして、開いたミニエディターでテキストを編集します。
2 つのコミットを 1 つに結合する: 前のコミットに統合するコミットを選択し、 スカッシュ または スカッシュ ボタンの横にある矢印をクリックしてから フィックスアップ をクリックします。
スカッシュ をクリックすると、デフォルトでは 2 つのコミットからのメッセージが結合されるため、結果のコミットメッセージを変更しないと、このアクションはブランチ履歴に反映されます。
フィックスアップ をクリックすると、フィックスアップコミットのコミットメッセージが破棄されるため、この変更はブランチ履歴に表示されません。
どちらの場合も、これらのアクションのいずれかを適用すると開くミニエディターでコミットメッセージを編集できます。
コミットを無視する: ドロップ をクリックして、選択したコミットからの変更が適用されないようにします。
変更点をすべて元に戻す: リセット をクリックして、コミットに適用したすべてのアクションを破棄します。
その結果、 コミットをリベース ダイアログには、ブランチ内のコミットに適用したすべてのアクションを示すグラフが表示されるため、リベースを開始する前に確認できます。

リベース開始 をクリックします。
ブランチの履歴を編集し、別のブランチに統合する
IntelliJ IDEA を使用すると、ブランチを別のブランチ上に リベースし、変更を適用する前にソースブランチ履歴を編集できます。
メインメニューから を選択

オプションを変更 をクリックし、 --interactive を選択します。
リストから、現在のブランチをリベースするターゲットブランチを選択します。

ブランチ全体をリベースするのではなく、特定のコミットからソースブランチをリベースする必要がある場合は、 オプションを変更 をクリックして --onto を選択します。
ソースブランチフィールドに、現在のブランチを新しいベースに適用するコミットのハッシュを入力します。

リベースするブランチが現在チェックアウトされていない場合は、 オプションを変更、 別のリベース対象ブランチを選択する 順にクリックし、表示されるリストからブランチを選択します。

IntelliJ IDEA は、リベース操作を開始する前に、このブランチをチェックアウトします。
特定のケースに応じて、 オプションを変更 リストから他のオプションを選択します。
--rebase-merges: リベースされるコミット内のブランチ構造を保持します。これらのマージコミット内の解決済みのマージ競合または手動修正は、手動で解決または再適用する必要があることに注意してください。
--keep-empty: 親から何も変更されていないコミットである空のコミットを保持します。--root: ブランチで到達可能なすべてのコミットをリベースします。--update-refs: リベース中のコミットを指すブランチを自動的に強制更新します。--autosquash:フィックスアップまたはスカッシュが指定されたコミットを自動でスカッシュします。
リベース をクリックします。
選択したコミット後に行われた現在のブランチのすべてのコミットのリストを含む 対話式リベース ダイアログが表示されます。

ブランチ履歴に対して次の変更を実行できます。
コミットを適用する 順序を変更する:
および
ボタンを使用して、コミットをリストの上下に移動します。
コミットを選択: これは、すべてのコミットのデフォルトの状態です。 コミットに対してすでに実行したアクションを取り消す必要がある場合は、 ピック
をクリックして、このコミットがそのまま適用されるようにします。
編集: 停止して編集
をクリックして、リベースを開始するときに、このコミットで停止して編集できるようにします。
コミット時にリベースが停止すると、IntelliJ IDEA ウィンドウの右下隅に通知がポップアップ表示され、リベースを続行または中止できます。

リベースを続行する前に、コンテキストアクション (元に戻す、 元に戻す、 修正 など) を使用してこのコミットを変更できます。 何もアクションを実行しないと、このコミットはそのまま適用されます。
通知を閉じた場合は、メインメニューから Git | リベースを続行 を選択して再開します。
コミットメッセージを言い換える: リワード をクリックするか、コミットをダブルクリックして、開いたミニエディターでテキストを編集します。
2 つのコミットを 1 つに結合する: 前のコミットに統合するコミットを選択し、 スカッシュ または スカッシュ ボタンの横にある矢印をクリックしてから フィックスアップ をクリックします。
スカッシュ をクリックすると、デフォルトでは 2 つのコミットからのメッセージが結合されるため、結果のコミットメッセージを変更しないと、このアクションはブランチ履歴に反映されます。
フィックスアップ をクリックすると、フィックスアップコミットのコミットメッセージが破棄されるため、この変更はブランチ履歴に表示されません。
どちらの場合も、これらのアクションのいずれかを適用すると開くミニエディターでコミットメッセージを編集できます。
コミットを無視する: ドロップ をクリックして、選択したコミットからの変更が適用されないようにします。
変更点をすべて元に戻す: リセット をクリックして、コミットに適用したすべてのアクションを破棄します。
その結果、 コミットをリベース ダイアログには、ブランチ内のコミットに適用したすべてのアクションを示すグラフが表示されるため、リベースを開始する前に確認できます。

リベース開始 をクリックします。
Git 対話式リベースの使用方法の詳細については、このビデオを参照してください。
チェリーピックの個別コミット
場合によっては、ブランチ全体をリベースまたはマージするのではなく、別のブランチに単一のコミットを適用するだけで済むことがあります。 これは、たとえば、ブランチという機能で作業していて、2 つのブランチが分岐した後にコミットされた main のホットフィックスを統合したい場合などに便利です。 あるいは、以前のリリースのブランチに修正をバックポートしたい場合もあります。 これは、 チェリーピック アクションを使用することで可能です。
ステータスバーには cherry-pick 操作の現在の状況が表示されます。 次のアクションで cherry-pick の処理を管理できます。
中止:進行中の cherry-pick をキャンセルするには、VCS ウィジェットで cherry-pick の中断 を選択するか、ステータスバーで
をクリックしてください。
続行:進行中の cherry-pick が一時停止されている場合(たとえば競合を解決するため)、VCS ウィジェットで Cherry-Pick を続行 を選択するか、ステータスバーで
をクリックして処理を完了してください。

他のブランチにコミットを適用する
ブランチ ポップアップ(メインメニュー )で、変更を統合するターゲットブランチを選択し、ポップアップメニューから チェックアウト を選択して、そのブランチに切り替えます。
Git ツールウィンドウ Alt+9 を開き、 ログ タブに切り替えます。
チェリーピックする変更を含むコミットを見つけます。
ブランチ、ユーザー、日付でコミットをフィルタリングできます。 ツールバーの
をクリックし、 ハイライト | 未選択のコミット オプションを選択して、現在のブランチにすでに適用されているコミットをグレー表示することもできます。 コミットハッシュがわかっている場合、またはタグ付きコミットを探している場合は、 ハッシュ / ブランチ / タグに移動 アクションを使用することもできます(Git ツールウィンドウ Alt+9 の ログ タブで Ctrl+F を押すか、ツールバーの
をクリックします)。
必要なコミットを選択してください。 コミットの詳細 エリアの情報を使用して、これらが別のブランチに転送したい変更であることを確認してください。
ツールバーの チェリーピック
をクリックします。 IntelliJ IDEA は、ターゲットブランチに変更を適用してコミットします。
チェリーピックが競合で失敗した場合、選択した変更は コミット ツールウィンドウ (Alt+0) にある 変更 領域に表示されます。 これらの変更を確認し、必要に応じて後でコミットできます。
チェリーピックが失敗した場合に IntelliJ IDEA で変更リストを自動的に作成する場合は、 で対応する設定をオンにします。
ターゲットブランチへの変更をプッシュします。
次のビデオは、チェリーピックがどのように機能するかを理解できます。
個別の変更を適用する
あるファイルに変更を加え、それを別のブランチに適用したいが、その変更が他の変更されたファイルと一緒にコミットされてしまったとします。 IntelliJ IDEA を使用すると、コミット全体をチェリーピックするのではなく、変更リストに個別の変更をすぐにコミットせずに適用できます。
ブランチ ポップアップ(メインメニュー )で、変更を統合するターゲットブランチを選択し、ポップアップメニューから チェックアウト を選択して、そのブランチに切り替えます。
Git ツールウィンドウ Alt+9 を開き、 ログ タブに切り替えます。
適用したい変更が含まれているコミットを見つけます。
ブランチ、ユーザー、日付でコミットをフィルタリングできます。 ツールバーの
をクリックし、 ハイライト | 未選択のコミット オプションを選択して、現在のブランチにすでに適用されているコミットをグレー表示することもできます。 コミットハッシュがわかっている場合、またはタグ付きコミットを探している場合は、 ハッシュ / ブランチ / タグに移動 アクションを使用することもできます(Git ツールウィンドウ Alt+9 の ログ タブで Ctrl+F を押すか、ツールバーの
をクリックします)。
右側の コミットの詳細 ペインで、ターゲットブランチに適用する変更を含むファイルを選択し、コンテキストメニューから 選択した変更を Cherry-Pick を選択します。
開いたダイアログで、既存の変更リストを選択するか、新しい変更リストの名前を入力して OK をクリックします。
変更をコミットしてから、ターゲットブランチにプッシュします。
個別のファイルを適用する
単一のファイルに個別の変更を適用することに加えて、ファイルのコンテンツ全体を別のブランチにコピーできます。 これは、たとえば、適用するファイルがターゲットブランチに存在しない場合や、複数のコミット内で変更が加えられた場合に便利です。
変更が適用されるブランチに 切り替えます。
ブランチ ポップアップ(メインメニュー )または Git ツールウィンドウの ブランチ ペインで、適用するファイルを含むブランチを選択し、コンテキストメニューから 作業ツリーとの差分を表示 を選択します。
開いた 変更 ツールウィンドウには、現在チェックアウトされているブランチと比較して、選択したブランチで異なるすべてのファイルのリストが表示されます。

選択したブランチに存在し、現在のブランチには存在しないファイルは、灰色でマークされます。
現在のブランチに存在するが、選択したブランチにないファイルは、緑色でマークされます。
選択したブランチと現在のブランチの違いを含むファイルは、青色でマークされています。
ブランチを入れ替え リンクをクリックして、他のブランチと比較するベースと見なされるブランチを変更できます。
現在のブランチに適用するファイルを選択し、コンテキストメニューから ブランチから取得 を選択するか、ツールバーの
をクリックします。
変更をコミットしてプッシュします。 IntelliJ IDEA は、ファイルの内容全体を現在のブランチにコピーします。