【Git】【SourceTree】SourceTree操作⇔コマンド操作   自分用チートシート

#はじめに
本記事はGit操作を行う際に、SourceTreeではどういった操作になってコマンド操作ではどういった操作になるかまとめたものです。
<font color="gray">とりあえず必要になったものをまとめているので全操作ではありません</font>

#本記事の対象者

**・Gitを普段コマンド操作で使っているけれど、SourceTreeは分からない方**  
**・Gitを普段SourceTreeで使っているけれど、コマンド操作は分からない方**

#背景

現在の現場で、Gitを運用しているのですが**コマンドライン派**と、**SourceTree派が混在**していました。

その際にSourceTreeを使うメンバーから、**「これってどうやればいいの？」**って聞かれた時に**「あれ？これってSourceTreeでどうやるの？」**と分からずその場は結局コマンド操作で解決してしまい、SourceTreeでの対処法が伝えられませんでした。

というのが契機で、両方の操作を覚えなければならぬと思い立ち、調べたのでまとめます。

#環境
本記事用に利用した環境です。

- OS : MacOSX HighSierra
- SourceTree : 3.2.1
- Git : 2.22.0 

#アウトライン
- <a href="#%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E5%8F%96%E5%BE%97git-clone">リモートリポジトリの取得(git clone)</a>
- <a href="#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B8%E3%83%B3%E3%82%B0%E3%81%AB%E7%A7%BB%E5%8B%95git-add">ファイルをステージングに移動(git add)</a>
- <a href="#%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88git-commit">コミット(git commit)</a>
- <a href="#%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AB%E5%8F%8D%E6%98%A0git-push">リモートリポジトリに反映(git push)</a>
- <a href="#%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E6%83%85%E5%A0%B1%E3%82%92%E5%8F%96%E5%BE%97git-fetch">リモートリポジトリの情報を取得(git fetch)</a>
- <a href="#%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E4%BF%AE%E6%AD%A3%E5%8F%96%E3%82%8A%E8%BE%BC%E3%81%BFgit-pull">リモートリポジトリの修正取り込み(git pull)</a>
- <a href="#%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%AE%E4%BD%9C%E6%88%90git-checkout--b">ブランチの作成(git checkout -b)</a>
- <a href="#%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%AE%E3%83%9E%E3%83%BC%E3%82%B8git-merge">ブランチのマージ(git merge)</a>


#各種操作

##リモートリポジトリの取得(git clone)
何をするにもまずはリポジトリを落としてこないと作業が始まりませぬ。

### SourceTree
**1. SourceTreeを起動して、メニューバー > 新規**
![スクリーンショット 2019-06-21 20.45.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/9df0ad6c-4a4e-748e-b6d5-f4422d64d44b.png)

**2. URLからクローン**
![スクリーンショット 2019-06-21 20.40.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/e285e48a-8fb6-f078-a971-7c4006385ba1.png)

**3. 情報を入力**
![スクリーンショット 2019-06-21 20.41.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/7e9697cd-b06a-7139-2f9c-341c42010f58.png)
**ソースURL** ... クローンするリモートリポジトリのURL
**保存先のパス** ... クローンするリモートリポジトリの保存先ディレクトリ
**名前** ... クローンしたリポジトリのSourceTree上で論理名

**4. クローン完了**
![スクリーンショット 2019-06-21 20.42.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/335aec2b-74d4-8ff1-1f06-4e148510487b.png)

### コマンド
```bash:リモートリポジトリの取得
git clone 【リモートリポジトリのURL】

# 例：テスト用のリモートリポジトリを取得
git clone https://github.com/hassoubeat/test_repo.git
```


##ファイルをステージングに移動(git add)
編集が完了したらコミットするファイルをステージングに移動するのだ！(ハム太郎)

### SourceTree
方法はいくつかあります。

**方法1. ステージングに未登録のファイルから、チェックを入れる**
![スクリーンショット 2019-06-21 21.38.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/596b1e50-fbb2-0e9b-38e3-e8145622fec5.png)
<font color="gray">ステージングに未登録のファイル横のチェックを入れると、全変更ファイルがステージングに移動するゾ</font>

**方法2. ファイルをステージングに移動 or Hunkをステージングに移動**
![スクリーンショット 2019-06-21 21.43.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/3ad75378-b5c7-ea61-38f0-debd67e97014.png)
<font color="gray">※ Hunk ... 変更した範囲という意味</font>


### コマンド
```bash:コミット対象の選択
git add 【コミット対象のファイル】

# 例：変更したtest.txtをadd
git add test.txt
```

##コミット(git commit)


### SourceTree
**1. 左上のコミットボタン**
![スクリーンショット 2019-06-21 22.04.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/1d672687-b5a2-a539-8751-e9dffbec6e0d.png)

**2. コミット対象の確認 > コミットメッセージ記述 > コミット**
![スクリーンショット 2019-06-21 22.05.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/5ac5c664-4287-1a08-925f-2e4ab626019d.png)



