これによりgit rebase --interactive <commit>
、任意の数のコミットを1つにまとめることができます。
コミットを最初のコミットに押しつぶしたくない限り、それはすべて素晴らしいことです。それは不可能のようです。
それを達成する方法はありますか?
関連する質問で、私は最初のコミットに対して押しつぶす必要性に対する別のアプローチを思いつくことができました。それは、まあ、それを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
)。
元の回答(2009年2月)
SOの質問「gitリポジトリの最初の2つのコミットをどのように組み合わせるのですか?」で、そのためのさまざまなレシピが見つかると思います。
Charles Baileyが最も詳細な回答を提供し、コミットは完全なツリーであることを思い出させました(以前の状態との相違だけではありません)。
そして、ここでは、古いコミット(「初期コミット」)と新しいコミット(押しつぶしの結果)に共通の祖先がありません。
つまりcommit --amend
、最初のコミットを新しいコミットに「」してから、新しい最初のコミットにリベースして、前の最初のコミットの履歴をリベースすることはできません(多くの競合)
(その最後の文はもはや真実ではありませんgit rebase -i --root <aBranch>
)
むしろ(A
元の「最初のコミット」でB
、後続のコミットを最初のコミットに押しつぶす必要がありました):
最初のコミットを形成する最後のコミットに戻ります(HEADをデタッチします)。
git checkout <sha1_for_B>
ブランチポインタを最初のコミットにリセットしますが、インデックスと作業ツリーはそのままにします。
git reset --soft <sha1_for_A>
'B'のツリーを使用して最初のツリーを修正します。
git commit --amend
この新しい初期コミットに一時的にタグを付けます(または、新しいコミットsha1を手動で覚えておくことができます)。
git tag tmp
元のブランチに戻ります(この例ではマスターを想定しています)。
git checkout master
Bの後のすべてのコミットを新しい初期コミットに再生します。
git rebase --onto tmp <sha1_for_B>
一時タグを削除します。
git tag -d tmp
このように、 " rebase --onto
"は、最後のコミット()の後に作成された履歴を最初のコミット(B
だったA
)にtmp
(押しつぶされた新しい最初のコミットを表す)にリベースするため、マージ中に競合が発生しません:些細な早送りマージのみ。
これは「A-B
」だけでなく「A-...-...-...-B
」でも機能します(この方法で、任意の数のコミットを最初のコミットに押しつぶすことができます)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加