web-dev-qa-db-ja.com

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

git rebase -i HEAD~2のTo Doテキストには以下があります。

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

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

さて、最初のコード(56bcce7)を押しつぶし、最初のコードの前に「s」を追加して2つ目のコードを選択しようとすると、次のエラーが表示されます。

Cannot 'squash' without a previous commit

誰かが私にそれが何を意味するのか説明できますか?

最初のcommit(56bcce7)を押しつぶし、2番目のcommit(e43ceba)を選択して書き直したい

58
Dawny33

対話型リベースは、git logを使用する場合に使用するのと逆の順序でコミットを表示します。 git rebase -iは、選択したコミットを、保存されたリベース指示ファイルにリストされている正確な(トップダウン)順序で再生します。スカッシュ時に、スカッシュ用に選択されたコミットは、(編集済み)リストで前にあるコミット、つまり前の行のコミットと結合されます。あなたの場合-56bcce7の以前のコミットはありません。次のいずれかを実行する必要があります

  • git rebase -i HEAD~356bcce7684f917に押し込みたい場合)
  • 56bcce7e43cebaを組み合わせることを意味し、e43ceba56bcce7に依存しない場合は、単純に並べ替えます:

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

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

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

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

56
Leon

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

これは、私がつぶしたかったコミットグループです。

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にはsquash intoへの以前のコミットがありませんでした。そのため、以前のコミットなしでは「スカッシュ」できませんエラーです。

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

したがって、私のコミットリストは次のようになりました。

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

保存後、対話型のシェルから、選択したコミットの言い直しを求められました。

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

46
Gus

私はこの問題を抱えていました。私の場合、それが起こったのは、古いコミットを新しいコミットに押し込めないからです。以下に、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 --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
DvixExtract

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

0
user8073722