1. ホーム
  2. git

git rebase によるマージコミットの編集

2023-09-02 16:55:17

質問

Git で、例えば以下のようなコミットがある場合。 A - B - C を編集したい場合 B をコミットしたい場合、私は

  • 使用 git rebase -i <A-commit-hash> ,
  • をリストに書きます。 edit コマンドの前に B をコミットします。
  • の直後に git rebase が停止します。 B のコミット直後に停止するので git commit --amend ,
  • を使い続け、さらに git rebase --continue .

私が知る限り、これがベストプラクティスの方法です。この方法では、過去のどんなコミットでも (リモートブランチにまだプッシュされていなければ) 編集することができますし、さらに -p フラグを使えば、マージを保持することもできます。これは本当に素晴らしいことです。

私の現在の問題は、(2つのブランチをマージする際に競合を解決する際に)マージコミットで1行にミス(タイプミス)をしてしまったことです。

私はそれを修正したいのですが、私はどのようにして git rebase をマージコミットで停止させる方法がわかりません。その git rebase -p -i <blah> リストではマージコミットを無視するので edit コマンドを前にして git rebase をそこで止めて、編集できるようにします。

何か助けをお願いします。 私はちょうどそれ以降のすべてのコミット(およびマージ)を維持しながら、マージコミットでこの行を修正したいのです。

ありがとうございます。

どのように解決するのですか?

2020年版の解答を更新しました。

強制的に git rebase -i をマージコミットで停止させるには break コマンドを使います (Git 2.20 で追加されました)。その後、マージコミットを任意に編集するために git commit --amend .

詳細な手順

  1. 実行 git rebase -i --rebase-merges $ancestor_of_merge_commit
  2. TODO リストから編集したいマージコミットを探します。
  3. マージコミットの後に、以下の内容のみを含む新しい行を挿入します。 break (または b ).
  4. 変更を保存してエディターを終了します。Git rebase はマージコミットをチェックアウトし、次のような内容を表示し、プロンプトに戻ります。
    Stopped at fb91fab (Merge branch 'foo' into bar)
    
    
  5. 使用する git commit --amend を使用して、希望に応じてマージコミットを編集します。
  6. 実行 git rebase --continue を実行します。

編集したいコミットの後にマージコミットが存在しない場合の代替方法です。

  1. 実行 git rebase -i $id_of_merge_commit
  2. ToDo リストの先頭に、以下の内容のみを含む新しい行を挿入します。 break (または b ).
  3. 変更を保存してエディターを終了します。Git rebase はマージコミットをチェックアウトし、次のような内容を表示し、プロンプトに戻ります。
    Stopped at fb91fab (Merge branch 'foo' into bar)
    
    
  4. 使用する git commit --amend を使用して、希望に応じてマージコミットを編集します。
  5. 実行 git rebase --continue を実行します。

2012 年のオリジナルの回答 (以前の break ):

Git は、マージが含まれる場合に対話的にリベースを行うことを容易にしていません。 そのため -p オプションは -i の機構を使うので、この二つを混ぜて使うことはあまりうまくいきません。

しかし git rebase はチェリーピックを大量に行うための自動化された方法に過ぎません。 手動でチェリーピックを行うことでその動作を再現し、もう少し制御を効かせることができます。 利便性は低く、ヒューマンエラーが起こりやすいですが、可能です。

これは私が提案するアプローチです。

  1. 使用する git rebase を使用してコミットに移動します。 の後に マージ(の子)です。
  2. 使用 git reset --hard HEAD^ を使用して手動でマージに移動します。
  3. 使用する git commit --amend を使用して、マージを修復します。
  4. 使用する git cherry-pick を使用して、マージ後にコミットに戻ることができます。
  5. 使用 git rebase --continue で終わらせる。

以下、具体的な手順です。

  1. 変更したいマージコミットの SHA1 ID をメモします。 議論のために、仮にそれが deadbeef .
  2. 修正したいマージコミットの直後(マージコミットの子)のコミットのSHA1 IDに注目してください。 仮にそれが facef00d .
  3. 実行 git rebase -i deadbeef .
  4. 選択 facef00d を編集します。
  5. rebase が編集を促すプロンプトに戻ると facef00d を実行します。 git reset --hard HEAD^ . 現在、あなたは deadbeef ( git rev-parse HEAD を印刷する必要があります。 deadbeef ).
  6. 間違ったマージの衝突を修正する編集を行い git add を使用してステージングします。
  7. 実行する git commit --amend を実行してステージドフィクスとバッドマージコミットを融合させます。 その結果、異なる SHA1 が設定されます ( deadbeef ).
  8. 実行 git cherry-pick facef00d で行った変更を適用するために facef00d で行われた変更を修正されたマージコミットに適用します。
  9. 実行 git rebase --continue を実行して終了します。