
自分、GITを使っていてよくCONFLICTを出しちゃうんですよ。
仕事のど真ん中でという事ではなく、初期開発の検証中とか、自己開発系なんかの時に出しちゃうので、これまで結構力技でツブしていたんですが、
一括コマンドで処理する方法があったので、備忘録がてらブログにしたためておきます。
CONFLICTについて
優秀なエンジニアであれば、CONFLICTなんて絶対に出しません。
でも、チームプレイにおいて、同じリポジトリで、他人と書き換えたファイルが同じ場合に、mainにマージしたらCONFLICTしちゃったというケースはあるかと思います。
時系列通りにファイルが書き換えられていれば良いんですが、
Aタイプのコードが、太郎くんと、次郎くんが別々に、Aダッシュタイプを作成(ファイル変更)した場合に、GITは、「どっちが正解なんだい?」と問いかけるのが、
CONFLICTです。
自分がよくやるミスとしては、別プロジェクトと共用で作ったような処理を1つのフォルダに入れてあって、
片方が修正されたらそのフォルダごとゴッソリと入れ替えるみたいなことをすると、
mainにマージするタイミングでCONFLICTが発生する場合があります。
これは、毎回作業する前にmainの最新情報を自分の作業ブランチにpullしたりfetchして確認することを怠ると起きガチです。
自分だけで作業してると、なかなかめんどくさくてハブいちゃうんですよね。(わかる人いる?)
CONFLICTの直し方
とりあえず、コンフリクトの経験が無い人のために、修正方法を書いておきます。
(知ってる人は読み飛ばしてください)
CONFLICTしたファイルには、以下のような記述が入ります。
<<<<<<< HEAD
# 現在操作しているブランチのコード
=======
# マージされたブランチのコード
>>>>>>> ブランチ名
Before, Afterみたいなもので、どっちが正解のコードかを判定してコミットする必要があります。
main側で作業する場合は、マージされたブランチを有効にして、
作業している(developブランチなど)の場合は、HEADの方を有効にすることになると思います。
単純に、テキストファイルから、上記のいらない方と、
GITで書かれた添字を消してあげればいいだけです。
でも、慣れてないとこのCONFLIST文が結構怖いかもしれませんね。
一発コマンド発動
大量のファイルでのCONFLICTの場合は、次のコマンドで一括変更する事ができます。
HEAD(現在ブランチ)を有効にする場合
git diff --name-only --diff-filter=U | xargs -I{} git checkout --ours {}
別ブランチ(マージしてきたブランチ)を有効にする場合
git diff --name-only --diff-filter=U | xargs -I{} git checkout --theirs {}
解説
git checkout --ours ファイル名 → 現在ブランチの変更を採用
git checkout --theirs ファイル名 → 別ブランチの変更を採用
ファイル単体でも処理できますが、その場合はテキストを直接操作した方が早いかもしれません。
全ファイルを対象にする場合は、
コマンドのパイプ処理でxargsを使う事で、処理できます。
あとがき
GITのCONFLICTが出た時に、チーム開発であれば、犯人探しが始まる事がありますが、1人の場合は、原因が自分しかいないので、やるせない気持ちになってしまいます。
どちらにしても、CONFLISTは、GITの親切機能と理解するようにしましょう。
そのままデプロイしようものなら・・・そっちの方が怖いですよね。
ちゃんと修復方法と、CONFLICTを出しにくい、作業工程のルール化を見直す事が重要です。
このCONFLICTを修正する作業が好きという、変態エンジニアもいるみたいなので、それはそれで興味深いですけどね。
あ、あと、コンフリクトを修正するためのツールみたいなものもあるみたいなので、調べてみると怖く無くなるかも。
0 件のコメント:
コメントを投稿