3つのコミットを含む履歴があるとします A、B そして C:
A-B-C
2つのコミットを結合したい A そして B 1つのコミットに AB:
AB-C
私は試した
git rebase -i A
次の内容でエディターが開きます。
pick e97a17b B
pick asd314f C
これを
squash e97a17b B
pick asd314f C
次に、Git 1.6.0.4は次のように述べています。
Cannot 'squash' without a previous commit
方法はありますか、それとも不可能ですか?
つかいます git rebase -i --root
Git時点 バージョン1.7.12 。
インタラクティブなリベースファイルで、コミットの2行目[〜#〜] b [〜#〜]をsquashに変更し、他の行はpickのままにしておきます:
pick f4202da A
squash bea708e B
pick a8c6abc C
これにより、2つのコミット[〜#〜] a [〜#〜]と[〜#〜] b [〜#〜]1つのコミット[〜#〜] ab [〜#〜]。
この回答 にあります。
あなたがしようとした:
git rebase -i A
edit
ではなくsquash
で続行すると、そのように開始できます。
edit e97a17b B
pick asd314f C
その後、実行します
git reset --soft HEAD^
git commit --amend
git rebase --continue
できた.
A
が最初のコミットでしたが、今ではB
を最初のコミットにしたいです。 gitコミットはツリー全体であり、通常は導入されたdiffの観点から記述および表示されていても、diffではありません。
このレシピは、AとB、およびBとCの間に複数のコミットがある場合でも機能します。
# Go back to the last commit that we want
# to form the initial commit (detach HEAD)
git checkout <sha1_for_B>
# reset the branch pointer to the initial commit,
# but leaving the index and working tree intact.
git reset --soft <sha1_for_A>
# amend the initial tree using the tree from 'B'
git commit --amend
# temporarily tag this new initial commit
# (or you could remember the new commit sha1 manually)
git tag tmp
# go back to the original branch (assume master for this example)
git checkout master
# Replay all the commits after B onto the new initial commit
git rebase --onto tmp <sha1_for_B>
# remove the temporary tag
git tag -d tmp
対話型リベースの場合、リストが次のようになるように、Aの前に実行する必要があります。
pick A
pick B
pick C
になる:
pick A
squash B
pick C
Aが初期コミットである場合、Aの前に別の初期コミットを行う必要があります。Gitは違いを考えると、(AとB)と(BとC)の違いを処理します。したがって、この例ではスカッシュは機能しません。
kostmo's answer ofを使用して、数百または数千のコミットがある場合
git rebase -i --root
リベーススクリプトが処理する必要があるコミットの数が多いため、非現実的で遅い場合がありますtwice、インタラクティブリベースエディターリストを生成するために1回(各コミットに対して実行するアクションを選択する場所) 、そして一度コミットの再適用を実際に実行します。
これは、代替ソリューションです。これは、対話型リベースエディターリストを生成する時間コストを回避します対話型リベースを使用しない in最初の場所。このように、それは Charles Baileyの解 に似ています。 2番目のコミットからOrphan branchを作成し、その上にすべての子孫コミットをリベースします。
git checkout --Orphan orphan <second-commit-sha>
git commit -m "Enter a commit message for the new root commit"
git rebase --onto Orphan <second-commit-sha> master
関連する質問で、私は最初のコミットに対して潰す必要性に対する別のアプローチを思いつくことができました。
興味がある場合: git:最初にコミットを挿入し、他のすべてをシフトする方法
分隊のGitコマンド:git rebase -i HEAD〜[コミット数]
以下のgitコミット履歴があるとしましょう:
pick 5152061 feat:画像の保存のサポートを追加しました。 (A)
ピック39c5a04修正:バグ修正。 (B)
ピック839c6b3修正:競合を解決しました。 (C)
AとBをABに押しつぶしたい場合は、以下の手順を実行します。
pick 5152061 feat:画像の保存のサポートを追加しました。 (A)
s 39c5a04修正:バグ修正。 (B)
ピック839c6b3修正:競合を解決しました。 (C)
注:コミットをスカッシュするには、squashまたはsを使用できます。最終結果は次のようになります。
pick 5152061 feat:画像の保存のサポートを追加しました。 (AB)
ピック839c6b3修正:競合を解決しました。 (C)