web-dev-qa-db-ja.com

Git:merge-commitが間にあるコミットを潰す方法は?

私は機能ブランチに取り組んでいます。

  1. いくつかのコミットを行いました。コミットをつぶします。
  2. 変更をリモートブランチにプッシュしました。競合が発生しました。
  3. マスターからの変更をマージし、機能ブランチの競合を解決しました。 (git fetch Origin master> git merge FETCH_HEAD>手動で解決された競合> git commit> git Push)
  4. もう1つコミットしました。

したがって、現在のコミット履歴は次のようになります。現在から古いものへ:

  1. コミット3
  2. m yyyをコミット(マージ)
  3. コミット2

機能ブランチをマスターにマージする前に、3回のコミットを1回にスカッシュするにはどうすればよいですか?

41
Miral

rebase -iの親(つまり、分岐元のmasterのコミット)で始まるcommit 2を使用できます。マージコミットに到達すると、競合を再解決する必要があります。 。

履歴が次のように見える場合

  * D commit 3 (HEAD)
  * M merge
 /|
| * C commit 2
* | B commit on master
|/
* A (master)

git rebase -i Aで始めます。 masteryour_branchの両方を含むコミットのリストが表示されますが、マージコミットは表示されません。 pick最初のもの(タイミングに応じてBまたはC、残りはsquash)。

23
Kristján

私の場合、私はいくつかのコミットを持つブランチで作業を開始し、メイン/ソースブランチとマージし、さらにコミットし、すべてのコミットをつぶしたいのですが、マージコミットのためにエラーが発生し続けました:

エラー:コミットはマージですが、-mオプションが指定されていません。

-> C1-> C2-> M(ソースブランチとマージ)-> C3-> C4

おそらくより良い方法があります(そして、私は学習を楽しみにしています)が、多くの読み取りと試行錯誤の後にやったことは、参照用のコピーブランチを作成し、現在のブランチをC1

リセット-ハード(C1ハッシュ)

次に、C2、C3、C4をチェリーピッキングし、次に押しつぶし、リベースします...

M-> C

(ソースでリベースされたコミットが1つだけ!)

これが同じ問題を抱えている他の人の助けになることを願っています。

0
user6096790