複数のコミットをまとめる方法については、次の記事がわかりやすく説明されています。
http://git-scm.com/book/en/Git-ブランチング-リベース
しかし、すでにプッシュされているコミットには機能しません。ローカル リポジトリとリモート リポジトリの両方で最新のコミットをいくつかまとめるにはどうすればよいでしょうか?
を実行するとgit rebase -i origin/master~4 master
、最初の 1 つを として保持しpick
、他の 3 つを として設定しsquash
、終了すると (emacs の cx cc 経由)、次のようになります。
$ git rebase -i origin/master~4 master
# Not currently on any branch.
nothing to commit (working directory clean)
Could not apply 2f40e2c... Revert "issue 4427: bpf device permission change option added"
$ git rebase -i origin/master~4 master
Interactive rebase already started
ここで、2f40 はpick
コミットです。そして、4 つのコミットのいずれも に表示されなくなりましたgit log
。コミット メッセージを入力できるように、エディターが再起動されると思っていました。何が間違っているのでしょうか?
ベストアンサー1
コミットをローカルでスカッシュするには、次のようにします。
git rebase -i origin/master~4 master
ここで、~4
最後の 4 つのコミットを意味します。
これにより、デフォルトのエディターが開きます。ここで、pick
2 行目、3 行目、4 行目 (最後の 4 つのコミットに関心があるため) を に置き換えますsquash
。最初の行 (最新のコミットに対応) は のままにしておきますpick
。このファイルを保存します。
その後、エディターが再び開き、各コミットのメッセージが表示されます。関心のないメッセージにはコメントを付けます (つまり、この圧縮に対応するコミット メッセージはコメント解除したままにします)。ファイルを保存して閉じます。
その後、-f フラグを使用して再度プッシュする必要があります。
そして、次のように強制的にプッシュします:
git push origin +master
--force
との違い+
の文書からgit push
:
は
--force
プッシュされるすべての参照に適用されるため、push.default
に設定して使用したりmatching
、 で構成された複数のプッシュ先で使用するremote.*.push
と、現在のブランチ以外の参照が上書きされる可能性があることに注意してください (リモートの参照の背後にあるローカル参照を含む)。 1 つのブランチのみにプッシュを強制するには、+
refspec の前に を付けて push します (例:ブランチgit push origin +master
にプッシュを強制しますmaster
)。