マージ、リベース、チェリーピックで変更を適用
Git では、あるブランチから別のブランチへの変更を統合するいくつかの方法があります。
ブランチのマージ
特定のタスクを実行するために機能ブランチを作成し、機能を完了してテストした後、作業結果をメインコードベースに統合するとします。
これを行う最も一般的な方法は、ブランチをマスターにマージすることです。
機能ブランチで作業をしている間、チームメイトが master に作業をコミットし続けることはよくあることです。
merge
を実行すると、機能ブランチからの変更がターゲットブランチの HEAD に統合されます。
Git は、2 つのブランチが分岐したポイントからあなたの機能ブランチとマスターからの変更を組み合わせたマージコミットと呼ばれる新しいコミット(M)を作成します。
マージの主な利点は、メインコードベースにマージされたコミットが元のハッシュと作成者を保持し、1 つの機能の一部であるすべてのコミットをグループ化できるため、完全な追跡可能性が得られることです。
このワークフローは、既存のブランチがまったく変更されないため、メインコードベースへの変更のコミットにプルリクエストやマージリクエスト、または階層的な承認手順が含まれるプロジェクトに適しています。
このアプローチの主な欠点は、変更を組み込む必要があるたびに外部のマージコミットが作成され、プロジェクト履歴を激しく汚染し、読みにくくなることです。
ブランチのマージ
ブランチポップアップ(メインメニュー )または Git ツールウィンドウのブランチペインで、変更を統合するターゲットブランチを選択し、コンテキストメニューからチェックアウトを選択してそのブランチに切り替えます。
以下のいずれか 1 つを実行します:
マージのオプションを指定する必要がない場合は、現在のブランチにマージするブランチを選択し、サブメニューから現在のブランチにマージを選択します。
マージオプションを指定する必要がある場合は、メインメニューから マージダイアログを開きます。
を選択して現在のブランチにマージするブランチを選択し、オプションを変更をクリックして、以下から選択します。
--no-ff
: マージが早送りとして解決できたとしても、マージコミットはすべての場合に作成されます。--ff-only
: マージは、早送りが可能な場合にのみ解決されます。--squash
: すべてのプルされた変更を含む単一のコミットは、現在のブランチ上に作成されます。-m
: マージコミットのメッセージを編集できます。--no-commit
: マージは実行されますが、マージコミットは作成されないため、コミットする前にマージの結果をインスペクションできます。
マージをクリックします。
作業ツリーがクリーンであり(つまり、コミットされていない変更がない)、機能ブランチとターゲットブランチの間で競合が発生しない場合、Git は 2 つのブランチをマージし、マージコミットは Git ツールウィンドウ Alt+9 のログタブに表示されます。
ブランチとターゲットブランチの間で競合が発生した場合、競合を解決するように求められます ( 競合の解決を参照)。マージ後に未解決の競合が残っている場合、変更ビューの対応する変更リストにマージの競合ノードが解決するためのリンクとともに表示されます。
マージによって上書きされるローカルの変更がある場合、IntelliJ IDEA はスマートマージの実行を提案します。このオプションを選択すると、IntelliJ IDEA はコミットされていない変更をスタッシュし、マージを実行してから、変更をスタッシュ解除します。
ブランチのリベース (git-rebase)
ブランチを別のブランチに rebase
するとき、最初のブランチからのコミットを 2 番目のブランチの HEAD コミット上に適用します。
特定のタスクを処理し、そのブランチに対していくつかのコミットを行う機能ブランチを作成したとします。
ブランチで開発している間、あなたのチームメートは自分の作業をコミットし続けます:
rebase
操作を実行すると、master
の現行の HEAD コミット上にコミットを適用することによって、機能ブランチで行った変更を master
ブランチに統合できます。
リベースの主な利点は、他の人が読みやすく理解しやすいクリーンなプロジェクト履歴が得られることです。ログには、merge
操作によって生成された不要なマージコミットが含まれず、移動や検索が簡単な線形履歴が得られます。
ただし、このワークフローを採用する場合は、元の機能ブランチのコミットごとに新しいコミットを作成するため、rebase
はプロジェクトの履歴を書き換えるため、異なるハッシュを持つため、トレーサビリティが阻害されます。
ブランチを別のブランチ上にリベースする
メインメニューから
を選択リストから、現在のブランチをリベースするターゲットブランチを選択します。
ブランチ全体をリベースするのではなく、特定のコミットからソースブランチをリベースする必要がある場合は、オプションを変更をクリックして --onto を選択します。
ソースブランチフィールドに、現在のブランチを新しいベースに適用するコミットのハッシュを入力します。
リベースするブランチが現在チェックアウトされていない場合は、オプションを変更、別のリベース対象ブランチを選択する順にクリックし、表示されるリストからブランチを選択します。
IntelliJ IDEA は、リベース操作を開始する前に、このブランチをチェックアウトします。
ブランチで到達可能なすべてのコミットをリベースする場合は、「オプションを変更」をクリックし、「--root」を選択します (このオプションの詳細については、「git-rebase(英語)」を参照してください)。
空のコミット (親から何も変更しないコミット) を保持する必要がある場合は、「オプションを変更」をクリックし、「--keep-empty」を選択します (このオプションの詳細については、「git-rebase(英語)」を参照してください)。
ブランチ履歴に保持するためにリコミット中にマージコミットを保持する場合は、オプションを変更をクリックして --preserve-merges を選択します(このオプションは
interactive
リベースでは使用できません)。リベースをクリックします。
リベースのオプションを指定する必要がない場合は、リベースダイアログを呼び出さずにリベースを開始できます。ブランチポップアップまたは Git ツールウィンドウのブランチペインでブランチを選択し、次のいずれかのアクションを選択します。
リベースを使用して現在にプルイン(リモートブランチの場合)は、選択したブランチから変更をフェッチし、これらの変更に基づいて現在のブランチをリベースします。
チェックアウトして現在のブランチでリベース(リモートとローカルブランチの両方)を使用して、選択したブランチをチェックアウトし、現在チェックアウトされているブランチ上にリベースします。リモートブランチがローカルに存在しない場合、IntelliJ IDEA は追跡されたローカルブランチをサイレントに作成し、チェックアウトしてリベースします。
選択したブランチで現在のブランチをリベース(リモートとローカルブランチの両方)は、選択したものの上に現在チェックアウトされているブランチをリベースします。
このビデオを見て、リベース操作を実行する方法をよりよく理解してください。
対話型リベースを実行してプロジェクト履歴を編集する
IntelliJ IDEA に Git を統合すると、インタラクティブリベースを実行してプロジェクト履歴を編集し、線形かつ意味のあるものにすることができます。これにより、機能ブランチから別のブランチに変更を統合する前に、個々のコミットを変更したり、コミットの順序を変更したり、コミットを 1 つにまとめたり、不要な変更を含むコミットをスキップしたりして、コミットの履歴をクリーンアップすることができます。
現在のブランチの履歴を編集する
IntelliJ IDEA では、変更を別のブランチに適用する前に、現在のブランチのコミット履歴を編集できます。
Git ツールウィンドウ Alt+9 を開き、ログタブに切り替えます。
現在のブランチからのコミットのみを表示するようにログをフィルタリングします。
編集する一連のコミットの中で最も古いコミットを選択し、右クリックしてここから対話的にリベースを選択します。
選択したコミット後に行われた現在のブランチのすべてのコミットのリストを含む対話式リベースダイアログが表示されます。
ここから対話的にリベースオプションが無効になっている場合は、次のいずれかの理由が考えられます。
理由を特定するには、コンテキストメニューのアクションの上にマウスを置き、ステータスバーでメッセージを探します。
ブランチ履歴に対して次の変更を実行できます。
コミットを適用する順序を変更する : および ボタンを使用して、コミットをリストの上下に移動します。
コミットを選択 : これは、すべてのコミットのデフォルトの状態です。コミットに対してすでに実行したアクションを取り消す必要がある場合は、ピック をクリックして、このコミットがそのまま適用されるようにします。
編集 : 停止して編集 をクリックして、リベースを開始するときに、このコミットで停止して編集できるようにします。
コミット時にリベースが停止すると、IntelliJ IDEA ウィンドウの右下隅に通知がポップアップ表示され、リベースを続行または中止できます。
リベースを続行する前に、コンテキストアクション(前回保存した状態に戻す、元に戻す、修正など)を使用してこのコミットを変更できます。アクションを実行しない場合、このコミットはそのまま適用されます。
通知を閉じた場合は、メインメニューから Git | リベースを続行を選択して再開します。
コミットメッセージを言い換える : リワードをクリックするか、コミットをダブルクリックして、開いたミニエディターでテキストを編集します。
2 つのコミットを 1 つに結合する : 前のコミットに統合するコミットを選択し、スカッシュまたはスカッシュボタンの横にある矢印をクリックしてからフィックスアップをクリックします。
スカッシュをクリックすると、デフォルトで 2 つのコミットからのメッセージが結合されるため、結果のコミットメッセージを変更しない場合、このアクションはブランチ履歴に反映されます。
フィックスアップをクリックすると、フィックスアップコミットのコミットメッセージが破棄されるため、この変更はブランチ履歴に表示されません。
どちらの場合も、これらのアクションのいずれかを適用すると開くミニエディターでコミットメッセージを編集できます。
コミットを無視する : ドロップをクリックして、選択したコミットからの変更が適用されないようにします。
変更点をすべて元に戻す : リセットをクリックして、コミットに適用したすべてのアクションを破棄します。
その結果、コミットをリベースダイアログには、ブランチのコミットに適用したすべてのアクションを示すグラフが表示されるため、リベースを開始する前に確認できます。
リベース開始をクリックします。
ブランチの履歴を編集し、別のブランチに統合する
IntelliJ IDEA を使用すると、ブランチを別のブランチ上にリベースし、変更を適用する前にソースブランチ履歴を編集できます。
メインメニューから
を選択オプションを変更をクリックし、--interactive を選択します。
リストから、現在のブランチをリベースするターゲットブランチを選択します。
ブランチ全体をリベースするのではなく、特定のコミットからソースブランチをリベースする必要がある場合は、オプションを変更をクリックして --onto を選択します。
ソースブランチフィールドに、現在のブランチを新しいベースに適用するコミットのハッシュを入力します。
リベースするブランチが現在チェックアウトされていない場合は、オプションを変更、別のリベース対象ブランチを選択する順にクリックし、表示されるリストからブランチを選択します。
IntelliJ IDEA は、リベース操作を開始する前に、このブランチをチェックアウトします。
ブランチで到達可能なすべてのコミットをリベースする場合は、「オプションを変更」をクリックし、「--root」を選択します (このオプションの詳細については、「git-rebase(英語)」を参照してください)。
空のコミット (親から何も変更しないコミット) を保持する必要がある場合は、「オプションを変更」をクリックし、「--keep-empty」を選択します (このオプションの詳細については、「git-rebase(英語)」を参照してください)。
リベースをクリックします。
選択したコミット後に作成された、現在のブランチ内のすべてのコミットのリストを含む対話式リベースダイアログが表示されます。
ブランチ履歴に対して次の変更を実行できます。
コミットを適用する順序を変更する : および ボタンを使用して、コミットをリストの上下に移動します。
コミットを選択 : これは、すべてのコミットのデフォルトの状態です。コミットに対してすでに実行したアクションを取り消す必要がある場合は、ピック をクリックして、このコミットがそのまま適用されるようにします。
編集 : 停止して編集 をクリックして、リベースを開始するときに、このコミットで停止して編集できるようにします。
コミット時にリベースが停止すると、IntelliJ IDEA ウィンドウの右下隅に通知がポップアップ表示され、リベースを続行または中止できます。
リベースを続行する前に、コンテキストアクション(前回保存した状態に戻す、元に戻す、修正など)を使用してこのコミットを変更できます。アクションを実行しない場合、このコミットはそのまま適用されます。
通知を閉じた場合は、メインメニューから Git | リベースを続行を選択して再開します。
コミットメッセージを言い換える : リワードをクリックするか、コミットをダブルクリックして、開いたミニエディターでテキストを編集します。
2 つのコミットを 1 つに結合する : 前のコミットに統合するコミットを選択し、スカッシュまたはスカッシュボタンの横にある矢印をクリックしてからフィックスアップをクリックします。
スカッシュをクリックすると、デフォルトで 2 つのコミットからのメッセージが結合されるため、結果のコミットメッセージを変更しない場合、このアクションはブランチ履歴に反映されます。
フィックスアップをクリックすると、フィックスアップコミットのコミットメッセージが破棄されるため、この変更はブランチ履歴に表示されません。
どちらの場合も、これらのアクションのいずれかを適用すると開くミニエディターでコミットメッセージを編集できます。
コミットを無視する : ドロップをクリックして、選択したコミットからの変更が適用されないようにします。
変更点をすべて元に戻す : リセットをクリックして、コミットに適用したすべてのアクションを破棄します。
その結果、コミットをリベースダイアログには、ブランチのコミットに適用したすべてのアクションを示すグラフが表示されるため、リベースを開始する前に確認できます。
リベース開始をクリックします。
Git 対話式リベースの使用方法の詳細については、このビデオを参照してください。
チェリーピックの個別コミット
ブランチ全体をリベースまたはマージするのではなく、別のブランチに単一のコミットを適用するだけでよい場合があります。これは、たとえば機能ブランチで作業していて、2 つのブランチが分岐した後にコミットされたマスターからの修正プログラムを統合する場合に便利です。または、修正を以前のリリースのブランチにバックポートすることもできます。そのためには、チェリーピックアクションを使用します。
チェリーピック操作のステータスはステータスバーに表示されます。Git ブランチポップアップで cherry-pick の中断を選択すると、進行中のチェリーピックをいつでも中止できます。
他のブランチにコミットを適用する
ブランチポップアップ(メインメニュー )で、変更を統合するターゲットブランチを選択し、ポップアップメニューからチェックアウトを選択して、そのブランチに切り替えます。
Git ツールウィンドウ Alt+9 を開き、ログタブに切り替えます。
チェリーピックする変更を含むコミットを見つけます。
ブランチ、ユーザー、日付でコミットをフィルタリングできます。ツールバーの をクリックし、ハイライト | 未選択のコミットオプションを選択して、現在のブランチにすでに適用されているコミットをグレー表示することもできます。コミットハッシュがわかっている場合、またはタグ付きコミットを探している場合は、ハッシュ / ブランチ / タグに移動アクションを使用することもできます(Git ツールウィンドウ Alt+9 のログタブで Ctrl+F を押すか、ツールバーの をクリックします)。
必要なコミットを選択してください。コミットの詳細エリアの情報を使用して、これらが別のブランチに転送したい変更であることを確認してください。
ツールバーのチェリーピック をクリックします。IntelliJ IDEA は、ターゲットブランチに変更を適用してコミットします。
チェリーピックが競合で失敗した場合、選択された変更は変更ビューで確認できる変更領域に表示されます。これらの変更を確認し、必要に応じて後でコミットできます。
チェリーピックが失敗した場合に IntelliJ IDEA で変更リストを自動的に作成する場合は、
で対応する設定をオンにします。ターゲットブランチへの変更をプッシュします。
次のビデオは、チェリーピックがどのように機能するかを理解できます。
個別の変更を適用する
別のブランチに適用するファイルに変更を加えたが、これらの変更は他の変更されたファイルと一緒にコミットされたと想像してください。IntelliJ IDEA では、コミット全体を選択する代わりに、個別の変更を適用できます。
ブランチポップアップ(メインメニュー )で、変更を統合するターゲットブランチを選択し、ポップアップメニューからチェックアウトを選択して、そのブランチに切り替えます。
Git ツールウィンドウ Alt+9 を開き、ログタブに切り替えます。
適用したい変更が含まれているコミットを見つけます。
ブランチ、ユーザー、日付でコミットをフィルタリングできます。ツールバーの をクリックし、ハイライト | 未選択のコミットオプションを選択して、現在のブランチにすでに適用されているコミットをグレー表示することもできます。コミットハッシュがわかっている場合、またはタグ付きコミットを探している場合は、ハッシュ / ブランチ / タグに移動アクションを使用することもできます(Git ツールウィンドウ Alt+9 のログタブで Ctrl+F を押すか、ツールバーの をクリックします)。
右側のコミットの詳細ペインで、ターゲットブランチに適用する変更を含むファイルを選択し、コンテキストメニューから選択した変更を Cherry-Pick を選択します。
開いたダイアログで、既存の変更リストを選択するか、新しい変更リストの名前を入力して OK をクリックします。
変更をコミットしてから、ターゲットブランチにプッシュします。
個別のファイルを適用する
単一のファイルに個別の変更を適用することに加えて、ファイルのコンテンツ全体を別のブランチにコピーできます。これは、たとえば、適用するファイルがターゲットブランチに存在しない場合や、複数のコミット内で変更が加えられた場合に便利です。
変更が適用されるブランチに切り替えます。
ブランチポップアップ(メインメニュー )または Git ツールウィンドウのブランチペインで、適用するファイルを含むブランチを選択し、コンテキストメニューから作業ツリーとの差分を表示を選択します。
開いた変更ツールウィンドウには、現在チェックアウトされているブランチと比較して、選択したブランチで異なるすべてのファイルのリストが表示されます。
選択したブランチに存在し、現在のブランチにないファイルは、灰色でマークされます。
現在のブランチに存在するが、選択したブランチにないファイルは、緑色でマークされます。
選択したブランチと現在のブランチの違いを含むファイルは、青色でマークされています。
ブランチを入れ替えリンクをクリックして、他のブランチと比較するベースと見なされるブランチを変更できます。
現在のブランチに適用するファイルを選択し、コンテキストメニューからブランチから取得を選択するか、ツールバーの をクリックします。
変更をコミットしてプッシュします。IntelliJ IDEA は、ファイルの内容全体を現在のブランチにコピーします。
関連ページ:
GitHub プルリクエストを操作する
プルリクエストは、オープンソースプロジェクトや一部の企業のワークフローで、コントリビュータからの変更を管理したり、変更がマージされる前にコードレビューを開始したりするために使用されます。プルリクエストを作成すると、元のリポジトリにプッシュする変更内容を他のユーザーに伝えることができ、そのリポジトリのメンテナーが変更内容を確認し、議論して、ベースブランチに統合できるようになります。プルリクエストを作成する:メインメニューで、に移動します。プルリクエストドラフトを含むプルリクエストツールウィンドウ
GitLab マージリクエストを操作する
GitLab のマージリクエストを使用すると、ソースブランチからターゲットブランチに変更を組み込むことができます。マージリクエストを作成する:メインメニューで、に移動します。開いたマージリクエストツールウィンドウで、右上隅のマージリクエストの作成をクリックします。マージリクエストの下書きを含む新しいタブが開きます。左側のベースリポジトリの名前をクリックし、更新を受信するブランチを指定します。右側のヘッドリポジトリの名前をクリックし、ベースリポジトリに追加する変更を含むブランチを指定します。複数...
Git ブランチの管理
Git では、ブランチは、たとえば機能の作業が必要な場合や、リリースのためにコードベースの特定の状態を固定する必要がある場合などに、メインの開発ラインから分岐できるようにする強力なメカニズムです。IntelliJ IDEA では、ブランチによるすべての操作は Git ブランチポップアップで実行されます。これを呼び出すには、メインウィンドウのヘッダーで、現在チェックアウトされているブランチの名前を持つ Git ウィジェットをクリックします。Git ツールウィンドウのブランチペインで、ブランチを管理し、...
Git の競合を解決する
チームで作業しているときに、現在作業中のファイルに誰かが変更をプッシュするという状況に遭遇する可能性があります。これらの変更が重複しない場合(つまり、異なるコード行に変更が加えられた場合)、競合するファイルは自動的にマージされます。しかし、同じ行が影響を受けた場合、Git は無作為に一方を他方を選ぶことはできず、衝突を解決するように求めます。Git では、プル、マージ、リベース、チェリーピック、変更のスタッシュ解除、またはパッチの適用のいずれかの操作を実行しようとすると、競合が発生する可能性があ...
シェルブまたはスタッシュの変更
場合によっては、未完了のままのタスクを切り替えて、元に戻る必要があることがあります。作業内容を失うことなく複数の異なる機能に取り組むには、保留中の変更をシェルブまたはスタッシュすることができます。シェルブ vs スタッシュ:スタッシュの変更はシェルブと非常に似ています。スタッシュは Git によって生成され、IntelliJ IDEA 内または IntelliJ IDEA 外から適用できます。保留された変更を含むパッチは IntelliJ IDEA によって生成され、IDE を通じて適用されま...
バージョン管理ウィンドウ
このツールウィンドウは、プロジェクトでバージョン管理統合が有効になっている場合に使用できます。ツールウィンドウには、VCS 関連の情報を表示し、変更リストの管理、VCS 固有のアクションの実行、他のチームメンバーによる変更の表示などを可能にするいくつかのビュー / タブがあります。コンソールタブ: このタブには、VCS 関連のコマンドを実行した結果が表示されます。ローカル変更タブ: ローカルで変更され、まだリポジトリにコミットされていないファイルのリストを表示します。履歴タブ: このタブは、VC...