Git:リベース中の「以前のコミットなしでは「スカッシュ」できません」エラー


95

のTo-Doテキストに次の情報が含まれていますgit rebase -i HEAD~2

pick 56bcce7 Closes #2774
pick e43ceba Lint.py: Replace deprecated link

# Rebase 684f917..e43ceba onto 684f917 (2 command(s))
#
...

ここで、最初の1つ(56bcce7)を押しつぶし、最初の前に "s"を追加して2つ目を選択しようとすると、次のエラーが発生します。

Cannot 'squash' without a previous commit

誰かが私にそれが何を意味するのか、そしてどうすればそれを説明できますか?

最初のcommit(56bcce7)を押しつぶし、2番目のe43cebacommit を「選択して言い換え」たい


1
本当に潰したい場合は、HEAD〜2をHEAD〜3に変更します。
ElpieKay 2016

1
そして、もしHEAD〜2が最初のコミットなら--rootを使うかもしれません:stackoverflow.com/a/598788/2444812
Sybille Peters

回答:


79

インタラクティブなリベースは、を使用するときに慣れている順序とは逆の順序でコミットを提示しgit logます。git rebase -i選択したコミットを、保存されているリベース指示ファイルにリストされている正確な(トップダウン)順序で再生します。押しつぶすとき、押しつぶすために選択されたコミットは、(編集された)リストでそれより前にあるコミット、つまり前の行からのコミットと組み合わされます。あなたの場合-の以前のコミットはありません 56bcce7。次のいずれかを実行する必要があります

  • git rebase -i HEAD~3(あなたがスカッシュしたい場合56bcce7684f917
  • と組み合わせるつもり56bcce7e43ceba、にe43ceba依存しない場合は56bcce7、単純に並べ替えます。

    r e43ceba Lint.py: Replace deprecated link
    s 56bcce7 Closes #2774
    

    更新:以下のGusの回答は、2つのコミットを並べ替えることなく、同じことを行うより良い方法を提案しています:

    r 56bcce7 Closes #2774
    s e43ceba Lint.py: Replace deprecated link
    

    これにより、2つのコミットが1つにまとめられます。インタラクティブなリベースがの言い換えられたコミットメッセージを要求する場合、および56bcce7の結合を説明するコミットメッセージを提供します。56bcce7e43ceba


1
スカッシュ56bcce7 したいですe43ceba。では、どうすればここでステップ1を実行できますか?
Dawny33

82

私は次のように解決した同様の問題がありました:

これは私がスカッシュしたかったコミットグループです:

1 s 01cc5a08 Removes open div
2 s a2b6eecf Restores old fonts
3 s 603479ff Cleans left out div
4 pick 5afdbc33 Update: show logo on landing page
5 s 04c1cb13 change version of dev and prod from 1 to 2
6 s bbe6a8f8 Update: show logo on landing page if they have one
7 s c0d6008a Adds check for C users

あなたが見ることができるように、私はノーが欲しかった。4、しかし1、2及び3には、以前はにコミットしませんでしたカボチャに。したがって、以前のコミットエラーがないと、「スカッシュ」できません

私の解決策は、rオプションを使用することでした# r, reword = use commit, but edit the commit message

だから私のコミットリストは次のようになりました:

1 r 01cc5a08 Removes open div
2 s a2b6eecf Restores old fonts
3 s 603479ff Cleans left out div
4 s 5afdbc33 Update: show logo on landing page
5 s 04c1cb13 change version of dev and prod from 1 to 2
6 s bbe6a8f8 Update: show logo on landing page if they have one
7 s c0d6008a Adds check for C users

保存した後、対話型シェルは選択したコミットの言い換えを要求しました。

その後、私のコミットログは単一のコミットをもたらし、よりきれいなコミット履歴をもたらしました。


2
私のように、言い直したり、選んだり、言及されたエラー(質問)を取得したりするためにコミットを選択しなかったためにエラーが発生した場合は、git rebase --edit-todoこの回答を参照して修正する必要がありますgit rebase --continue
old-monk

この答えは簡潔で、要点は本当に助けられました。ありがとう
ゴンゾフィッシュ

16

私はこの問題を抱えていて、私の場合にそれが起こった理由は、古いコミットを新しいコミットに押しつぶすことができないということでした。3つのコミットがある場合の例を次に示します。

1 pick 01mn9h78 The lastest commit
2 pick a2b6pcfr A commit before the latest
3 pick 093479uf An old commit i made a while back

あなたが言ってgit rebase -i HEAD~3、あなたが次のようなことをしたら

1 pick 01mn9h78 The lastest commit
2 s a2b6pcfr A commit before the latest
3 s 093479uf An old commit i made a while back

これはエラーになります:

エラー:以前のコミットがないと「スカッシュ」できません「git rebase --edit-todo」でこれを修正してから、「git rebase --continue」を実行できます。または、 'git rebase --abort'を使用してリベースを中止できます。

解決 :

コミットをスカッシュするときは、最近のコミットを古いコミットにスカッシュする必要があります。その逆はしないので、この例では次のようになります。

1 s 01mn9h78 The lastest commit
2 s a2b6pcfr A commit before the latest
3 pick 093479uf An old commit i made a while back

これは問題なく動作します。すべてのコミットメッセージが必要な場合は、squashではなくfixupをお勧めします。


5
ありがとうございます。私はコミットを頻繁に押しつぶすことはありません。最も古いコミットを選択するようアドバイスすることで、役に立たないgitエラーを回避できました。
0x574F4F54 2018

2

逆論理でスカッシュ。後の手順で目的のコミットメッセージを選択できます。

  • pickコミットメッセージを望まない最初のコミット。
  • squashまたはfixup、実際に必要なコミットメッセージがあるコミットまで、マージするコミット。
pick 56bcce7 Closes #2774
squash e43ceba Lint.py: Replace deprecated link
  • 変更を確認(:x
  • 不要なコミットメッセージを削除し、必要なコミットからのメッセージのみを残します(この場合はLint.py: Replace deprecated link)。
  • 選択を確認(:x

誰かにとってより明確になることを願っています✌🏽


1

コミットを含むインタラクティブエディターで、gitは常に下から上にスカッシュし、下からスカッシュを受け取るには「ピック」エントリを上部に残しておくとよいでしょう。


1

私はこのアプローチを試しました。

git log -n3

これにより、最後の3つのコミットが表示され、最新のコミットと以前に行ったコミットがわかります。今リベースを述べ、

git rebase -i HEAD〜3

他の2つを押しつぶす必要がある最新のコミットを選択します。ベースコミットとして選択されるコミットIDは次のようになります。

commit_idを選択

他の2つのコミットIDについては、次のように変更します。

スカッシュcommit_id

または単に、

s commit_id


0

私はすでにこの問題にもすでに遭遇していますが、それは不注意です。次のような問題を解決できます。最初の問題(56bcce7)を押し潰して2番目の問題を選択しようとすると、2行目の前に「s」を追加する必要がありますが、最初のものではありません。次のWebサイトを参照することもできます:http : //backlogtool.com/git-guide/en/stepup/stepup7_5.html


1
こんにちは !スタックオーバーフローでの将来の取り組みのために、最小、完全、検証可能な例を作成する方法をチェックアウトすることをお勧めします。
Momin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.