2016-08-18 4 views
8

ブランチの途中で、前後にコミットを変更せずにいくつかのコミットを一緒にスカッシュしたいと思います。ブランチの途中でGit squashがコミットします

私が持っている:

A -- B -- C -- D -- E -- F -- G 
|        | 
master      dev 
origin/master 

私はHB -- C -- Dと同等です

A -- H -- E -- F -- G 
|     | 
master    dev 
origin/master 

にそのスカッシュしたいです。そして私はHのコミットメッセージを指定できるようにしたいと思います。 Aはプッシュされた最後のコミットなので、それ以降のすべてのコミットはサーバーを台無しにすることなく書き直すことができます。考えは、私が早送りする前に履歴を整理することですmaster

どうすればいいですか?

PS:私の場合、私は実際に途中で潰すためにたくさん以上3つのコミットを持っていることに注意してください、私は3でそれを行うことができれば、私はより多くでそれを行うことができるはずです。

PPS:可能であれば、私はE,FおよびGが(コミット日付に関して)ほとんど影響を受けないソリューションを好むでしょう。

+0

[Gitを押す前に複数のコミットを組み合わせる]の可能な複製(http://stackoverflow.com/questions/6934752/combining-multiple-commits-before-pushing-in-git) –

答えて

13

対話型のリベースを行い、スカッシュするコミットを手動で選択できます。これにより、devブランチの履歴が書き換えられますが、これらのコミットをプッシュしていないので、自分のコンピュータ上で発生する可能性のあるものに加えて、そこから否定的な余波があってはなりません。

以下で開始:

git checkout dev 
git rebase -i HEAD~6 

これが戻ってあなたのdevブランチのHEADから6つの段階に行く、あなたに7つのコミットの次のリストを表示するウィンドウを持ち出す必要があります。

pick 07c5abd message for commit A 
pick dl398cn message for commit B 
pick 93nmcdu message for commit C 
pick lst28e4 message for commit D 
pick 398nmol message for commit E 
pick 9kml38d message for commit F 
pick 02jmdmp message for commit G 

を最初に表示されたコミット(Aは上記)はであり、最も古いのはであり、最後は最新です。デフォルトでは、各コミットのオプションはpickであることがわかります。今すぐrebaseを終了した場合は、そのままコミットをそのまま保持しています。これは事実上ノーオペレーションです。しかし、特定のミドルコミットをスカッシュしたいので、リストを編集してこれに変更してください:

pick 07c5abd message for commit A 
pick dl398cn new commit message for "H" goes here 
squash 93nmcdu message for commit C 
squash lst28e4 message for commit D 
pick 398nmol message for commit E 
pick 9kml38d message for commit F 
pick 02jmdmp message for commit G 

注意してください。 squashを入力して、あなたはそれが直前来たコミットしている、上記1 にそれをコミットすることをマージするにGitを語っています。これはコミットをコミットCに逆戻りさせ、次にをBにスカッシュさせ、コミットがBC、およびDのままにしておきます。他のコミットはそのままです。

ファイルを保存してください(WindowsではGit Bashに:wq)、リベースが完了しました。あなたはご想像のとおり、このからマージの競合を取得することができます覚えておいて、それらを解決し、あなたが任意の正規リベースまたはマージ同じようにあなたが運ぶことができる程度の特別なものは何もありません。

あなたがリベース後のブランチを調べる場合は、EF、およびGコミットは今これらのコミットは、実際に新しいコミットに置き換えられているので、これがあるなど、新たなハッシュ、日付を、持っていることがわかります。この理由は、履歴を書き換えているため、一般的にコミットは以前のものと同じにはなりません。

+0

チャームのように働いてくれてありがとう!私はこれが容易であるとは思わなかった。しかし、最後の3つのコミットを書き直すことなく同じことをする方法はありますか?私はgitが3つの新しいコミットを作成したことに気付きました(コミット日付は現在の日付です)。 – deadbeef

+1

@deadbeef質問をしばらく熟考すれば、答えが「いいえ」でなければならない理由が分かります。 'E'、' F'、 'G'がコミットする前に何が起こったのかを書き換えたので、これらの3つのコミットは書き直され、実際には新しいコミットになります。 –

+0

私はしばらく熟考しており、おそらく不可能であると認識していました。しかし、私は 'git rebase --committer-date-is-author-date'を見つけました。これは基本的に私が望む(元のコミット日付を保つ)ものです。 – deadbeef

関連する問題