Gitでコミットがあるとき。 A - B - C
とB
コミットを編集したい、私は
git rebase -i <A-commit-hash>
を使用し、edit
commitの前にB
コマンドを記述します。B
commitの直後に停止するため、git commit --amend
を使用して必要なものを修正できます。git rebase --continue
を使い続けます。私が知る限り、これはこれを行う方法のベストプラクティスです。この方法を使用すると、過去のコミットを編集して(まだリモートブランチにプッシュされていない限り)、さらに-p
フラグを使用してマージを保存することもできます。これは素晴らしいです。
私の現在の問題は次のとおりです。マージコミットの1行でミス(タイプミス)を行いました(2つのブランチをマージするときに競合を解決しました)。
修正したいのですが、マージコミットで停止するためにgit rebase
を作成する方法がわかりません。 git rebase -p -i <blah>
リストはマージコミットを無視するため、その前にedit
コマンドを記述して、git rebase
を停止して編集することはできません。
助けてください?それ以降のすべてのコミット(およびマージ)を保持しながら、マージコミットのこの行を修正したいだけです。
ありがとう。
Gitでは、マージが関係する場合にインタラクティブなリベースを簡単に行うことはできません。 -p
オプションは-i
メカニズムを内部的に使用するため、この2つの混合は実際には機能しません。
ただし、git rebase
は、多くのチェリーピックを自動化する方法にすぎません。手動でチェリーピッキングすることで、その動作を複製して、プロセスをもう少し制御することができます。利便性が低く、人的エラーが発生しやすいですが、可能です。
これは私が提案するアプローチです:
git rebase
を使用してコミットを取得しますafterマージ(マージの子)git reset --hard HEAD^
を使用して、手動でマージするgit commit --amend
を使用してマージを修復しますgit cherry-pick
を使用して、マージ後にコミットに戻りますgit rebase --continue
を使用して終了します具体的な手順は次のとおりです。
deadbeef
であると仮定します。facef00d
であるとします。git rebase -i deadbeef
を実行します。facef00d
を選択します。facef00d
を編集するためのプロンプトに戻ったら、git reset --hard HEAD^
を実行します。これでdeadbeef
にいるはずです(git rev-parse HEAD
はdeadbeef
を印刷する必要があります)。git add
を使用してそれらをステージングします。git commit --amend
を実行して、段階的な修正と不正なマージコミットを融合します。結果には、異なる_1があります(deadbeef
ではありません)。git cherry-pick facef00d
によって実行された変更を固定マージコミットに適用するには、facef00d
を実行します。git rebase --continue
を実行して終了します。修正コミット「D」を作成し、「git rebase -p -i <blah>
'は、' B 'の直後に' D 'を並べ替え、' B 'に押しつぶします。
pick A
pick B <- merge commit to ammend
fixup D
pick C