ITTL勉強会3日目の記事です。
登場人物
ぼく 福岡出身。最近Angularを完全に理解した。マカー。
Nさん 素晴らしい先輩。マカー。
スタバにて
ぼく「Gitまた変なエラーが出たばい」
ぼく「こういう場合は、変更箇所をリセットして…」
N「なんで手でファイル管理をしているんだ?Gitの使い方は理解できているか?」
ぼく「Gitはソースコードの物置ばい!」
N「ばっかもーん!!!」
正しいGitの使い方
Gitは、ファイル(ソースコード含む)の「差分」を管理するツールです。
プルやチェックアウトができない場合の原因は大体2パターンです。
変更したファイルをコミットしないことによるエラー
ぼく「なんかリモートリポジトリからプルできるって通知が来たからプルしたらエラー起きましたばい!助けてください!」
N「どれどれ見せてみろ…って変更したファイルコミットしてないじゃないか。これじゃエラー出すよ」
ぼく「でもエラー出さない時もあるとよ?」
N「それはリモートリポジトリにプッシュされているものに、触ったファイルの変更がなかっただけだ」
ぼく「はえ〜」
対処法
- 変更したファイルをコミットする
- 変更したファイルをスタッシュする
手法1から説明していきます。差分がわからずエラーを起こしているのであれば、Gitに差分を理解して貰えば完結です。つまりファイルをコミットしましょう。
手法2は、例えばまだ書きかけ途中のファイルがエラーを起こした場合などに利用します。変更したファイルを一度別領域に退避し、直前までのローカルリポジトリの状態にしておくことで、エラーを解消するというわけです。
変更した行とリモートリポジトリがバージョン管理できず衝突
ぼく「パイセン!スタッシュして、プルして、元に戻したらまたコンフリクトしたっちゃけど!」
※手法1のコミットしてプルしても起こり得ます
N「これは本当にコンフリクトしているな」
N「リモートリポジトリとローカルリポジトリのバージョンが解決しない場合、つまり変更した行がリモートが正しいのかローカルが正しいのかわからない状態にいる」
ぼく「どうしたら良かですか?」
N「やり方は3つある」
対処法
- ファイル全てが自分の変更を正とする
- ファイル全てが相手の変更を正とする
- 手マージ
1、2は言葉のままで、コンフリクトを起こしているファイルに対し、リモートリポジトリを最新のバージョンとして扱うのか、ローカルリポジトリにコミットしてある差分を最新のバージョンとして扱うのかというだけです。こちらで良い場合はこちらで良いのですが、世の中そんなわけもなく、「この行だけは自分、次の行は相手」や「両方の変更を取り込まなければならない」という場合が多々あります。
その場合は手法3の手でマージを行う必要があります。
マージを行う際に色々ツールがありますが、ここではVisual Studio Code(以下VS Code)を利用し、解説を行います。
VS Codeでコンフリクトが起きているファイルを開いてください。そうするとコンフリクトが起きている箇所に色が付いていると思います。それぞれ対応したいアクションを押下し、色が全て消えるとコンフリクト解消です。
ぼく「もうこれでコンフリクト怖くないばい」
N「しっかりと使いこなせば、コンフリクトが起きるたびにいちいちディレクトリを見に行かなくてよくなる」
N「VS CodeのGitLensを導入すれば、行を選択したときに誰がいじったのかもGitの情報から表示してくれて便利だ」
ぼく「はえーサンガツ」
ぼく「git commit -m “変更したとよ” 」
N「ばっかもーん!!!」
登場人物は全て架空のものであり、実在する人物、団体、会社等とは全く関係ありません。