コミット、プッシュで更新できるようになったら「プル」でデータをダウンロードします。
チーム開発では、大抵、いくつかのプロジェクトが並行して動いているのが一般的。
そこで「Git」の差分を補う機能で、こまめにファイルの最新情報を取得する必要があります。
似たようなもので「クローン」がありますが、こちらは初回にだけ使う機能。
変更履歴を含む全データを複製するためのコマンドなので、変更内容(差分)を随時取り込む「プル」とは使い方が違います。
途中「競合」が発生することもありますが、通知に従って「マージ」を行えば解消できますよ。
はじめに
下表は本記事に出てくる専門用語になります。
用語 | 意味 |
---|---|
プル | データをダウンロード |
マージ | データを統合 |
事前に「Git」をインストールしてから作業に入るようにしてください。
メニュー操作できる「TortoiseGit」を使って視覚的に確認しながら進めていきます。
リモートリポジトリには「GitHub」を利用しています。こちらは任意のものでOK。
データを作成
まずは、ローカルリポジトリとリモートリポジトリを「1つずつ」用意します。
repository-a // リポジトリA repository-r // リモートリポジトリ
リモートリポジトリとローカルリポジトリの作成方法は、以下をご覧ください。
次に以下内容で「リポジトリA」にファイルを保存し、リモートリポジトリにアップ。
ファイル名は任意ですが、ここではdata.txt
とします。
サンプル用のデータです。
ファイルをコミット、プッシュで更新する方法は、以下をご覧ください。
最後にリモートリポジトリをクローンして「もう1つ」ローカルリポジトリを用意。
repository-b // リポジトリB
例と同じリポジトリ名にする場合は、フォルダをリネームしてください。
これで「リポジトリA」と「リポジトリB」に同じデータが入った状態になります。
データをプル(競合なし)
リモートリポジトリにあるデータを「リポジトリB」にプルしていきます。
右クリックメニューにある「TortoiseGit」から「プル」を選択。

リモートに「origin」、リモートブランチに「master」が入っていればOKです。

その他のオプションは変更せず「OK」をクリック。

ダイアログに青く成功と出ていれば、プル完了です。
成功 (0000 ms @ 2022/04/01 00:00:00)
この時点では、クローン以降変更が加えられていないため、差異は発生しません。
データを変更
一旦「リポジトリA」に戻って、テキストを任意の内容に変更します。
サンプル用のデータです。リポジトリAを変更します。
メッセージには「テキスト変更A」などと入力してコミット。プッシュまでしてください。

「リポジトリB」に移り、テキストを任意の内容に変更します。Aとは違う内容で。
サンプル用のデータです。リポジトリBを変更します。
メッセージには「テキスト変更B」などと入力してコミット。こちらはプッシュしません。

ここでリモートリポジトリと「リポジトリB」のファイル内容に差異ができました。
データをプル(競合あり)
今回のように、先にリモートリポジトリが更新され、且つ同じ行を変更していた場合は「競合」が発生します。
解決には、両方のデータを参照し、統合する「マージ」という作業を挟まなければなりません。
同じファイルでも、違う行を編集しているときは競合が起きません。
データをプルすると、競合していることを知らせるダイアログが表示されます。
マージ中、つまり別の(リモート)ブランチの変更をローカルブランチに統合しているときに、少なくとも1つのファイルで競合が発生しました。これは手動で解決する必要があります(つまり、あなたの変更を、別のブランチで変更されたファイルに統合する必要があります)。 すべてのファイルを解決した後、マージを完了するためにコミットを実行してください。 または、マージを中止したければ、戻りたいリビジョンへリセット(HARDオプションの)を行うか、コンテキストメニューで「マージの中止」を選択してください。
同じようにエラーが出ているダイアログを閉じます。
Auto-merging data.txt CONFLICT(content): Merge conflict in data.txt Automatic merge failed; fix conflicts and then commit the result. gitは正常に終了しませんでした(終了コード 1)(0000 ms @ 2022/04/01 00:00:00)
「リポジトリB」のファイルを開くと、以下のような表記が自動で追加されています。
=======
線より上がローカル、=======
線より下がリモートの内容です。
<<<<<<< HEAD サンプル用のデータです。リポジトリBを変更します。 ======= サンプル用のデータです。リポジトリAを変更します。 >>>>>>> abc1234
どちらかを選んで、追加したいテキストだけに編集し直してください。
サンプル用のデータです。リポジトリBを変更します。
コミットすると、再度ダイアログが表示されます。そのまま「OK」で閉じます。
あなたが作業しているコミットは特別なコミットです。これはマージコミットで、つまり、あなたの変更だけでなく、マージされたブランチの変更も含まれています。 何を意味するか分からないのであれば、ファイルのチェックを外してはいけません。 変更をマージすると、手動で解決する必要がある競合が発生する可能性があります(つまり、あなたの変更を、別のブランチで変更されたファイルに統合する必要があります)。
既にメッセージが入力されていますが、内容を削除して書き換えても問題ありません。
Merge branch 'master' of https://github.com/owner/repository-name # Conflicts: # data.txt
ここではあとで分かりやすいよう「テキスト競合解消」とコメントを入力。
オプションは変更せず、チェックを入れてコミットします。

「変更した項目」にある「追加した行」「削除した行」の数が変わりました。
ダイアログに青く成功と出ていれば、プル完了です。
成功 (0000 ms @ 2022/04/01 00:00:00)
最後にプッシュし、リモートリポジトリの内容を確認してください。

のところをクリックすると、これまでの流れを見ることができますよ。4 commits

おわりに
リモートリポジトリのデータを「競合あり」と「競合なし」の場合に分けて取得しました。
プルの前、修正の後とでダイアログが表示されるので、比較的対処しやすいかと思います。
メッセージに従って、どちらかを採用、あるいはどちらも反映するなど、状況に応じて編集してみてください。
余談になりますが、競合中に「プル」せずに「プッシュ」したときにも同じことが起こります。
こちらは単純にエラーになるだけなので判断が難しいところですが、
手順通りに進めても「プッシュ」できないときは、競合していないかを確認してみてください。