### コマンド
```bash:コミット
git commit
```

コマンド実行後、デフォルトのエディタが起動してコミットメッセージを記述できる。
![スクリーンショット 2019-06-21 22.25.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/90642f42-1672-2b4a-7c9e-1005447c69eb.png)
<font color="gray">vimエディタが起動しているので、:wqで保存するとそこまで書いていたコミットメッセージでコミットされる</font>
<br>

###※コマンドラインでGitの現在の状況確認(git status)

```bash:Gitの状況確認
git status
```
SourceTreeを使っているとGitの現在の状況が常に見えていますが、コマンドライン上ではコマンドを打たないと確認できません。

![スクリーンショット 2019-06-22 8.18.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/50101771-6634-3967-a139-f9870b3cc685.png)
<font color="gray">コマンドラインからコミットを行う前は`git status`を実行して、誤ったブランチにコミットしないか、想定したファイル以外ステージングに取り込まれていないか...といった確認をしよう
(私はぶっちゃけ見づらいと思うので、状況確認はSourceTreeやVScodeのGitから確認しています)</font>

##リモートリポジトリに反映(git push)

###SourceTree
**1. 左上のプッシュボタン**
![スクリーンショット 2019-06-21 22.39.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/b366113d-13b8-885b-11d2-5d9f7554a174.png)

**2. pushするブランチの選択**
![スクリーンショット 2019-06-21 22.39.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/cce01d71-1248-4da6-8119-1e08cfffdb66.png)

リモートリポジトリが最新に追いつく
![スクリーンショット 2019-06-21 22.40.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/fa5a6dfa-45fe-4033-d703-cd5003932b5d.png)


###コマンド
```bash:リモートリポジトリに反映
git push origin 【反映するリモートリポジトリ】

# 例：masterリポジトリに変更をpush
git push origin master
```

##リモートリポジトリの情報を取得(git fetch)
自分以外の誰かがリモートリポジトリにpushしているかもしれない...。
でもすぐpullで取得はしたくなくて、最新のコミットがあるかだけ確認したい...。
という時は

###SourceTree
**最新情報を取得したい場合は、左上の`フェッチ`**
![スクリーンショット 2019-06-22 8.57.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/0208df47-b2a7-43dc-c40a-efa8909ec477.png)
<font color="gray">SourceTreeはデフォルトの設定だと、裏で定期的に`リモートリポジトリから最新情報の取得(git fetch)`を行っています。
(上記画像も自動で最新情報を取得しており、`origin/master(リモート)`に最新のコミットがあったため、一つコミットが先に進んでいる)</font>


###コマンド
```bash:リモートリポジトリの情報を取得
git fetch
```

##リモートリポジトリの修正取り込み(git pull)
上述の`最新状況の取得(git fetch)`で最新の状況を取得・確認して、問題がなければ変更を取り込む。

###SourceTree
**1. 左上の`プル`**
![スクリーンショット 2019-06-22 9.14.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/20c3de82-d395-01c5-501e-5271d131272a.png)
<font color="gray">`git fetch`をしてリモートリポジトリに最新のコミットがあった場合は、プルボタンに更新があるコミットの数バッチが表示される</font>

**2. 取り込みのアレコレ確認**
![スクリーンショット 2019-06-22 9.15.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/d79ebac9-723f-f31f-2477-a7899ca9267b.png)
・**プルする元のリポジトリ**：最新を取ってくる対象のリポジトリ
・**プルするリモートのブランチ**：最新を取ってくる対象のブランチ
・**プルするローカルのブランチ**：上記のリポジトリ・ブランチから取得した最新を取り込むローカルブランチ

ここでは**origin/masterブランチから取得した最新**を、**ローカルのmasterブランチに取り込む**という内容になっている。

**オプション**の詳細は後述するが、**特に意図がなければすべてチェックを外した状態でのプルを推奨**する。


###コマンド
```bash:リモートリポジトリの変更の取り込み
git pull
```
引数なしで、現在のブランチに対応するリモートブランチから最新を取得する。


実は`git pull`は以下のコマンドをまとめただけのコマンド

```bash:pullコマンドの内容
git fetch
git merge origin/master
```
内容的には最新状況を取得した後、リモートブランチからmergeをしているだけ。

###pullのオプションについて
<a href="https://qiita.com/hassoubeat/items/578efde814cfd42d5e5c" target="_blank">【Git】SourceTreeのプルのオプションってなんなの？</a>

##ブランチの作成(git checkout -b)
###SourceTree
**1. 左上のブランチ**
![スクリーンショット 2019-06-22 13.28.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/01933392-cecf-e5bc-1e3f-ea3ce048f8c1.png)

