概要
エラーメッセージ
以前のコミットがないと「スカッシュ」できません
「下に押しつぶそう」とした可能性があります。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
。)
bをに変更pick
するsquash
と、表示されたエラーが発生しますが、代わりに、todoリストを次のように変更して、cをbに押しつぶす(新しいものを古いものにコミットするか、「上方に押しつぶす」)
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
の文書は、追加重点を置いて、説明しています。
他の人が作業に基づいて作成したブランチのリベース(または他の形式の書き換え)は悪い考えです。その下流の誰もが手動で履歴を修正する必要があります。このセクションでは、ダウンストリームの観点からの修正方法を説明します。ただし、本当の解決策は、そもそも上流をリベースしないことです。…