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

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

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

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

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

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

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

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

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

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

リベース開始 をクリックしてください。
ブランチの履歴を編集し、別のブランチに統合する
DataGrip では、ブランチを別のブランチ上に リベースし、変更を適用する前にソースブランチの履歴を編集できます。
メインメニューから を選択
オプションを変更 をクリックし、 --interactive を選択します。
リストから、現在のブランチをリベースしたいターゲットブランチを選択します:

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

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

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

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

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

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

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

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