1. ホーム
  2. git

[解決済み] Gitで最初の2つのコミットをつぶす?重複

2022-03-16 18:10:23

質問

git rebase --interactive <commit> を使えば、いくつものコミットをひとつにまとめることができます。

最初のコミットの中にコミットを詰め込むのでなければ、それは素晴らしいことです。それは不可能に思えますが。

それを実現する方法はあるのでしょうか?


ほどよく関連する

関連する質問ですが、最初のコミットに対するスクワッシュの必要性に対して、別のアプローチを思いつくことができました、それは、そう、2番目のコミットにすることです。

ご興味のある方は git: あるコミットを最初のコミットとして挿入し、他のコミットをすべてシフトさせるには?

解決方法は?

2012年7月更新( git 1.7.12+ )

root までのすべてのコミットをリベースし、2 番目のコミットを選択できるようになりました。 Y を潰し、最初の X .

git rebase -i --root master

pick sha1 X
squash sha1 Y
pick sha1 Z

<ブロッククオート
git rebase [-i] --root $tip

<ブロッククオート

このコマンドを使うと、"から先の履歴を全て書き換えることができるようになりました。 $tip "からルートコミットまで。

参照 GitHub のコミット df5df20c1308f936ea542c86df1e9c6974168472 を参照してください。 から クリス・ウェブ( arachsys ) .

前述のとおり コメントにて , a git push --force-with-lease (よりも安全)。 --force のように ミッコ・マンタライネン リマインド・ユー の後に必要です。 rebase 操作で、その手直しをリモートリポジトリで公開する必要がある場合です。


当初の回答(2009年2月)

SOの質問"にそのための様々なレシピが載っていると思います。 git リポジトリの最初の二つのコミットを結合する方法は? "です。

チャールズ・ベイリー 最も多く提供された 詳細な回答 コミットは完全なツリーであることを思い出させてくれます (以前の状態からの差分だけではありません)。
そして、ここでは古いコミット("initial commit")と新しいコミット(squashingの結果)は共通の祖先を持たないことになります。
つまり、quot; commit --amend 最初のコミットを新しいものに変更し、前の最初のコミットの履歴を新しい最初のコミットにリベースします(多くの競合が発生します)。

(最後の文は git rebase -i --root <aBranch> )

むしろ、(この A は元の "初期コミット"、そして B は、後続のコミットを最初のコミットに押し込む必要があります)。

  1. 最初のコミットを形成したい最後のコミットに戻る(HEADをデタッチする)。

     git checkout <sha1_for_B>
    
    
  2. ブランチポインタを最初のコミットにリセットし、インデックスと作業ツリーはそのまま残します。

     git reset --soft <sha1_for_A>
    
    
  3. B'のツリーを用いて、初期ツリーを修正する。

     git commit --amend
    
    
  4. この新しい初期コミットに一時的にタグを付けます (または、新しいコミットの sha1 を手動で記憶することもできます)。

     git tag tmp
    
    
  5. 元のブランチに戻る(この例ではmasterとする)。

     git checkout master
    
    
  6. B 以降のすべてのコミットを新しい初期コミットにリプレイします。

     git rebase --onto tmp <sha1_for_B>
    
    
  7. 一時的なタグを削除します。

     git tag -d tmp
    
    

そうすると、「" rebase --onto をリベースするため、マージ中にコンフリクトが発生することはありません。 の後に作られた 最後のコミット( B であった)を最初のものに押し込めた。 A )から tmp (潰された新しい初期コミットを表す): 些細な早送りのマージのみ。

それは"に効きますね。 A-B はもちろんのこと、" A-...-...-...-B "(この方法では、いくつものコミットを最初の1つにまとめることができます。)