web-dev-qa-db-ja.com

git rebaseでマージコミットを編集する

Gitでコミットがあるとき。 A - B - CBコミットを編集したい、私は

  • git rebase -i <A-commit-hash>を使用し、
  • リストでは、edit commitの前にBコマンドを記述します。
  • git rebaseはB commitの直後に停止するため、git commit --amendを使用して必要なものを修正できます。
  • そしてgit rebase --continueを使い続けます。

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

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

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

助けてください?それ以降のすべてのコミット(およびマージ)を保持しながら、マージコミットのこの行を修正したいだけです。

ありがとう。

48
vasekch

Gitでは、マージが関係する場合にインタラクティブなリベースを簡単に行うことはできません。 -pオプションは-iメカニズムを内部的に使用するため、この2つの混合は実際には機能しません。

ただし、git rebaseは、多くのチェリーピックを自動化する方法にすぎません。手動でチェリーピッキングすることで、その動作を複製して、プロセスをもう少し制御することができます。利便性が低く、人的エラーが発生しやすいですが、可能です。

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

  1. git rebaseを使用してコミットを取得しますafterマージ(マージの子)
  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 HEADdeadbeefを印刷する必要があります)。
  6. 誤ったマージの競合を修正するために編集を行い、git addを使用してそれらをステージングします。
  7. git commit --amendを実行して、段階的な修正と不正なマージコミットを融合します。結果には、異なる_1があります(deadbeefではありません)。
  8. git cherry-pick facef00dによって実行された変更を固定マージコミットに適用するには、facef00dを実行します。
  9. git rebase --continueを実行して終了します。
74
Richard Hansen

修正コミット「D」を作成し、「git rebase -p -i <blah> 'は、' B 'の直後に' D 'を並べ替え、' B 'に押しつぶします。

pick A
pick B  <- merge commit to ammend
fixup D
pick C
1
i3ensays