**2. 作成するブランチの情報入力**
![スクリーンショット 2019-06-22 13.28.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/eb5c880c-7679-7832-f2bf-afd63af1e6a8.png)
**・新規ブランチ**...新しく作成するブランチの名前
**・コミット**...新しく作成するブランチを枝分かれ元となるコミットの選択
　  **作業コピーの親** ... 現在チェックアウトしているブランチの最新
　  **指定したコミット** ... 好きなコミットから選択
**・新規ブランチをチェックアウト** ... 作成したブランチに移動(チェックアウト)する

入力後、**「ブランチを作成」**

![スクリーンショット 2019-06-22 13.29.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/9fa72698-dd84-3453-951e-6a005f3f8ab3.png)
左のメニューのブランチでfeatureブランチが追加されており、太字になっていることからチェックアウトされている。

###コマンド
```bash:ブランチの作成
git checkout -b 【作成したいブランチ名】

#例：featureブランチを作成
git checkout -b feature
```
<font color="gray">現在のチェックアウトしているブランチを親としてブランチを作成する</font>

##ブランチの切り替え(git checkout)
###SourceTree
masterブランチからfeatureブランチに切り替える。

**1. 切り替え対象のブランチをダブルクリック**
![スクリーンショット 2019-06-22 17.34.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/a1fa82cf-855c-0882-1c14-70fbfc3a38a2.png)

**2. お わ り**
![スクリーンショット 2019-06-22 17.34.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/50532f2e-c3e4-6bd8-33be-744b9cb14d89.png)


###コマンド
```bash:ブランチの切り替え
git checkout 【切り替えたいブランチ名】

#例：featureブランチに切り替え
git checkout feature
```

##ローカルブランチの変更をリモートリポジトリに送信(git push)
###SourceTree
**1.左上の「プッシュ」**
![スクリーンショット 2019-06-26 21.32.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/0caa52c0-ed6b-2cd9-f416-c04737b72006.png)
新たに作成したfeatureブランチをリモートリポジトリに送信

**2.featureブランチにチェックを入れてOK**
![スクリーンショット 2019-06-26 21.32.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/ad951c55-b2a9-19e5-2c2e-c08bdccf7f73.png)

**3.リモートリポジトリにfeatureブランチが登録されている**
![スクリーンショット 2019-06-26 21.32.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/b4a83baa-2c14-5487-e5d2-ff2f4a66ec21.png)

次回以降も同様の手順で変更をリモートリポジトリに反映可能

###コマンド
```bash:
# 初回のみ
git push -u origin【ブランチ名】

# 次回移行
git push origin【ブランチ名】

# 例：featureブランチをリモートリポジトリに登録(初回のみ)
git push -u origin feature

# 例：featureブランチの変更をリモートリポジトリに登録(初回以降)
git push origin feature
```

##リモートブランチをローカルブランチに取得(git checkout -b)
###SourceTree
**1.リモートのfeatureブランチをローカルブランチに取得**
![スクリーンショット 2019-06-26 22.06.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/55695419-e716-8b2a-35f5-780202a295f1.png)

**2.新規ブランチの情報を設定してチェックアウト**
![スクリーンショット 2019-06-26 22.06.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/6974a48b-cb87-a25d-92e3-88f7acc4dcfc.png)
基本そのまま
**次のリモートブランチをチェックアウト**：取得したいリモートブランチを指定
**新規ローカルブランチ名**：ローカルブランチの名前を指定
**ローカルブランチでリモートブランチを追跡**：リモートブランチとローカルブランチの紐付け
(チェックを外すと、独立したローカルブランチとなるためリモートブランチに変更を反映するなどが行えない)

**3.ローカルブランチチェックアウト完了**
![スクリーンショット 2019-06-26 22.06.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/f3d031d1-e335-213b-eb32-f321a553706b.png)


###コマンド
```bash:
git checkout -b 【ローカルブランチ名】 【リモートリポジトリ名】

# 例：
git checkout -b feature origin/feature
```

##ブランチのマージ(git merge)
マージを取り込みたいブランチに移動して、merge

###SourceTree
**1. masterブランチにfeatureブランチの変更をマージする下準備**
![スクリーンショット 2019-06-26 22.41.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/cd34a055-cf43-48ec-ef09-0a55cdfd5a10.png)

**2. masterブランチに移動**
![スクリーンショット 2019-06-26 22.44.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/7d847ec4-c00d-e710-c0da-f5148bbcca67.png)

**3. マージの各種設定**
![スクリーンショット 2019-06-26 22.45.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/960b9f7f-79a9-357c-438e-2cd22d8d2d1f.png)

**4. マージ完了**
![スクリーンショット 2019-06-26 22.46.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312085/1cea15d3-3a67-0918-dd45-d5c0aded235b.png)


###コマンド
```bash:
git merge 【マージ対象のブランチ】

# 例：masterブランチにfeatureブランチをマージ
git checkout master
git merge feature
```

<br>
<br>

また必要なものがでたら追加していきます。

記載内容に誤りがあったら、ご指摘いただけると助かります。