最後の N 個のコミットを 1 つのコミットにまとめるにはどうすればよいでしょうか?
ベストアンサー1
git rebase
またはを使わずにこれを簡単に行うことができますgit merge --squash
。この例では、最後の 3 つのコミットを squash します。
新しいコミット メッセージを最初から書きたい場合は、次のコードで十分です。
git reset --soft HEAD~3
git commit
既存のコミット メッセージを連結して新しいコミット メッセージを編集する場合 (つまり、pick/squash/squash/…/squash のgit rebase -i
指示リストから開始する場合に類似)、それらのメッセージを抽出して、次のように渡す必要がありますgit commit
。
git reset --soft HEAD~3 &&
git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"
どちらの方法でも、最後の 3 つのコミットが 1 つの新しいコミットにまとめられます。ソフト リセットは、HEAD を、まとめたくない最後のコミットに再ポイントするだけです。インデックスも作業ツリーもソフト リセットによって変更されることはありません。インデックスは、新しいコミットの目的の状態のままになります (つまり、これから「破棄」しようとしているコミットからの変更がすべて既に含まれています)。
コメントに基づいて編集
履歴を書き換えたら、--force フラグを使用してこのブランチをリモートにプッシュし直す必要があります。これが force フラグの目的ですが、細心の注意を払い、常にターゲットを完全に定義することができます。
git push --force-with-lease origin <branch-name>