[解決済み] 既にリベースを開始している場合、2つのコミットを1つにマージするにはどうすればよいですか?
質問
私は2つのコミットを1つにマージしようとしているので、次のようにしました。 git readyの「squashing commits with rebase」(リベースでコミットをつぶす)。 .
を実行しました。
git rebase --interactive HEAD~2
出来上がったエディタで
pick
を
squash
というエラーが出て、リベースに失敗してしまいます。
前のコミットがないと '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の変更
pick
を
squash
に変更するとエラーが発生しますが、代わりに 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
ドキュメント
を強調しながら説明しています。
他の人がベースにしているブランチをリベース (あるいはその他の形で書き換える) するのは悪い考えです: そのブランチの下流の人は、自分の履歴を手動で修正することを余儀なくされます。このセクションでは、下流にいる人の視点から、どのように修正を行うかを説明します。 しかし、本当の意味での修正は、そもそも上流をリベースしないことでしょう。 ...
関連
-
[解決済み] ブラウンアウトの一環として、パスワード認証が一時的に無効になっています。代わりに個人用アクセストークンを使用してください[重複]。
-
[解決済み] .gitignore と "以下の追跡されていない作業ツリーファイルはチェックアウトによって上書きされるでしょう"
-
[解決済み] 2つのコミット間で変更されたファイル名のみをリストアップする方法
-
[解決済み] 2 つの Git リポジトリをマージする方法は?
-
[解決済み] Git で、別のブランチの変更を選択的にマージしたり選択したりするにはどうすればよいですか?
-
[解決済み] 複数のコミットを1つのスクワッシュされたコミットとして別のブランチにマージするにはどうすればよいですか?
-
[解決済み] あるユーザーのコミットだけを集めた git ログを表示するにはどうすればよいですか?
-
[解決済み] リモートブランチにプッシュ済みのマージコミットをリバートする方法は?
-
[解決済み] あるブランチが既にmasterにマージされているかどうかを知るにはどうすればよいですか?
-
[解決済み】Gitのワークフローとrebaseとmergeの質問
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Gitのエラー。リモートリポジトリへの接続時に「Host Key Verification Failed」。
-
[解決済み】Githubの認証に失敗した - ... GitHubはシェルアクセスを提供しない
-
[解決済み】git-mergeの-dry-runオプションはありますか?
-
[解決済み】ローカルに変更があるにもかかわらず、git pushが「すべて最新」と言う
-
[解決済み] git rebase fatal: 必要なリビジョンは1つです。
-
[解決済み] git: fatal: リモートリポジトリから読み取れませんでした。
-
[解決済み] git commit signing failed: secret key not available.
-
[解決済み] Gitを使って最後のXコミットをまとめる
-
[解決済み] Gitでプッシュする前に複数のコミットを結合する [重複]。
-
[解決済み】コードレビュー後のプルリクエストを更新するための望ましいGithubワークフロー