私はすでにこれらの以前の質問を見てきました:
ただし、特定の問題に正確に対処しているわけではありません。インデックスには他の変更があります。コマンドを実行するrebase
と、git は次のように文句を言います。Cannot rebase: You have unstaged changes.
シナリオ:
最後のコミットの前のコミット (「2 HEAD 前」と呼んでいますか?) はリファクタリング コミットでした。現在、インデックスにはステージングされていない多くの変更がありますが、前のコミットから最後のコミットに追加したいのはその一部だけです。
これを行う方法は次のようになると想像しています。
stash
現在のすべての変更rebase -i
前のコミットから最後のコミットまで (インデックスを変更し、ヘッドを移動しますよね?)- ヘッドを変更せずにスタッシュをインデックスにロードします (どのように?)
- 使用
add -p
しcommit --amend
て、この古いコミットを選択的に変更します rebase --continue
終了する (子を更新し、Head を最初の場所に戻します。インデックスはどうなりますか?)- 次に、スタッシュをポップ/クリアします(インデックスを開始した場所に戻します)。
これは正しいです?そうである場合、ステップ 3 を行うにはどうすればよいですか? そうでない場合、代わりに何をすべきですか?
また、私はまだ git について学んでおり、git 内のもの (Head、index、stash など) を適切に参照しているとはまだ 100% 確信が持てないことに注意してください。
解決:
これが役立つ可能性がある他の人にとって、これらは私が実際に行った手順です。
git stash
現在のすべての変更git rebase -i <ID>
前から最後のコミットの親へ、インデックスを変更してヘッドを移動git stash apply
ヘッドを変更せずにスタッシュをインデックスにロードする- 競合がある場合は、
git reset HEAD <file>
ファイルのステージングをアンロードします。ステージングが明確であることを確認してください。
- 競合がある場合は、
add -p
およびを使用して、commit --amend
変更を選択的にステージングし、コミットするgit reset --hard
ヘッドに一致するようにインデックスを破棄するgit rebase --continue
終わる。子を更新し、頭を最初に戻しますが、変更があります- history は現在、2 つのバージョンに分岐しています。もう一方のブランチは、以前に隠しておいた WIP で終了します。
- 次に、スタッシュをポップして、インデックスを開始した場所に戻します。もう一方のブランチもクリアされます。