web-dev-qa-db-ja.com

Gitリポジトリの最初の2つのコミットを結合しますか?

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

方法はありますか、それとも不可能ですか?

192
Christian

つかいます 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 [〜#〜]

この回答 にあります。

159
kostmo

あなたがしようとした:

git rebase -i A

editではなくsquashで続行すると、そのように開始できます。

edit e97a17b B
pick asd314f C

その後、実行します

git reset --soft HEAD^
git commit --amend
git rebase --continue

できた.

126

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
64
CB Bailey

対話型リベースの場合、リストが次のようになるように、Aの前に実行する必要があります。

pick A
pick B
pick C

になる:

pick A
squash B
pick C

Aが初期コミットである場合、Aの前に別の初期コミットを行う必要があります。Gitは違いを考えると、(AとB)と(BとC)の違いを処理します。したがって、この例ではスカッシュは機能しません。

10
Loki

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

ドキュメンテーション

9
user456814

関連する質問で、私は最初のコミットに対して潰す必要性に対する別のアプローチを思いつくことができました。

興味がある場合: git:最初にコミットを挿入し、他のすべてをシフトする方法

1
kch

分隊の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)

0
Sumit