git rebase によるマージコミットの編集
質問
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
.
詳細な手順
-
実行
git rebase -i --rebase-merges $ancestor_of_merge_commit
- TODO リストから編集したいマージコミットを探します。
-
マージコミットの後に、以下の内容のみを含む新しい行を挿入します。
break
(またはb
). -
変更を保存してエディターを終了します。Git rebase はマージコミットをチェックアウトし、次のような内容を表示し、プロンプトに戻ります。
Stopped at fb91fab (Merge branch 'foo' into bar)
-
使用する
git commit --amend
を使用して、希望に応じてマージコミットを編集します。 -
実行
git rebase --continue
を実行します。
編集したいコミットの後にマージコミットが存在しない場合の代替方法です。
-
実行
git rebase -i $id_of_merge_commit
-
ToDo リストの先頭に、以下の内容のみを含む新しい行を挿入します。
break
(またはb
). -
変更を保存してエディターを終了します。Git rebase はマージコミットをチェックアウトし、次のような内容を表示し、プロンプトに戻ります。
Stopped at fb91fab (Merge branch 'foo' into bar)
-
使用する
git commit --amend
を使用して、希望に応じてマージコミットを編集します。 -
実行
git rebase --continue
を実行します。
2012 年のオリジナルの回答 (以前の
break
):
Git は、マージが含まれる場合に対話的にリベースを行うことを容易にしていません。 そのため
-p
オプションは
-i
の機構を使うので、この二つを混ぜて使うことはあまりうまくいきません。
しかし
git rebase
はチェリーピックを大量に行うための自動化された方法に過ぎません。 手動でチェリーピックを行うことでその動作を再現し、もう少し制御を効かせることができます。 利便性は低く、ヒューマンエラーが起こりやすいですが、可能です。
これは私が提案するアプローチです。
-
使用する
git rebase
を使用してコミットに移動します。 の後に マージ(の子)です。 -
使用
git reset --hard HEAD^
を使用して手動でマージに移動します。 -
使用する
git commit --amend
を使用して、マージを修復します。 -
使用する
git cherry-pick
を使用して、マージ後にコミットに戻ることができます。 -
使用
git rebase --continue
で終わらせる。
以下、具体的な手順です。
-
変更したいマージコミットの SHA1 ID をメモします。 議論のために、仮にそれが
deadbeef
. -
修正したいマージコミットの直後(マージコミットの子)のコミットのSHA1 IDに注目してください。 仮にそれが
facef00d
. -
実行
git rebase -i deadbeef
. -
選択
facef00d
を編集します。 -
rebase が編集を促すプロンプトに戻ると
facef00d
を実行します。git reset --hard HEAD^
. 現在、あなたはdeadbeef
(git rev-parse HEAD
を印刷する必要があります。deadbeef
). -
間違ったマージの衝突を修正する編集を行い
git add
を使用してステージングします。 -
実行する
git commit --amend
を実行してステージドフィクスとバッドマージコミットを融合させます。 その結果、異なる SHA1 が設定されます (deadbeef
). -
実行
git cherry-pick facef00d
で行った変更を適用するためにfacef00d
で行われた変更を修正されたマージコミットに適用します。 -
実行
git rebase --continue
を実行して終了します。
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] git rebase の取り消し
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み] Git で最新のコミットを新しいブランチに移動する
-
[解決済み】ローカルのGitブランチの名前を変更するには?
-
[解決済み] stash@{1}は曖昧?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
undefinedmaster -> master (non-fast-forward) と git ! [拒否] master -> master (フェッチファースト)
-
undefinedGitのプッシュコードには、! [rejected] master -> master (fetch first) 問題があります。
-
git push は最新の解決策を提供します。
-
git を使用してリモートリポジトリを更新する場合、現在のブランチの先端がエラーの背後にあるため、更新が拒否されました。
-
git-fatal: 設定されたプッシュターゲットがありません / 警告: store/README.md の LF は CRLF に置き換えられています。
-
[解決済み] Jenkins Pipeline Git SCM を認証情報でチェックアウトする?
-
[解決済み] stash@{1}は曖昧?
-
[解決済み] CVS から Git への移行: $Id$ 相当?
-
[解決済み] 以前のコミットにファイルを追加するには?
-
[解決済み] プル前にローカルとGitHubのリポジトリの差分を確認する方法 [重複]について