1. ホーム
  2. git

[解決済み] 既にリベースを開始している場合、2つのコミットを1つにマージするにはどうすればよいですか?

2022-03-17 08:59:36

質問

私は2つのコミットを1つにマージしようとしているので、次のようにしました。 git readyの「squashing commits with rebase」(リベースでコミットをつぶす)。 .

を実行しました。

git rebase --interactive HEAD~2

出来上がったエディタで picksquash というエラーが出て、リベースに失敗してしまいます。

前のコミットがないと 'squash'できません。

作業ツリーがこのような状態になってしまったので、復旧に苦労しています。

コマンドは git rebase --interactive HEAD~2 で失敗します。

対話型リベースはすでに始まっています

そして git rebase --continue で失敗します。

以前のコミットがないと 'squash'できません。

解決方法は?

概要

エラーメッセージ

以前のコミットがないと 'squash'できません。

は、おそらく「下につぶす」ことを試みたということです。 Git は常に、新しいコミットを古いコミットに統合します。 あるいは、対話型リベースTodoリストで見るように、「上方」、つまり前の行のコミットの中に入っていきます。TODOリストの最初の行のコマンドを次のように変更します。 squash を実行すると、最初のコミットが何もないため、常にこのエラーが発生します。

修正

まず、最初の場所に戻り

$ git rebase --abort

あなたの履歴を言う

$ git log --pretty=oneline
a931ac7c808e2471b22b5bd20f0cad046b1c5d0d c
b76d157d507e819d7511132bdb5a80dd421d854f b
df239176e1a2ffac927d8b496ea00d5488481db5 a

つまり、a が最初のコミットで、次に b、最後に 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の変更 picksquash に変更するとエラーが発生しますが、代わりに c を b に潰して (新しいコミットを古いコミットに入れる、あるいは「上方修正」)、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

履歴の書き換えに関する注意点

対話型リベースは履歴を書き換えます。古い履歴を含むリモートにプッシュしようとすると、fast-forward ではないので失敗します。

リベースしたブランチがトピックブランチや機能ブランチである場合 自分一人で作業している場合 は、大したことはありません。他のリポジトリにプッシュする場合は --force オプション、あるいはリモートリポジトリの権限によっては、まず古いブランチを削除してからリベース版をプッシュすることもできます。作業を破壊する可能性のあるコマンドの例については、この回答の範囲外です。

他の人と一緒に作業しているブランチで、既に公開された履歴を書き換えること。 非常に パスワードやその他の機密情報を漏らすなどの正当な理由があれば、共同作業者に仕事を押し付けることになり、反社会的で、他の開発者を困らせることになります。その の「上流工程でのリベースからの回復」セクションを参照してください。 git rebase ドキュメント を強調しながら説明しています。

他の人がベースにしているブランチをリベース (あるいはその他の形で書き換える) するのは悪い考えです: そのブランチの下流の人は、自分の履歴を手動で修正することを余儀なくされます。このセクションでは、下流にいる人の視点から、どのように修正を行うかを説明します。 しかし、本当の意味での修正は、そもそも上流をリベースしないことでしょう。 ...