概要
エラーメッセージ
以前のコミットなしでは「スカッシュ」できません
は、「下に押しつぶそう」とした可能性が高いことを意味します。Git は常に、新しいコミットを古いコミットに押しつぶすか、インタラクティブなリベース todo リストで表示されるように「上向きに」、つまり前の行のコミットに押し込みます。todo リストの最初の行のコマンドを に変更するsquash
と、最初のコミットが押しつぶされるものが何もないため、常にこのエラーが発生します。
修正
まずは元の場所に戻る
$ git rebase --abort
あなたの歴史は
$ git log --pretty=oneline
a931ac7c808e2471b22b5bd20f0cad046b1c5d0d c
b76d157d507e819d7511132bdb5a80dd421d854f b
df239176e1a2ffac927d8b496ea00d5488481db5 a
つまり、a が最初のコミットで、次に b、最後に c です。c をコミットした後、b と c を一緒にスカッシュすることにします。
(注: 実行すると、ほとんどのプラットフォームでデフォルトでgit log
出力がページャーにパイプless
されます。ページャーを終了してコマンド プロンプトに戻るには、q
キーを押します。)
実行git rebase --interactive HEAD~2
すると、エディターに
pick b76d157 b
pick a931ac7 c
# Rebase df23917..a931ac7 onto df23917
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
(この todo リストは、 の出力とは逆の順序になっていることに注意してくださいgit log
。)
bpick
を に変更するsquash
と、先ほど見たエラーが発生しますが、代わりに todo リストを
pick b76d157 b
squash a931ac7 c
エディターを保存して終了すると、コンテンツが次のような別のエディターが表示されます
# This is a combination of 2 commits.
# The first commit's message is:
b
# This is the 2nd commit message:
c
保存して終了すると、編集されたファイルの内容は、新しく結合されたコミットのコミット メッセージになります。
$ git log --pretty=oneline
18fd73d3ce748f2a58d1b566c03dd9dafe0b6b4f b and c
df239176e1a2ffac927d8b496ea00d5488481db5 a
履歴書換についてのご注意
インタラクティブなリベースは履歴を書き換えます。古い履歴を含むリモートにプッシュしようとすると、早送りではないため失敗します。
リベースしたブランチが、自分で作業しているトピックまたはフィーチャー ブランチである場合、大したことはありません。別のリポジトリにプッシュするには--force
オプションが必要です。または、リモート リポジトリの権限によっては、最初に古いブランチを削除してから、リベースされたバージョンをプッシュすることもできます。作業を破壊する可能性のあるコマンドの例は、この回答の範囲外です。
パスワードやその他の機密情報を漏洩するなどの非常に正当な理由なしに他の人と作業しているブランチで既に公開されている履歴を書き換えることは、共同作業者に影響を与え、反社会的であり、他の開発者を悩ませます。ドキュメントの「アップストリーム リベースからの回復」セクションでは、git rebase
強調を加えて説明しています。
他の人が作業のベースにしているブランチをリベース (またはその他の形式のリライト) することは悪い考えです。その下流にいる人は、自分の履歴を手動で修正することを余儀なくされます。このセクションでは、ダウンストリームの観点から修正を行う方法について説明します。ただし、本当の修正は、そもそもアップストリームのリベースを避けることです。…