【 更新 】おすすめ記事はこちら

【Git】プルでデータを取得し競合をマージする|TortoiseGit

コミット、プッシュで更新できるようになったら「プル」でデータをダウンロードします。

チーム開発では、大抵、いくつかのプロジェクトが並行して動いているのが一般的。

そこで「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のところをクリックすると、これまでの流れを見ることができますよ。

コミットを確認

おわりに

リモートリポジトリのデータを「競合あり」と「競合なし」の場合に分けて取得しました。

プルの前、修正の後とでダイアログが表示されるので、比較的対処しやすいかと思います。

メッセージに従って、どちらかを採用、あるいはどちらも反映するなど、状況に応じて編集してみてください。

余談になりますが、競合中に「プル」せずに「プッシュ」したときにも同じことが起こります

こちらは単純にエラーになるだけなので判断が難しいところですが、

手順通りに進めても「プッシュ」できないときは、競合していないかを確認してみてください。