1. ホーム
  2. ギット

[解決済み] git - マージ時に特定のコミットをスキップする

2022-04-06 20:17:15

質問

Git を使い始めてから約一年が経ち、素晴らしいものだと思っています。しかし、ちょうどプロジェクトの第二バージョンに着手し、そのために新しいブランチを立ち上げました。今後どのように処理するのがベストなのか、少し悩んでいます。

私は、master10(v1用)とmaster20(v2用)という2つのブランチを持っています。v1 のバグフィックスを master10 ブランチで行い、新しいものを master20 ブランチで開発しています。バグフィックスのたびに、master20 をチェックアウトして、v2 にマージしています。 git merge master10 . 今のところ順調です。

しかし、v1ではv2には不要な変更を加えてしまいましたが、他のバグフィックスを引き続きマージしたいのです。そのコミット (あるいはある範囲のコミット) をスキップして、他のバグフィックスをマージするように Git に指示するにはどうすればいいのでしょう。

と思ったら git rebase が必要かもしれませんが、ドキュメントを読んで、頭が爆発しそうになりました。

私が欲しいのは "git sync" コマンドのようなもので、git に二つのブランチが同期していることを伝え、将来的にはこの同期ポイントからのコミットのみをマージするものだと思います。

よろしくお願いします。

解決方法は?

たとえば、"maint" ブランチのコミットのうち、すべてではなく大部分を "master" にマージしたい場合、このようにすることができます。しかし、時にはリリース版に加えた変更を元に戻してはいけないということもあります(そのコードはすでに master で上書きされているかもしれません)。そこで...

たとえば、maint に 5 つの変更が加えられていて、そのうちの 1 つ (maint~3) は master にマージされないが、他のすべてはマージされるべきであるとします。この場合、3つの段階を踏みます。ひとつ前の変更をすべて実際にマージし、maint~3がマージされていない場合でもマージしたことにするようgitに指示し、その後残りの変更をマージします。マジックはこうです。

bash <master>$ git merge maint~4
bash <master>$ git merge -s ours maint~3
bash <master>$ git merge maint

最初のコマンドは、すべての 以前 面倒な maint コミットは master に移動します。デフォルトのマージログメッセージでは、"branch 'maint' (early part)" をマージしていることが説明されます。

2 番目のコマンドは厄介な maint~3 コミットをマージしますが、"-s ours" オプションは git に特別な "merge strategy" を使うよう指示します。しかし、HEAD と maint~3 を親とする新しいマージコミットが作成され、リビジョングラフは maint~3 がマージされたと表示されるようになります。ですから、実際には -m オプションを使用して git merge のコミットが実際には無視されていることを説明するためです!

最後のコマンドは、maint の残り (maint~2..maint) を master にマージして、再び同期させるだけです。