Git/GitHub/SourceTreeの使い方

# Git/GitHub/SourceTreeの使い方
Git/GitHub/SourceTreeの使い方について、学んだことをまとめております。

## Git（ギット）
### Gitとは
プログラムのソースコードなどの変更履歴を記録・追跡するための分散型バージョン管理システムである。Linuxカーネルのソースコード管理に用いるためにリーナス・トーバルズによって開発され、それ以降ほかの多くのプロジェクトで採用されている。

各ユーザのワーキングディレクトリに、全履歴を含んだリポジトリの完全な複製が作られる。したがって、ネットワークにアクセスできないなどの理由で中心リポジトリにアクセスできない環境でも、履歴の調査や変更の記録といったほとんどの作業を行うことができる。これが「分散型」と呼ばれる理由である。

※[参照元：Wiki](https://ja.wikipedia.org/wiki/Git)

つまり、 __『プログラムの編集や変更履歴を管理できる』__ のがGit。

## GitHub（ギットハブ）
### GitHubとは
Gitの仕組みを利用して、世界中の人々が自分の作品(プログラムコードやデザインデータなど)を保存、公開することができるようにしたウェブサービス。

### 用語・機能
1. Repository（リポジトリ）
    - ___『リモートリポジトリ』___ と ___『ローカルリポジトリ』___（以降、リモート、ローカル）の2つに分類される。
    - リモートは、Web上に存在するリポジトリのことであり、Github・SourceTreeを用いて、 ___共有することが可能なリポジトリ___ である。
    - ローカルは、自分のPC内に存在するリポジトリのことであり、例え作成元がリモートであったとしても ___変更が自動で反映されることはない___ 。
1. Commit（コミット）
    - 各リポジトリの変更の履歴のことであり、『前回の履歴』（以降、親コミット）からの変更がどうなったかを記録している。
    - すべてのコミットがハッシュ（Hash）を持っており、固有の値であるためハッシュからコミットを判別することが可能である。また、初めのコミットを除いたすべてのコミットが親コミットのハッシュも保持していることで、一連のコミットとして扱うことができる。
1. Git Bash（ギット バッシュ）
    - LinuxコマンドでGitを扱うターミナル。 ___コマンドプロンプト___ とは別物なので注意が必要。
    - ターミナルの主要なコマンド一覧

    ```sh
    $ ls                listの略。カレントディレクトリの中身を表示する。
    $ mkdir             make directoryの略。ディレクトリ（フォルダ）を作成する。
    $ cd /c/git         change directoryの略。
                        指定したディレクトリにカレントディレクトリを移動する。
                        例では、C¥Gitへ移動。
                        ※ ~（チルダ）はユーザーディレクトリを表す。
    $ git init          カレントディレクトリに『.git』ディレクトリを作成する。
                        カレントディレクトリ以下をGitの監視下とする。
    $ touch test.txt   カレントディレクトリにtest.txtを作成する。
                        ※本来は、作成するコマンドではない。
    ```

## SourceTree（ソースツリー）
### SourceTreeとは
GitHubで作成したリポジトリに対応させることで、ローカルとリモートの共有などを補助してくれる。

### リモートとの紐づけ
紐づける際は、GitHubからリポジトリのアドレスを用いる。
![sourcetree_how_to_use_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525820/f1058eb5-aa93-c0c6-c9a0-4d00f4d6e5de.png)

1. Clone（クローン）
    - リモートをローカルに紐づけした状態でコピーを行う。
1. Add（アド）
    - リモートとローカル紐づける。

        ※ ___更新は行われない。___

違いに注意して使い分けることが必要。

### コミットする
『作業ツリーのファイル』に表示されている変更を、 ___『indexにステージする』___ ことでローカルでコミットできる。この時点では、まだリモートに変化はない。
![sourcetree_how_to_use_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525820/f791bebe-616a-3916-41e1-727725a597d9.png)

コミットにコメントを残すこともできるので、変更がわかりやすいコメントを残しておく。
![sourcetree_how_to_use_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525820/2c312853-1e94-4a22-558b-0378658832b3.png)

### 同期
![sourcetree_how_to_use_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525820/9d67ae73-d0d4-2255-7a86-448f8ce0e4f2.png)

1. プッシュ
    - ローカルのコミットをリモートに反映する。

        ※ただし、リモートが別のプッシュを受けている場合は、リモートのコミットをローカルに反映した後にマージを行ってからプッシュをする必要がある。
1. フェッチ
    - ローカルとリモートに差分がある場合、リモートのコミットとの差分を参照することができる。

        ※ ___ローカルの更新は行われないので注意。___
1. プル
    - ローカルにリモートの差分を反映させる。

        ※ ___自身がローカルで行ったコミットはそのまま残る。___ このとき、リモートのコミットと衝突してしまうと、Conflict（コンフリクト）が発生する。コンフリクトは、手動で解消することが必要で、 ___必ず確認を取り、指示を仰ぐこと。___

### ブランチ/マージ
![sourcetree_how_to_use_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525820/3958cc9d-080f-b655-1fe4-25ddb4fc1b70.png)

1. ブランチ
    - 現在の位置を表す。
    - 新たにブランチを作成することで、枝分かれを発生させることができる。

        ※ ___origin/masterはリモートを表す。___
1. マージ
    - 枝分かれしたブランチを合流させる。

        ※ ___各ブランチでマージを行う必要があるので注意が必要。___
AでBとマージしたならば、BでAとマージして、初めてAとBはマージする。