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

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

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

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

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

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

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

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

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

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

ここから対話的にリベースオプションが無効になっている場合は、次のいずれかの理由が考えられます。
理由を特定するには、コンテキストメニューのアクションの上にマウスを置き、ステータスバーでメッセージを探します。

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

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

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

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

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

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

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

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

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

リベース開始をクリックします。
チェリーピックの個別コミット
場合によっては、ブランチ全体をリベースまたはマージするのではなく、別のブランチに単一のコミットを適用するだけで済むことがあります。これは、たとえば、ブランチという機能で作業していて、2 つのブランチが分岐した後にコミットされた main のホットフィックスを統合したい場合などに便利です。あるいは、以前のリリースのブランチに修正をバックポートしたい場合もあります。これは、チェリーピックアクションを使用することで可能です。
チェリーピック操作のステータスはステータスバーに表示されます。Git ブランチポップアップで cherry-pick の中断を選択すると、進行中のチェリーピックをいつでも中止できます。

他のブランチにコミットを適用する
ブランチポップアップ(メインメニュー )で、変更を統合するターゲットブランチを選択し、ポップアップメニューからチェックアウトを選択して、そのブランチに切り替えます。
Git ツールウィンドウ Alt+9 を開き、ログタブに切り替えます。
チェリーピックする変更を含むコミットを見つけます。
ブランチ、ユーザー、日付でコミットをフィルタリングできます。ツールバーの
をクリックし、ハイライト | 未選択のコミットオプションを選択して、現在のブランチにすでに適用されているコミットをグレー表示することもできます。コミットハッシュがわかっている場合、またはタグ付きコミットを探している場合は、ハッシュ / ブランチ / タグに移動アクションを使用することもできます(Git ツールウィンドウ Alt+9 のログタブで Ctrl+F を押すか、ツールバーの
をクリックします)。
必要なコミットを選択してください。コミットの詳細エリアの情報を使用して、これらが別のブランチに転送したい変更であることを確認してください。
ツールバーのチェリーピック
をクリックします。PyCharm は、ターゲットブランチに変更を適用してコミットします。
チェリーピックが競合により失敗した場合、選択された変更はコミットツールウィンドウ Alt+0 の変更領域に表示されます。これらの変更を確認し、必要に応じて後でコミットできます。
チェリーピックが失敗した場合に PyCharm で変更リストを自動的に作成する場合は、で対応する設定をオンにします。
ターゲットブランチへの変更をプッシュします。
次のビデオは、チェリーピックがどのように機能するかを理解できます。
個別の変更を適用する
あるファイルに変更を加え、それを別のブランチに適用したいが、その変更が他の変更されたファイルと一緒にコミットされてしまったとします。PyCharm を使用すると、コミット全体をチェリーピックするのではなく、変更リストに個別の変更をすぐにコミットせずに適用できます。
ブランチポップアップ(メインメニュー )で、変更を統合するターゲットブランチを選択し、ポップアップメニューからチェックアウトを選択して、そのブランチに切り替えます。
Git ツールウィンドウ Alt+9 を開き、ログタブに切り替えます。
適用したい変更が含まれているコミットを見つけます。
ブランチ、ユーザー、日付でコミットをフィルタリングできます。ツールバーの
をクリックし、ハイライト | 未選択のコミットオプションを選択して、現在のブランチにすでに適用されているコミットをグレー表示することもできます。コミットハッシュがわかっている場合、またはタグ付きコミットを探している場合は、ハッシュ / ブランチ / タグに移動アクションを使用することもできます(Git ツールウィンドウ Alt+9 のログタブで Ctrl+F を押すか、ツールバーの
をクリックします)。
右側のコミットの詳細ペインで、ターゲットブランチに適用する変更を含むファイルを選択し、コンテキストメニューから選択した変更を Cherry-Pick を選択します。
開いたダイアログで、既存の変更リストを選択するか、新しい変更リストの名前を入力して OK をクリックします。
変更をコミットしてから、ターゲットブランチにプッシュします。
個別のファイルを適用する
単一のファイルに個別の変更を適用することに加えて、ファイルのコンテンツ全体を別のブランチにコピーできます。これは、たとえば、適用するファイルがターゲットブランチに存在しない場合や、複数のコミット内で変更が加えられた場合に便利です。
変更が適用されるブランチに切り替えます。
ブランチポップアップ(メインメニュー )または Git ツールウィンドウのブランチペインで、適用するファイルを含むブランチを選択し、コンテキストメニューから作業ツリーとの差分を表示を選択します。
開いた変更ツールウィンドウには、現在チェックアウトされているブランチと比較して、選択したブランチで異なるすべてのファイルのリストが表示されます。
選択したブランチに存在し、現在のブランチには存在しないファイルは、灰色でマークされます。
現在のブランチに存在するが、選択したブランチにないファイルは、緑色でマークされます。
選択したブランチと現在のブランチの違いを含むファイルは、青色でマークされています。
ブランチを入れ替えリンクをクリックして、他のブランチと比較するベースと見なされるブランチを変更できます。
現在のブランチに適用するファイルを選択し、コンテキストメニューからブランチから取得を選択するか、ツールバーの
をクリックします。
変更をコミットしてプッシュします。PyCharm は、ファイルの内容全体を現在のブランチにコピーします。
関連ページ:
GitHub プルリクエストを操作する
プルリクエストは、オープンソースプロジェクトや一部の企業のワークフローで、コントリビュータからの変更を管理したり、変更がマージされる前にコードレビューを開始したりするために使用されます。プルリクエストを作成すると、元のリポジトリにプッシュする変更内容を他のユーザーに伝えることができ、そのリポジトリのメンテナーが変更内容を確認し、議論して、ベースブランチに統合できるようになります。プルリクエストを作成する:メインメニューで、に移動します。プルリクエストドラフトを含むプルリクエストツールウィンドウ
GitLab マージリクエストを操作する
GitLab のマージリクエストを使用すると、ソースブランチからターゲットブランチに変更を組み込むことができます。マージリクエストを作成する:メインメニューで、に移動します。開いたマージリクエストツールウィンドウで、右上隅のマージリクエストの作成をクリックします。マージリクエストの下書きを含む新しいタブが開きます。左側のベースリポジトリの名前をクリックし、更新を受信するブランチを指定します。右側のヘッドリポジトリの名前をクリックし、ベースリポジトリに追加する変更を含むブランチを指定します。複数...
Git ブランチの管理
Git では、ブランチは、たとえば機能の作業が必要な場合や、リリースのためにコードベースの特定の状態を固定する必要がある場合などに、メインの開発ラインから分岐できるようにする強力なメカニズムです。PyCharm では、ブランチによるすべての操作は Git ブランチポップアップで実行されます。これを呼び出すには、メインウィンドウのヘッダーで、現在チェックアウトされているブランチの名前を持つ Git ウィジェットをクリックします。Git ツールウィンドウのブランチペインで、ブランチを管理し、複数のブラン...
Git の競合を解決する
チームで作業しているときに、現在作業中のファイルに誰かが変更をプッシュするという状況に遭遇する可能性があります。これらの変更が重複しない場合(つまり、異なるコード行に変更が加えられた場合)、競合するファイルは自動的にマージされます。しかし、同じ行が影響を受けた場合、Git は無作為に一方を他方を選ぶことはできず、衝突を解決するように求めます。Git では、プル、マージ、リベース、チェリーピック、変更のスタッシュ解除、またはパッチの適用のいずれかの操作を実行しようとすると、競合が発生する可能性があ...
シェルブまたはスタッシュの変更
場合によっては、未完了のままのタスクを切り替えて、元に戻る必要があることがあります。作業内容を失うことなく複数の異なる機能に取り組むには、保留中の変更をシェルブまたはスタッシュすることができます。シェルブ vs スタッシュ:スタッシュの変更はシェルブと非常に似ています。スタッシュは Git によって生成され、PyCharm 内または PyCharm 外から適用できます。保留された変更を含むパッチは PyCharm によって生成され、IDE を通じて適用されます。また、スタッシュにはコミットされ...
バージョン管理ウィンドウ
このツールウィンドウは、プロジェクトでバージョン管理統合が有効になっている場合に使用できます。ツールウィンドウには、VCS 関連の情報を表示し、変更リストの管理、VCS 固有のアクションの実行、他のチームメンバーによる変更の表示などを可能にするいくつかのビュー / タブがあります。コンソールタブ: このタブには、VCS 関連のコマンドを実行した結果が表示されます。ローカル変更タブ: ローカルで変更され、まだリポジトリにコミットされていないファイルのリストを表示します。履歴タブ: このタブは、VC...