GitのMergeは正直かなり分かりづらい挙動をします。
git merge <Branch名>
現在のBranchに対して指定したBranchをMergeし、不整合(conflict)があると変更状態になるのですが、conflictが発生したFileは2つのSourceの結合状態になります。
<<<<<<< HEAD
// 現在のブランチの内容
=======
// Mergeするbranchの内容
>>>>>>> Mergeするbranch
MergeするFileを置いてくれれば差分見ながらMergeするのに、「結合」しやがるんです。
差分がどこにあるとかいう情報はないです。結合です。
そして、文字CodeがUTF-8ではない場合にこの結合で文字化けが発生する場合があり、この状態になると変更箇所が膨大になり手動での結合なんてものはできません。
(文字Codeの設定についてはGit003を参照)
GitのMerge機能はSmartとはとても言えない!!力技で解決!
Merge状態になると、Conflict状態のfileを全てStagingか、Merge abortで諦めるしかないです。
#Stagingのコマンド(GUIでStagingする方が楽)
git add <File名>
#MergeのAbortコマンド
git merge --abort
<Mergeを進める対応方法>
-
△Merge Editorを使って、conflictを解決してMergeを終了(Staging)。
→文字化けしている場合は変更箇所が多くてやってられません。 -
△Conflictを解決しないままStaging。
→結合FileがStagingされます。もうひと手間かけてもいいんじゃないでしょうか?
明らかに間違っているFileになるので分かりやすい方はこの方法でもOK。 -
○?とりあえず現在か、Merge側か選択してMerge終了(Staging)する。
-
○?ConflictのFileをMergeするFileで上書きしてからStagingする。
または、結合Fileの余計な記号や片方のSourceを全消してからStagingする。
→たまに変換ErrorとかでStagingが進まない場合もこの方法なら進みます。安定性は最強。
どの方法でStagingしても、一度Stagingを解除して変更状態にして確認(Stagingは文字Code問題あるからね→Git003)。
必要なら手動でMergeしましょう。
力技でconflictを個々に解決します。
そもそも、Mergeコマンド使わない選択肢もありますよ?
Mergeコマンドは作りが悪いので、Merge先BranchにCheck outしてFile全部コピーしてから戻ってきてコピーファイル上書きも検討した方がいいんじゃないでしょうか?
[現在Branch] → [Merge先Branch] →全File Copy
↓
全File上書きPaste
↓
手動Merge
多少面倒ですが、
・間違いやすい手順は無くなり、
・確認せずにMergeされるSourceは無くなり、
※例えば、2つの挙動の違うブランチA,Bを管理していて、Aの挙動に合わせて作った機能を
そのままBにMergeするとAの挙動に合わせた部分はBにはないのでConflict無くMergeされたりする。
Conflictが無くても安全とは限らない。
・通常のSoft変更と同じ手順でMergeができます。
この場合のデメリットはGitの扱いではMergeではなくFile変更なので、どこのBranchとMergeした記録が残らず、Git GraphなどでMergeした時の経路がグラフィカルに見えないという点のみです。