2024年1月14日日曜日

(PC) gitHubの話。自分より先に別な更新が入ってしまった(コンフリクト)時について!

昨日の記事で、個人でもプログラムソースやドキュメントのバージョン管理をgitHubでもってする話をさせて頂きました。

今回は、そのバージョン管理の真骨頂というか、起きると場合によってはパニクる「コンフリクト(競合)」についての記事です。


今のPCで変更中のファイルなのに、他のPCで別の変更入れてしまった!!(コンフリクト)

私のように、3台のPCの間で、気ままに同じファイルを更新するような事をやってるといつか遭遇するのが、「今のPCで変更中のファイルなのに、先に他のPCで変更しちゃった!!」というバッティングです。

承知の上でやってるならともかく、完全に忘れてバリバリの違う変更とかやっちゃうと、場合によってはパニクるヤツです。

こういうのを、コンフリクト(競合)と言いますが、これが起きた時こそが、バージョン管理システムを使っている意味が濃ゆくなるというか、真骨頂と言えるかも知れません。


↑実は今朝、このバッティングをやらかしてしまいました。

ROG FLOW Z13でファイル編集して、gitHubに反映(プッシュ/コミット)したのですが、その前にSurface Go2で別の修正をやってる途中だというのをすっかり忘れてました。

Surface Go2を起動して、gitHub Desktopアプリを開くと...(画面はSurface Go2になります)


↑しまった!!やらかした!!自分(Surface Go2)で編集中のファイルよりも、もっと新しいファイルがgitHubのリポジトリ(ファイルや更新履歴を管理するオンラインの基地)に反映されてるじゃないかー。

こんな時にどうする?!というのが、今回の記事のテーマとなります。


まずは「スタッシュ」という機能を使います!!スタッシュあれば怖くない?!

こんな時は、慌てず騒がず、救済措置があります。

それは「スタッシュ機能」です。

これは何かというと、とりあえず自分のやった変更を「別の場所に退避/セーブ」しておく!!というありがたい機能です。

↑難しい事は何もなく(ここが重要)、スタッシュするか? と質問して来るので、「はい」と答えれば自分が変更したファイルを一発で別の場所に退避してくれます。


↑すると、しのごの言わずに、まずは自分のローカルにあるファイルが、リポジトリに反映されていた「みんなと共通の(正しい)状態」になります。

ここで、まずは状況がひとまず整理されるので、わやくちゃパニックの第一段階が落ち着く感じですね。

次に、じゃあ自分がやってた変更はどこに行ったんだ?!という段階になるわけですが...


↑View stashというボタンを押すと、コンフリクト(競合)したファイルと、どのようにコンフリクトしているのか?という状態が見えるように表示されます!!


↑このように、ただコンフリクトしてるよ終わり、ではなくて、どこがコンフリクトしちゃってるのか?というのも分かりやすく表示してくれるのが、バージョン管理システム(gitHubはその一種)の腕の見せどころです。

このあたりの見せ方の違いで、色々あるバージョン管理システムに、それぞれ人によって好き嫌いが出てくるポイントでもありますね。

コンフリクトしているのは分かったが、その変更はやっぱり必要なので残したい(Restore)か、もう破棄してなかった事にする(Discard)かを選択します。

問題は、やっぱり必要なので残したい(Restore)を選んだ時ですね...そりゃそうだ。


↑コンフリクトしてしまったら、どのように解決するのかは個人の判断になりますので、自動でどうこうではなくて手作業での解決を自力でやる必要があります。

将来的には、AIが全部見てて全自動になるかも知れませんが、今は、人力での解決が必要です。

いきなり外側からエクスプローラーで当該ファイルを開いても何にもならないので、gitHub Desktopの中から、当該ファイルを右クリックメニュー>Open in Visual Studio Codeで、コンフリクト情報付きのファイルを開きます。

いつも思うんですが、ついこの間生まれたばかりと思っていたVisual Studio Codeですが、あっという間に定番エディタになりましたねー。


↑Visual Studio Codeを、gitHub Desktopから開くと、コンフリクトしている部分が「マーカー」としてテキストにて提示されていますので、思ったように修正して行けばOKです。

<<<<<<< Updated upstream というマーカーごと緑色にシェードされている部分が、リポジトリ側の内容です。

>>>>>>> Stashed changes というマーカーごと青色にシェードされている部分が、スタッシュされた側の内容です。

リポジトリ側をやめたければ、そっちをマーカーごと削除し、逆ならスタッシュ側をマーカーごと削除すれば良いです。


↑スタッシュした内容を修正し、コンフリクトが無くなると、このように「No content changes found」と表示されて、綺麗になります!!