これを行うには多くの方法があります(rebase
またはreset
を使用)。
git reset
を使用するアプローチ:
git status
を使用して確認してください。コミットされていない変更がある場合は、それらをstash( git stash
に保存するか、一時的なブランチでコミットします。git branch backup
を実行して、現在のコミットでバックアップブランチを作成します。reflog
を使用するか、現在のコミットのハッシュを書き留めることで実現できます)が、最も簡単な方法です。問題が発生した場合に現在のステータスを復元します。git reset --soft HEAD~2
を実行します。HEAD
を(コミットe8de117
で)移動します。インデックスと作業ツリーは、コミット6aa74e4
を作成する直前のようになりました。最後の2つのコミットで変更されたすべてのファイルは、すでにインデックスに追加されています。 HEAD
はe8de117
上にあるため、次のコミットはe8de117
の上に作成されます(コミット6aa74e4
と77c15d6
は「置き換え」られます)。git commit
を実行します。新しいコミットメッセージを入力する必要があります。git diff backup
は違いを報告しないはずです)、または気が変わった場合は git reset --hard backup
を実行します元の場所に戻る(実際には、ステップ2の直後)。backup
ブランチを削除します( git branch -D backup
)。インタラクティブsquash
のrebase
機能を探しています:
使用する git rebase -i HEAD~2
インタラクティブなリベースを開始します。最初のエディターには、リベースの一部であるすべてのコミットがリストされます。この場合、HEAD~2
引数のrebase
呼び出しには、2つのコミットがあり、それぞれにpick
が前に付いています。何も変更しないと、リベースがpick
につながります。つまり、両方のコミットが適用され、違いはありません。代わりに、あなたがしたいことは、もう1つのコミットをpick
ingしながら、1つのコミットのみをsquash
することです。このようにして、2番目のコミットを最初のコミットに押しつぶし、1つのコミットを生成します。安全にして今すぐ終了すると、gitは新しいコミットメッセージを要求し、古いコミットの両方からの変更を含む新しいコミットが表示されます。
詳細な手順については こちら を参照してください。
いつものように履歴をいじくるとき(異なるコミットを新しいものに押しつぶすのは間違いなくそうです)、他の誰も自分の作業に基づいていないことが確かなコミットに対してのみ、そのような操作を実行する必要があります。