GitHubやGitHub Desktopでのマージ後のやり直し方法

~GUI操作とGitコマンドの選択肢~

はじめに

GitHub Desktopを使用している場合でも、マージ後に変更をやり直す方法は状況により異なります。
具体的には、未プッシュの状態既にリモートにプッシュ済みの状態で対応方法が変わります。
また、GitHub DesktopのGUI操作(例えばUndoボタンやGitHubウェブインターフェースのRevert機能)と、ターミナルを利用したGitコマンドgit revertgit resetなど)のどちらを使うか選択することが可能です。
以下に、両方の方法を詳しく説明します。


1. 未プッシュの場合:Undo機能(GUI操作)の利用

シナリオ

  • マージコミットがまだリモートにプッシュされていない場合

手順(GUI操作)

  1. GitHub Desktopの「History」タブで最新のマージコミットを確認します。
  2. 画面上部に表示される「Undo」ボタンをクリックします。
  • この操作で、直近のマージコミットが取り消され、マージ前の状態に戻ります。

備考:
Undo機能は最新のコミットに対してのみ利用可能です。もしUndoボタンがグレーアウトしている場合は、コミットがすでにプッシュ済みである可能性があります。


2. 既にリモートにプッシュ済みの場合

プッシュ済みの場合、GitHub Desktop単体で直接やり直す方法はありませんが、以下の2通りのアプローチを取ることができます。

A. GitHubウェブインターフェースでRevertを利用する(GUI操作)

シナリオ

  • マージコミットがリモートに存在し、履歴を変更せずに打ち消したい場合

手順

  1. GitHubのリポジトリ画面で、対象のマージコミットの詳細ページに移動します。
  2. 「Revert」ボタンが表示されている場合、それをクリックします。
    • 自動的に打ち消し用のコミットが作成され、プルリクエストが生成されます。
  3. 作成されたプルリクエストを確認し、マージすることで、元のマージコミットの変更を打ち消します。

B. ターミナルでGitコマンドを利用する方法

GitHub Desktopからターミナルを起動して操作することで、より柔軟に対応できます。

1. Revertで打ち消しコミットを作成する方法

シナリオ
  • 既にプッシュ済みのマージコミットを打ち消し、履歴をそのまま残す場合
手順
  1. GitHub Desktopで対象リポジトリを右クリックし、「Open in Terminal」(または「Open in Git Bash」)を選択します。
  2. マージコミットのハッシュを確認します。
  3. 以下のコマンドを実行します:
   git revert -m 1 <マージコミットのハッシュ>
  • -m 1 は、マージコミットのどちらの親を基準にするか指定するオプション(通常は1)です。
  1. GitHub Desktopに戻り、新たに生成された打ち消しコミットを確認後、リモートにプッシュします。

2. git resetで履歴を書き換える方法

シナリオ
  • 自分のみが利用しているプライベートなブランチで、完全にマージ前の状態に戻したい場合
    ※この方法は、リモートの履歴を書き換えるため、他のメンバーと共有しているブランチでは使用しないでください。
手順
  1. GitHub Desktopでリポジトリを右クリックして、「Open in Terminal」を選択します。
  2. マージ前のコミットハッシュを確認します。
  3. 以下のコマンドを実行します:
   git reset --hard <マージ前のコミットのハッシュ>
  1. リモートブランチへ強制プッシュを実行します:
   git push --force

注意: 強制プッシュ(--force)は、他のコラボレーターに大きな影響を与える可能性があるため、十分に注意して使用してください。


まとめ

  • 未プッシュの場合:
    • GUI操作: GitHub DesktopのUndoボタンで簡単に取り消しが可能です。
  • プッシュ済みの場合:
    • GUI操作: GitHubウェブインターフェースのRevert機能を利用して打ち消しコミットを作成します。
    • Gitコマンド: ターミナルからgit revert -m 1 <ハッシュ>を実行し、打ち消しコミットを作成してプッシュします。
    • 履歴の書き換え: プライベートなブランチに限り、git reset --hardと強制プッシュを用いて完全にマージ前の状態に戻す方法もあります。

これらの方法は、GitHub DesktopのGUI操作とターミナルでのGitコマンドの両方を適宜選択することで、状況に応じた最適な対応が可能になります。自身の作業環境やリポジトリの運用方針に合わせた方法を選んでください。