SourceTreeから始めるGit

SourceTreeというガッツリしたGUIクライアントができてから、「Gitはコマンド打つべし」という感じでもなくなりつつあるかなと感じている(現に、TortoiseSVNを使っているときにSVNのコマンドを意識したことはなかった)。

そんなわけで、ここではGitの詳しい説明は一切はしょりSourceTreeの操作にのみ焦点を当てて解説を行う。ただ、コマンドにも興味あるという方に備え、コマンドも併記しておく。

## インストール
こちらにアクセスしてインストール。
https://www.atlassian.com/ja/software/sourcetree/overview

なお、以下の説明ではWindows版を使用。

## 初期設定
ツール>オプションから各種設定が可能。見ておくべき箇所は以下3点。

* 一般(git config)
 ユーザー名/メールアドレスは必ず設定しておく。インストール時に設定を求められると思うので特段設定することはないかも。
  
* 差分(git config difftool/mergetool)
 特にMergeはツールがあったほうが便利なので設定しておく。
![0.setting.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/524f6e3e-cc06-8ec2-a84e-ae82f1b89606.png)

 WinMergeを使うのも良いがマージで使う際は小難しいオプションが必要なので、ここは推奨されている[P4Merge Visual Merge Tool](http://www.perforce.com/product/components/perforce-clients-tools#visual-tools)をインストールしておくと便利。
※インストール時はP4Merge Visual Merge Tool以外×にする。

* ネットワーク(git config http.proxy)
プロキシ配下で使用する場合、プロキシの設定をしておく。

## 基本操作

### リポジトリの作成(git init / git clone)
まずは、リポジトリの作成を行う。
![1.cloneRepository.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/c7d6eb80-5368-a2e9-e892-2356c5c07172.png)

ローカルで作成するか、リモートにあるリポジトリを取ってくるかの二択になる。
ここは迷うところはそんなにないはず。

### 変更管理(git add / git commit / git push)
Gitでの変更は、コミットという単位で管理される。
このコミットを行う際は、「どの変更をコミットに入れるか選択する」「実際にコミットする」という二段階の手順を踏む。

SourceTreeでは図の左下にある矢印ボタンで、コミット対象にしたり外したりすることができる。
![2.filechange.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/dbebf8df-f84f-b6c9-15c7-b9dbf8b3b941.png)

変更対象は行単位でも選択可能なため、同じファイル内の変更を別々のコミットに分けることもできる。
![2-1.filechange.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/6ed2263e-3066-f7d5-abba-bbcab8624f39.png)

変更対象を選んだら、コミットを実行する。
![3.commit.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/f9c725d6-d965-ed5b-a429-85f66a8a3af6.png)

コミットはあくまでローカルで行われるため、リモートでバージョン管理を行っている場合はこのコミットをサーバーに送る必要がある(push)。

SourceTreeでは、チェックを入れることでコミットと同時にpushをすることが可能。
pushを別に行いたい場合は、メニューバーのPushから行うことができる。

## ブランチでの作業
Gitではブランチを利用して作業するのが一般的だ。
通常はmasterというメインのブランチを主軸に、各種変更はそれをコピーしたブランチで一旦行い、テストが完了したらmasterに統合(merge)するという手順を取る。

ここでは、ブランチの作成⇒masterへの統合までの作業をSourceTreeで行ってみる。

### ブランチの作成/チェックアウト(git branch / git checkout)
ブランチは、リポジトリ同様ローカルで新規に作成するかリモートリポジトリにすでにあるものを取ってくるかする。
ローカルでブランチを作成する場合は右クリックから作成可能。
リモートにブランチが既にある場合は、Checkoutから、Checkout new Branchで取ってくることができる。

![4.checkout.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/866337e6-3e03-096f-7381-e105a39d4b69.png)

なお、[Stash](https://www.atlassian.com/ja/software/stash)というAtlassian純正ツールを使用している場合は以下のようにすることができる。

[Stash](https://www.atlassian.com/ja/software/stash)上で、Check out in SourceTreeというまんまのメニューを選択。
![a1.checkoutBranch.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/677c778a-1f85-16eb-05c6-73597c3f1126.png)

対象のリポジトリからのcloneが初めての場合、Clone Newを選択。
![a2.cloneTarget.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/c97d89d5-152d-a929-a732-b75c68f4ee49.png)

既に他のブランチ(master含む)がローカルにある場合Checkout Existingを選択。

![a2.cloneTargetExist.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/4501f76b-eb46-fa6c-09f0-cde293dd194e.png)

ブランチの取得が終了すると、以下のように表示される。
現在いるブランチは太字で表示され、他のブランチをダブルクリックすることでブランチを切り替えることができえる(これをチェックアウトと呼ぶ)。ブランチを切り替えるとローカルのファイルセットが切り替わっていることが確認できるだろう。

![4-2.checkout.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/f0e16a13-4a79-5d95-16b2-e18273583ca4.png)

なお、SourceTreeではブランチ名に/を入れることでフォルダのように管理することが可能。

### masterの変更を取りこむ(git merge)
自分のブランチ上で作業をしている間にmaster側が変更される、なんてことは往々にしてある。
そのため、特にこれからレビューしてもらうなんて時には必ずmasterの変更を自分のブランチにも反映しておく必要がある。

まず、ローカルのmasterを最新の状態にするため、fetchを行う。
![5-2.conflict.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/9724af97-1f81-6839-156b-b06cf0e43a30.png)

続いて、自分のブランチ上にいることを確認した上でmasterをmergeする。
![5-3.conflict.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/fe7ebf30-5ff4-6fb6-cd84-6d6f2f0dd5ce.png)

運よく成功すれば問題はないが、変更のバッティング(コンフリクト)が発生することもある。
そうした場合はコンフリクトの修正に取り掛かる。
![5-5.conflict.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/cd7de8b7-e2cd-0099-2bd9-6edb8b8eede8.png)

先ほど設定したマージツールを使用する場合、Launch External Merge Toolを実行
![5-a.conflict.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/4eca107a-8fae-cfd4-1add-6a69576fa753.png)

こちらがP4Mergeの画面。左右に各ブランチの変更・中央にmasterのHEAD?、画面最下部がマージ結果となっており、ここを編集して保存が可能。マージ専用ツールだけあって非常にわかりやすい構成。
![5-b.conflict.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/e1446256-af44-3b0f-0ca2-90eaee10eff0.png)

なお、ローカル優先/相手優先という一括した操作ならSourceTree上から可能。
![5-6.conflict.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/f3af668e-d740-3864-dd69-0cfb9605bbca.png)

コンフリクトの修正が完了したら、コミットを行う。そうすると、作業中のブランチにmasterの変更が統合された感じで表示される。
![5-7.conflict.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/0b14fcf9-3c81-6073-89ef-0b98a2ac26ef.png)

自身の変更、masterの変更、何れも完了したらpushを行いリモートリポジトリの更新を行っておく。

### Pull Requestの作成/マージ
GitHubやBitbucketでのPull Requestを見ても食傷気味と思うので、ここでは[Stash](https://www.atlassian.com/ja/software/stash)上での作業を紹介する。

まずはPull Requestを作成。SourceとDistinationをきちんと確認しておく。
![8-1.pullrequest.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/04498bcf-8bad-09ff-6f85-02b49ce3779a.png)

作成されたPull Requestはこんな感じになる。
![8-2.pullrequest.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/b7d3f896-9e73-a275-56be-65faf812f9b3.png)

Mergeは右上のボタンから行う。なお、Declineを押せば削除になる。
※繰り返すが、ここのマージでコンフリクトが発生するとややこしくなるので、必ずローカルでmasterのmergeを行っておくこと(警告が出ると思われるが)。
![8-3.pullrequest.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/c78ed222-8639-3881-5ae4-fdfed146a183.png)

なお、リポジトリの設定で「誰か一人が承認するまでMergeできない」という風にすることも可能。
![8-4.pullrequest.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/8b1279df-348b-6ca0-ebe4-14375fb93b0f.png)

マージされると、下記のようにブランチの変更がmasterに取り込まれる。

![9.pullLocal.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/b1c9c9d5-24de-767a-2c07-4bb06448f868.png)

## その他操作

### サブモジュール
サブモジュールについても、SourceTreeで簡単に作成することができる。

右クリックからAdd Submodule
![submodule1.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/0f94bc86-27bc-fb9a-656d-3277053808df.png)

サブモジュールの参照先を追加
![submodule2.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/b2f14895-2fd7-2043-8af6-bbe3217db591.png)

サブモジュールが追加される。
![submodule3.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/645c921a-fea0-66bd-3a41-9667b9f23dc9.png)

追加されたサブモジュールをダブルクリックすると、サブモジュール側のコミットログが確認できる。サブモジュール内のファイルを変更した場合も、こちらで変更を確認可能。通常のリポジトリ同様の操作を行うことができる。
![submodule4.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/86e72bb5-deaf-ad35-c328-f465ca055dd0.png)

なお、サブモジュールとは他リポジトリの特定コミットへの参照であるため、ローカルでサブモジュールを修正しコミットまで行うと、参照先のコミット番号が変わったという変更が本体側で発生する。これはサブモジュール側の変更とは別にコミットする必要がある。
(つまり、参照しているサブモジュールの変更を行う場合は、サブモジュール側の変更と本体での参照先の変更の2つが必要)。

![submodule5.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/7891d872-5b4d-fbb1-664f-55347af746fb.png)


以上が、Source Treeを利用した操作となる。