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
)を選択して書き直したい
対話型リベースは、git log
を使用する場合に使用するのと逆の順序でコミットを表示します。 git rebase -i
は、選択したコミットを、保存されたリベース指示ファイルにリストされている正確な(トップダウン)順序で再生します。スカッシュ時に、スカッシュ用に選択されたコミットは、(編集済み)リストで前にあるコミット、つまり前の行のコミットと結合されます。あなたの場合-56bcce7
の以前のコミットはありません。次のいずれかを実行する必要があります
git rebase -i HEAD~3
(56bcce7
を684f917
に押し込みたい場合)56bcce7
とe43ceba
を組み合わせることを意味し、e43ceba
が56bcce7
に依存しない場合は、単純に並べ替えます:
r e43ceba Lint.py: Replace deprecated link
s 56bcce7 Closes #2774
UPDATE: Gusの答え は、2つのコミットを並べ替えることなく、同じことを行うより良い方法を提案しています:
r 56bcce7 Closes #2774
s e43ceba Lint.py: Replace deprecated link
これにより、2つのコミットが1つにまとめられます。インタラクティブリベースが56bcce7
の書き換えられたコミットメッセージを要求する場合、56bcce7
とe43ceba
の結合を説明するコミットメッセージを提供します。
次のように解決した同様の問題がありました:
これは、私がつぶしたかったコミットグループです。
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 message
にr
オプションを使用することでした
したがって、私のコミットリストは次のようになりました。
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
保存後、対話型のシェルから、選択したコミットの言い直しを求められました。
その後、私のコミットログは単一のコミットになり、コミット履歴がきれいになりました。
私はこの問題を抱えていました。私の場合、それが起こったのは、古いコミットを新しいコミットに押し込めないからです。以下に、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をお勧めします。
次のように問題を解決できます:最初の問題(56bcce7)を押しつぶし、2番目の問題を選択しようとすると、2行目の前に「s」を追加する必要がありますが、最初のものではありません。次のWebサイトも参照できます。 http://backlogtool.com/git-guide/en/stepup/stepup7_5.html