Git最大の難関は「merge」と言ってもいいでしょう。
プログラム工程における「結合」にあたる作業で、GITはプログラムというテキストデータ上での重複チェックを機械的に行ってくれます。
もちろん、意図しない改行コードが1つ入っているだけで「コンフリクト」扱いになります。
コンフリクトとは
テキストファイルを比較するときの基本は「diff」コマンドで行っています。
行毎に違いがないか比較するんですが、diffコマンドがイケている点として、ファイルの途中で1行だけ行が追加されると、それより下の行は、行数が違うということで差分になる点です。
あくまで行番号ではなく、書かれている文字のグループでの差分を計測してくれます。
グループというのは、かなり柔軟に判断してくれるんですが、半角スペース1つ、改行コード1つ・・・
という風に、文字群の中の文字コードが違っているのを判定してくれているんでしょう。
ようするに、変更をしていなければ、コンフリクトは発生しないが、少しでも変更してて、且つ、2つmergeするブランチの両方で更新が入っているという条件があれば、コンフリクトとして判定されます。
意図しないコンフリクトを防ぐ為に
複数人でプログラム修正を行う場合に、誰がどのファイルを修正するかという決め事を事前に行っておくことが重要です。
さらに、自分が修正するファイル以外で、一時的に修正してしまったが、元に戻したい時は、resetなどをファイル単位でつかって、mergeする際には、変更が確実にない状態にするという運用をすればいいでしょう。
面倒くさいですが、なんとかツールでこういった対応ができるといいんだが・・・
コンフリクトしてしまった場合
GITには便利なツールがいくつか入っていてその中のひとつに「mergetool」というのがあり、
conflictしたmerge箇所をGUIで整えてくれるサポートをしてくます。
コンフリクトした際に、迷わず以下のコマンドを実行してみてください。
$ git mergetool
上記ウィンドウが立ち上がったら、右下のプルダウンで、左右どちらのバージョンを採用するか選択できます。
画面下側にプレビューが表示されます。
※表示されない場合は、手動で引き出してください。
ウィンドウを閉じるとsaveするかどうか聞かれるので、saveすると、「.orig」というファイルが出来てしまうので、邪魔であれば、rmしておきましょう。
その後、「add」「commit」して完了です。
参考
今回起動したdiff-toolはどうやらmacのxcode用のdiffツールのようで、他のエディタで対応したい場合は、以下のページを参考にしてみてください。
http://qiita.com/yuya_presto/items/5d99499cf96c0ebb09f8
0 件のコメント:
コメントを投稿