Sourcetreeでマージしよう

概要

最終更新日:2020/02/12

この記事ではマージについての説明とSourcetreeを使用した方法を書いています。

マージとは

マージとは他の環境の更新内容を自分の環境に反映することです。
マージによってリモートリポジトリや別ブランチの内容が反映できるので、
環境の共有が可能となります。

git_0123

マージのタイミング

マージを行えるタイミングは「自分の環境が別の環境よりも古くなった時」です。
その為、マージの対象はリモートリポジトリになることが多いです。
リモートリポジトリは様々な人が更新を行うので、どんどん新しくなります。
その内容を自分の開発環境であるローカルリポジトリ内に反映しないと
古い環境で作業していくことになります。
そうならないように、マージを行って最新の環境をローカルリポジトリに反映して
自分の環境も最新の状態で作業を行うようにします。

実戦で使用する機能

ブランチをマージする場合、ローカルリポジトリ内で完結させることができますが、
リモートリポジトリでは内容を取得する必要があります。
その為の機能が「フェッチ」か「プル」です。

フェッチはリモートリポジトリの内容をローカルリポジトリに取得する機能なので、
取得した内容をマージして取り込むことができます。

プルはフェッチとマージを連続して行う機能です。
まず、フェッチしてリモートリポジトリの内容を取得し、
その後、マージを行ってローカルリポジトリに反映します。

実践

以下の手順でマージを行います。
プルを使用すると自動でマージも行われるので、
フェッチを行ってからマージを行う手順です。
  1. リポジトリを用意してファイルを追加
  2. ローカルリポジトリをもう一つ用意する
  3. B側:ファイルを変更する
  4. A側:フェッチする
  5. A側:マージする
  6. A側:マージ完了

リポジトリを用意してファイルを追加

マージ練習用のリポジトリを用意してテキストファイルを追加して
適当な文章を入力後、プッシュしてください。

git_0112

ローカルリポジトリをもう一つ用意する

マージさせるために、もう一つローカルリポジトリを作成します。
リモートリポジトリが同じローカルリポジトリの作成はリポジトリをクローンする際に
リポジトリ名とフォルダの作成場所を変えれば作れます。

git_0113

図では「MergeBranchA」「MergeBranchB」と名付けていますが
これ以降は省略して「A」と「B」と書きます。

B側:ファイルを変更する

Bリポジトリのファイルの内容を変更してプッシュします。

git_0114

A側:フェッチする

Aリポジトリでフェッチを行い最新のリモートリポジトリの内容を取得します。

git_0115

フェッチ後のログを見ると、originの位置が移動しているので、
ローカルとリモートで差が生じているのが分かります。

A側:マージする

Sourectreeでマージをする方法は2種類あります。
  • マージアイコンから行う
  • コミットログから行う

マージアイコンから行う

上段メニューのマージアイコンを使用する方法を説明します。
まずは、メニューのアイコンをクリックしてください。

git_0116

クリックすると新しいウィンドウが表示されるので、
そのウィンドウ内で以下の手順を行ってください。

git_0117
  1. マージするコミットを選択
  2. 「マージ後そのままコミットにチェックを入れる」
  3. ①と②の設定が問題なければOKクリック
オプションについては別の記事で説明を行います。
今回は②のオプションを設定してマージ後そのままコミットを行ってください。

コミットログから行う

コミットログからマージする場合は以下の手順でマージを開始します。
  1. マージするコミットを右クリック
  2. メニューの中のマージをクリック
git_0118

クリック後、新しいウィンドウが表示されるので、「OK」ボタンをクリックして下さい。

git_0119

マージ完了

マージするとログのorigin/masterとmasterが同じ位置がになっているので
無事に反映が完了したことが分かります。

git_0120

マージの結果

マージの実行結果は四種類用意されています。
Sourcetree上でもよく表示される内容もあるので、
それぞれの結果について説明します。
  • Already up-to-date
  • Fast Forward
  • Auto Merge
  • Conflict

Already up-to-date

Already up-to-dateはマージの結果、二つの環境に誤差が
無かった場合に設定される結果です。

Fast Forward

Fast Forwardは片方の環境だけ更新されていて、その環境をそのまま反映したら
正しく動作すると判断した場合に設定される結果です。

git_0121

今回の実践はFastForwardによるマージを行っています。
実践ではB側のリポジトリでファイルを変更し、リポジトリAでマージしていますが、
その間、リポジトリAではコミットを行っていないので、環境の変化はありません。
その為、FastForwardの結果条件に当てはまり、最新であるリモートの内容を
そのまま反映しています。

Auto Merge

Auto Mergeは両方の環境で変更は行われているが、同じ個所の変更がないので、
Git側で自動でマージ可能と判断された場合に設定される結果です。

git_0122

上の図ではリポジトリBはファイルBを修正してプッシュ、
リポジトリAはファイルAを変更してコミットしています。
その後、リポジトリAがリモートからプルしていますが、問題なくマージは成功します。
これはAutoMergeの条件である「両方の環境で変更はあるが、同じ個所ではない」という
内容に当てはまっているためです。

Conflict

Conflictは作業中の内容と反映する内容が衝突した場合に設定される結果です。
この結果の内容は説明が長くなってしまうこともあり、別記事にしています。

まとめ


  • マージは別の環境の変更を自分の環境に反映すること
  • マージは別の環境が更新されて自分の環境が古くなった時に行う
  • マージの結果は4種類ある
  • Already up-to-dateは環境の内容に差異がなかったため、更新していない
  • Fast Forwardは片方だけ更新が行われているので、
    最新をそのまま反映する
  • Auto Mergeはどちらも変更があるが、更新箇所が重複していないので、
    自動で差分を判断してマージする
  • Conflictは修正箇所が重複しているため、マージを中断する