【GitHub】GitHub入門

# はじめに
(参考①) [【超入門】初心者のためのGitとGitHubの使い方]
(https://tech-blog.rakus.co.jp/entry/20200529/git)
↑本記事の執筆にあたって参考とした記事1
(参考②) [サル先生のGit入門]
(https://backlog.com/ja/git-tutorial/)
↑本記事の執筆にあたって参考とした記事2
(参考③) [よく使う基本Gitコマンド集【厳選19選】]
(https://www.sejuku.net/blog/5816)
↑本記事の執筆にあたって参考とした記事3
(参考④) [こっそり始めるGit／GitHub超入門]
(https://www.atmarkit.co.jp/ait/series/3190/)
↑本記事の執筆にあたって参考とした記事集
(参考⑤) [Git - Book]
(https://git-scm.com/book/ja/v2)
↑Gitを隅々まで理解したい方へ
(参考⑥) [Markdown記法 チートシート]
(https://qiita.com/Qiita/items/c686397e4a0f4f11683d)
↑Qiitaでの記事投稿を検討している方へ

本記事では、ブランチに関する説明は省略しています。
主に一人でプロジェクトを進める方向けの記事となっておりますので、複数人でファイルを編集する場合は[参考④](https://www.atmarkit.co.jp/ait/series/3190/)を参照してください。

# 目次
[GitHubとは](#githubとは)
[GitHubの仕組み](#githubの仕組み)
[「ターミナル」で使用するコマンド(初期設定)](#ターミナルで使用するコマンド初期設定)
[「ターミナル」で使用するコマンド(ワークツリー)](#ターミナルで使用するコマンドワークツリー)
[「ターミナル」で使用するコマンド(ワークツリー→インデックス)](#ターミナルで使用するコマンドワークツリーインデックス)
[「ターミナル」で使用するコマンド(インデックス→ローカル)](#ターミナルで使用するコマンドインデックスローカル)
[「ターミナル」で使用するコマンド(ローカル→リモート)](#ターミナルで使用するコマンドローカルリモート)
[「ターミナル」で使用するコマンド(リモート→ローカル)](#ターミナルで使用するコマンドリモートローカル)

# GitHub入門
## GitHubとは
**Git**(**バージョン管理**を行うためのシステム)のHubと書いて[**GitHub**(ギットハブ)](https://github.com/)と読みます。
その名の通り、Gitで人同士を繋ぐための**Webサービス**です。自身の書いたソースコードを世界中に公開することができます。
**バージョン管理の必要性**については、[参考①](https://tech-blog.rakus.co.jp/entry/20200529/git)を参照してください。

多くの記事で**「駆け出しエンジニアはGitHubを使え」**と推奨されていますが、これには以下のような理由があります。

> ・開発現場で一般に用いられている
　→ チーム開発では使えることが**必須**
・就職/転職活動の武器になる
　→ 自分自身の**ポートフォリオ**としてアピール材料にできる

なお、GitHubは**CUI**(Character User Interface; コマンドによる操作)で行いましょう。この理由は以下の通りです。

> ・OS(Windows/macOS(Linux))のコマンドを覚えられる
　→ cd, mkdirといった基本的な操作コマンドを使えるようになる
　→ 異なる開発環境でも**普遍的**に操作することができる
・**GUI**(Graphical User Interface; マウスやボタンによる操作)よりも難しい
　→ CUIで管理ファイルの流れを知っておくことで、GUIによるGitHub連携ツールの仕組みを理解できるようになる

## GitHubの仕組み
GitHubで管理するファイルの流れは、以下のようになります。
![スクリーンショット 2020-10-19 15.44.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673880/735ec2bb-6faa-64d6-83bb-8ab40c6bcb6f.png)
図における各要素の説明は、下記の通りです。

<details><summary>Repository(リポジトリ) ・・・ファイルやディレクトリ(フォルダ)の保管場所</summary>
Local Repository(ローカルリポジトリ) ・・・**ローカル環境(=自身のPC)**上に存在するリポジトリ。リモートリポジトリにアップロードする際は、**必ずローカルリポジトリ上にファイルをコミット**しておかなければならない。
Remote Repository(リモートリポジトリ) ・・・**GitHubのサーバー**上に存在するリポジトリ。</details>
<details><summary>Index/Stage(インデックス/ステージ) ・・・変更後ファイルの一時的な保管場所</summary></details>
<details><summary>Working Tree(ワークツリー) ・・・実際に作業するディレクトリ(フォルダ)</summary></details>
<details><summary>ファイルの移動コマンド(ローカル→リモート)</summary>
add(登録) ・・・ワークツリー上のファイルを**一時的に**インデックスに保存する
commit(コミット) ・・・インデックス上のファイルをローカルリポジトリに保存する
push(プッシュ) ・・・ローカルリポジトリ上のファイルをリモートリポジトリにアップロードする</details>
<details><summary>ファイルの移動コマンド(リモート→ローカル)</summary>
clone(クローン) ・・・リモートリポジトリにあってローカルリポジトリにないファイルをコピーする
pull(プル) ・・・リモートリポジトリ上にあるファイルの変更箇所をローカル上にダウンロード(fetch)し、その変更をワークツリー上のファイルに適用(merge)する</details>
※横文字が並んで見づらい方は、上の図を参照していただければ結構です。


## 「ターミナル」で使用するコマンド(初期設定)
Macを使っている方は、「**ターミナル**」というプリインストールされたアプリを使用してGitHubでのバージョン管理を行います。
私が購入した「iMac (Retina 5K, 27-inch, 2020)」にはGitが標準でインストールされていましたが、お持ちのMacに標準搭載されていない場合は[こちら](https://www.sejuku.net/blog/5816)を参照してインストールしてみてください。

よく用いるGitコマンドは、以下の通りです。
ターミナルで使うコマンドについて詳しく知りたい方は、「**UNIXコマンド**」と検索してみてください。

### Gitのバージョン確認
まず、お使いのPCにGitがインストールされているのか確認しましょう。

```c
% git --version
git version 2.24.3 (Apple Git-128)  //筆者の環境
```

### ユーザ名・メールアドレスの設定
GitHubのアカウントをまだお持ちでない方は、[こちら](https://github.com/)から登録しましょう。

```c
% git config --global user.name "<ユーザ名>"
% git config --global user.email "<メールアドレス>"
```

### Gitに関する設定の確認
アカウント設定を終えたところで、入力したコマンドが反映されているか確認しましょう。
`user.name`と`user.email`が、自身のGitHubアカウントと一致しているか確認できたら、ここで設定は完了です。
ここで使用するコマンドについての説明は以下の通りです。

>-l (--list) ・・・ 一覧を表示
--global ・・・ **特定ユーザ**のconfig(設定情報)
--local ・・・ **特定リポジトリ**のconfig(デフォルト)

```c
% git config -l   // --localの情報を表示
% git config --global -l  // --globalの情報を表示
```

### ディレクトリ(フォルダ)の作成
ディレクトリはFinderから作成することができますが、ターミナルからも作成できます。
また、任意の場所にディレクトリを作成したい場合は、`cd`コマンドを使用してディレクトリを作成したい場所まで移動してからフォルダを作成します。(Finderでディレクトリを作成するときも自然とこの工程を踏んでいますよね？)
以下のコマンドを入力し、**任意の場所に作業用ディレクトリを作成**しましょう。
ここで使用するコマンドについての説明は以下の通りです。

>pwd (present working directory) ・・・ 現在のディレクトリを表示
cd (change directory) ・・・ 現在のディレクトリから移動
mkdir (make directory) ・・・ ディレクトリの作成

```c
% pwd   // 現在の場所を表示
% cd <移動するディレクトリのパス>  // 現在の場所から移動(絶対パス/相対パスどちらでも可)
% mkdir <作成するディレクトリ名>  // ディレクトリの確認
```

### ローカルリポジトリの作成
すでにアカウントの設定は終えていますが、Gitを使う前に**ローカルリポジトリを作成**する必要があります。
ここで使用するコマンドについての説明は以下の通りです。

>init (initialize) ・・・ ローカルリポジトリ(.gitディレクトリ)の作成

```c
% git init   // ローカルリポジトリ(.gitディレクトリ)の作成
```

### ディレクトリ内のファイルの確認
.gitファイルが作成されたかどうかを確認してみましょう。
任意のディレクトリに存在するファイル(.gitなどの隠しファイル含む)を確認するコマンドは以下の通りです。
ここで使用するコマンドについての説明は以下の通りです。

>-a (--all) ・・・ 隠しファイル含む全てのファイル

```c
% ls -a
```

### リモートリポジトリの登録
GitHubでリポジトリを作成したら、その情報(リモートリポジトリのURL)をPCに登録する必要があります。
以下コマンドを実行して、**PCにリモートリポジトリの情報を登録**しましょう。
なお、このコマンドによって**リモートリポジトリのURLが`origin`として登録**されるため、ローカルからリモートに`push`するときにURLを入力しなくて済むようになります。

```c
% git remote add origin <リモートリポジトリのURL>
```

### 登録済リモートリポジトリの確認
リモートリポジトリを登録したら、正常に登録されていることを以下のコマンドで確認してみましょう。
ここで使用するコマンドについての説明は以下の通りです。

>-v (verbose) ・・・ リモートリポジトリURLの表示

```c
% git remote -v
```

## 「ターミナル」で使用するコマンド(ワークツリー)
### 空ファイルの作成
試運転として`push`までの流れを掴みたい方は、以下コマンドを使用してテストファイルを作成しましょう。(実際に作成したファイルで流れを掴みたい方は、自身のファイルを作成すればOKです)

```c
% touch test.txt  // test.txtファイルの作成
````

### ファイルの内容を表示
ファイルの中身を閲覧したい方は、以下のコマンドを実行しましょう。
ここで使用するコマンドについての説明は以下の通りです。

>cat (catenate) ・・・ ファイルの連結・内容の表示

```c
% cat <ファイル名>
```

## 「ターミナル」で使用するコマンド(ワークツリー→インデックス)
### インデックスへのステージング
ファイルを作成・編集した際は、**コミットする前**にインデックスに一時保存しておきましょう。
インデックスを利用することで、コミットするファイルを**コミット前に確認**したり、**ファイルの変更点を後から見る**(追跡する)ことができます。

```c
% git add <ファイル名1> <ファイル名2> <ファイル名3> ...  // ファイル名を指定して登録
% git add .  // 全てのファイルを登録
```

### インデックスへの登録の確認
`add`した**ファイルが追跡されている**ことを確認したいときは、以下のコマンドを実行することで確認することができます。
`status`の一覧は以下の通りです。
>
1. 追跡済(tracked) ・・・ 既存ファイルやステージング済の新規ファイルなど<br>
　1-1. 未変更(unmodified) ・・・ 前回のコミットから変更が行われていない状態<br>
　1-2. 変更済(modified) ・・・ 前回のコミットから変更が行われた状態<br>
　1-3. ステージング済(staged) ・・・ 変更後ファイルのコミットの準備が行われた状態<br>
2. 未追跡(untracked) ・・・ 新規作成されたファイル

```c
% git status
```

## 「ターミナル」で使用するコマンド(インデックス→ローカル)
### ローカルリポジトリへのコミット
インデックスに登録したファイルをローカルリポジトリにコミットします。

```c
% git commit -m "<コミットメッセージ>"  // 初回のコミットは"first commit"等がおすすめ
```

### コミット履歴の確認
正常にコミットが行われたかどうかを、コミットの履歴から確認してみましょう。
ここで使用するコマンドについての説明は以下の通りです。

>-p (--patch) ・・・ 差分の内容を表示

```c
% git log   // コミットした「ユーザの情報」「時間」「コミットメッセージ」の確認
% git log -p  // 前回のコミットと比較した変更点を表示
```

## 「ターミナル」で使用するコマンド(ローカル→リモート)
### ローカルリポジトリからリモートリポジトリへの送信

```c
% git push <送信先リポジトリ> <送信元ブランチ>:<送信先ブランチ>
% git push origin master  // originに対してmasterブランチをpush
```

## 「ターミナル」で使用するコマンド(リモート→ローカル)
### リモートリポジトリからローカルリポジトリへの複製
リモートリポジトリにある「他人が作成・編集した」**リポジトリ**をローカルリポジトリにコピーします。
一度コピーすれば、作業する前に差分だけリモートリポジトリから引っ張ってくればよいため、このコマンドを実行するのは**初回**だけで構いません。

```c
% cd <リモートリポジトリを複製したいディレクトリのパス>
% git clone <複製したいリモートリポジトリのURL>
```

### リモートリポジトリからローカルリポジトリへのプル
リモートリポジトリにある「他人が作成・編集した」**ブランチ**の差分をローカルリポジトリに反映します。
一人でプロジェクトを進めている場合は、基本的にローカルリポジトリが最新の状態であるため、プルする必要はありません。

```c
% cd <リモートリポジトリから差分を取りたいファイルが含まれるディレクトリのパス>
% git pull <送信元リポジトリ> <送信先ブランチ>
% git pull origin master  // masterブランチに対してoriginからpull
```

<br>
Gitでのファイル操作に関するコマンドは以上となります。