mergeの手順
マージ元をbugfix、マージ先(修正を取り込むブランチ)をmasterとした場合。
- masterをチェックアウトする。
- 右クリックで「マージ」を選択し、Fromの「ブランチ」でbugfixを選択する。
マージした際には自動的にコミットされるので、メッセージも編集可能だが、基本的にGitの自動生成メッセージで問題ないのでそのままでよい。 - 競合した場合は、「競合の編集」を選択。(私の場合は競合編集用にWinMergeを利用)
競合編集を開始すると、自動的に*.BASE、*.REMOTE、*.LOCAL、が作成される。
これらは、マージウィンドウにおける、ベース、MERGE_HEAD、HEADに対応している。 - 各ペインはそれぞれ以下の内容を表す。
なお、ペイン上の黄色は「三者間で変更があった個所」、赤は「三者間で競合が発生した個所」を表す。(やや自信なし)- ベース
分岐元の内容。したがって、分岐後にそれぞれのブランチで同名ファイルを追加したようなケースならば、ベースは空になる。 - MERGE_HEAD
マージ元(bugfix)のHEADの内容。 - HEAD
マージ先(master)のHEADの内容。
- ベース
- 競合の編集方法
競合の状況は、競合しているファイルにGitが自動的にマージした部分までが反映されているので、あとは自分で手動修正を行う。
編集はHEADのペインで行う。
マージ後に、HEADペインを保存すると、競合しているファイルにマージされた結果が保存される。
※*.LOCALファイルは変更されない点に注意。競合編集後に、競合ファイルを右クリックし、「解決する」を選択。
表示されるウィンドウでさらに競合ファイルを右クリックし、競合の解決方法を以下から選択する。- 「解決済み」:競合ファイルの現在の内容で解決とする。
- 「MERGE_HEAD(bugfix)」を使って競合を解決:*.REMOTEの内容で競合を解決。
- 「HEAD」を使って競合を解決:*.LOCALの内容で競合を解決。
- 解決後のコミット
競合編集後に、コミットしようとすると、以下のポップアップが表示される。
マージコミットということを強調してくるので、マージコミットだということを認識した上で、作業をすすめる。デフォルトでGitがメッセージを入れてくれるが、このままコミットしようとすると以下のポップアップが出る。
ようするにコンフリクト解決済みなら、コンフリクトの情報は要りませんよってことなので、#部分を削除してからコミットすればOK。
コミット後にログを確認すると以下のように、master側にマージコミットが追加されていることがわかる。
マージを中止したい場合
マージを中止する際は、「マージ中止」において、「Hard」にすればマージ前の状態に完全に復元する。
ただし、競合編集に着手していた場合、*.BASE、*.LOCAL、*.REMOTEといったファイルが残るので手動削除する。
なお、「マージ」だと、競合ファイル以外のファイルについて、作業ディレクトリでなにがしかの編集をしていた場合、その内容は維持される。
「Mixed」だと、競合ファイルの内容も維持されたまま、インデックスだけ巻き戻る。
必要に応じて使い分ければいいが、基本「Mixed」を使わず、「マージ」か「Hard」でよいと思う。

ファストフォワードマージの際の自動コミットについて
ファストフォワードマージの場合、マージ先のHEADを移動するだけなので、新たにコミットは追加されない。
ただし、–no-ffオプションを付けた場合は、ファストフォワードできるケースにおいてもマージコミットが作成される。
mergeした際のログメッセージについて
マージ元、マージ先でそれぞれコミットをすすめていた際に、マージを行うとマージ先にマージコミットが一個追加されるだけなのだが、ログをみると一瞬複数回コミットされるように錯覚することがある。
例えばこれはマージ先がbugfixブランチでマージ元がmasterだったケースだが、黒のグラフで示しているbugfixのログの「bugfix側での修正その2」と「Merge branch ‘master’ into bugfix」の間に複数コミットがあるように見える。
しかし、よく見るとこれは赤色のグラフ、つまりmaster側のコミットであることがわかる。
正直bugfix側のコミットだけをログで見たいが、TortoiseGitではそういった機能はない模様。
コメントを残す