Gitの仕組みやコマンドとGithubの設定 〜 分かれば楽しいGitの基本を完全攻略

今回はGitを勉強するならこの本がおすすめだよと言われたので、👇の本を使って勉強していきます。

[いちばんやさしいGit&Githubの教本](https://www.amazon.co.jp/%E3%81%84%E3%81%A1%E3%81%B0%E3%82%93%E3%82%84%E3%81%95%E3%81%97%E3%81%84Git-GitHub%E3%81%AE%E6%95%99%E6%9C%AC-%E4%BA%BA%E6%B0%97%E8%AC%9B%E5%B8%AB%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86-%E5%85%B1%E6%9C%89%E5%85%A5%E9%96%80-%E3%80%8C%E3%81%84%E3%81%A1%E3%81%B0%E3%82%93%E3%82%84%E3%81%95%E3%81%97%E3%81%84%E6%95%99%E6%9C%AC%E3%80%8D%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/429500524X)

詳しい内容は本を見れば分かるので、省いています。
ちょっとしたメモです。

＊ GUIとは
 Graphical User Interfaceの略。
 マウスや指などでポチポチ操作できる画面のこと。
＊ ユーザインターフェイス
 人間とコンピュータの接点のこと。
 画面・見た目・使い勝手を指す。
＊ CUI
 Character User Interfaceの略。
　キーボードでしか操作できない画面。
　昔のPCのほとんどにはマウスがなかった。

# 基本的なGitのコマンド
### ○ リポジトリの作成
- ローカルリポジトリを作成
```zsh
git init
```
これを実行すると、カレントディレクトリにローカルリポジトリが作られます。
これをするだけで、Gitでバージョン管理をするための準備が完了します。
ちなみに、これを実行すると、ファイルはすべてワークツリーに配置されます。
そのため、Gitで管理したくないファイルは *.gitignore* を作成して、該当のファイルを指定します。

### ○ コミットを作成
- ステージングエリアに変更を全て登録
```zsh
git add .
```
- コミットを作成する
```zsh
git commit
# コミットメッセージも書く場合
git commit -m "<コミットメッセージ>"
```

### ○ Gitの管理対象から外す
```zsh
git rm <ファイル名>
```

### ○ 状態の確認
- ローカルリポジトリの状態を確認
```zsh
git status
```
- 差分を確認
```zsh
git diff
```
「q」を押せば、ENDして差分の確認を終了する。
バイナリファイル(画像やExcel)の差分は確認できない。

- コミットの履歴を確認
```zsh
git log
```
「q」で確認を終了。

- 前のコミットとの差分入りでコミットログを表示する
```zsh
git log -p
```

### ＊ Gitで管理しないファイルとは
Gitでバージョン管理すべきでないファイルが存在する。
- アプリケーションをビルドする際に自動生成される、パッケージファイルやログファイル
→ パッケージファイルはビルドすれば勝手に作成され、ログファイルはアプリケーションを実行するたびに出力される。
→ バージョン管理の必要がない。
- OSのファイル管理のためのファイル
- ファイルをコピーしてリネームしたバックアップなどの一時ファイル
→Gitでバージョン管理しておけば、バックアップ自体が必要ない
- パスワードなどのセキュリティ情報
→リモートリポジトリを共有しているメンバー全員に見られてしまう。

これらはステージングエリアに登録しないようにする。


### ◇ Gitで管理したくないファイルを設定
ステージグエリアに登録する時に、毎回Gitで管理したくないファイルを意識するのは手間がかかる。
そこで、 *.gitignore* ファイルをローカルリポジトリに配置して、まとめて管理する。


## ☆ GitHubに公開鍵を設定する
自分のPCとGitHubとで通信してデータをやり取りするには認証が必要。
この認証方式には2つの方法がある。

① HTTPSというプロトコルと、ユーザー名とパスワードを用いたユーザー認証
② SSHというプロトコルを用いたサーバー認証

SSH認証だと、最初の設定さえしてしまえば、それ以降はユーザー名とパスワードを入力する必要がない。
そのため、GitHubに接続する手順を軽減でき、データ転送を効率的に、早く行える。

### ○ SSH Keyを作成
① SSH Keyを生成
```
ssh-keygen -t rsa -b 4096 -C "自分のメールアドレス"
```
鍵の保存場所が出てくるので、確認しておきましょう。
その後、パスフレーズ(パスワードみたいなやつ)を決めて、2回入力する。

### ○ SSH KeyをGitHubに登録する
①公開鍵をクリップボードにコピー
windowsなら、
```zsh
clip < /home/~/.ssh/id_rsa.pub
```
macOSなら、
```zsh
pbcopy < /home/~/.ssh/id_rsa.pub
```
でコピーできる。
「~」には自分のユーザー名が入る。
つまり、「<」の後には鍵の保存場所を入力する。

自分のPCのOSの*Ubuntu*では、*clip*や*pbcopy*を利用できないため、
```zsh
cat /home/~/.ssh/id_rsa.pub
```
で鍵を表示させて、自分でコピーして貼り付けた。
ちなみに、xselを使う方法もあるらしい。

② GitHubの設定画面で公開鍵を貼り付ける
GitHubのホームページの右上のアイコンをクリック
→ Settingsをクリック
→ SSH and GPG Keys
を選択。
これで貼り付ける画面にいける。
タイトルはどのパソコンなのか分かるように付けてください。


#### ● 設定できたか確認
①確認用コマンドを入力し、パスフレーズで認証

```
ssh -T git@github.com
```

パスフレーズを入力するよう、命令されるので入力します。
「Hi ~! You`ve successfully authenticated」
と出れば成功です。

<br>

# Githubの便利な機能　フォーク
フォーク機能を使えば、GitHub上で公開されているリポジトリを自分のアカウントに複製できます。
例えば、ページの作成を1からやらずに、複製してから変更を加えられます。
複製するオリジナルのファイルには影響を与えないので、これまた共同開発では便利ですね。

フォークして、自分のアカウントに同じディレクトリを複製できました。
今度はそれを自分のローカルリポジトリとして取得しましょう。

①Clone or download をクリック
②Clone with SSHになっているか確認する(HTTPだとうまくいかないかも)
③アドレスの横の←がついたアイコンをクリックしてコピー

⇑の作業が終われば、ターミナルでクローンします。

```
git clone ~
```

~にはさっきのをコピペすればOKです。
これ以降はクローンしたディレクトリで作業するので、「cd」でクローンしたディレクトリに移動します。

<br>

## ブランチで並行作業

### ●ブランチとは
Gitで記録する履歴を枝分かれさせるための機能のこと。
作業の内容ごとに別々に管理できるので、同時に複数の異なる作業をできます。
1人で作業していても、作業の意味ごとにブランチを作れば、作業を細分化できて分かりやすくなります。

### ■ブランチを作成して作業していく

#### ●ブランチの切り替え方法

① ブランチを作成

```
git branch ブランチ名
```


② ブランチを切り替える

```
git checkout <ブランチ名>
```

ブランチの作成とチェックアウトを同時にするなら、、、

```
git checkout -b ブランチ名
```

③ 使用中のブランチを確認

```
git branch
```

これで確認したら、ブランチが切り替わっているはずです。
確認したら、「q」で終了します。

### ●マージとは
ブランチを統合することです。
分けた作業がうまくいったら、最終的には1つにまとめます。


### ●プルリクエストとは
作成したブランチの取り込みを開発チームに依頼することです。
プルリクエストを作成すると、自分がプロジェクトに対し加えた変更を他の開発者に知らせ、その内容を議論できるようになります。
ここで、他の開発者が変更の内容をチャックすることをレビューと言います。
ここで変更が採用されれば、ブランチをマージしてまとめます。

### ■プルリクエストからマージまで(実際の共同開発のイメージ)
① ブランチをプッシュする

```
git push origin 作業したブランチ名
```

プッシュすれば、GitHubに反映されます。
そこで、ブランチ元・先や変更内容、レビュワーを設定すれば、プルリクエスト完了です。

② プルリクエストをレビューしてもらう
レビューしてもらって問題がなければ、マージへと進みます。
このときに、「LGTM(Looks Good To Me)」という略語がよく使われます。

③ マージしてもらう
共同開発では、マージする人が決まっています。
その人にマージしてもらえば、リモートリポジトリで変更が承認されます。

④ リモートリポジトリの内容をローカルリポジトリに取得する
リモートの内容をローカルに取得するときに行う操作が、「**プル**」か「**フェッチ**」です。

#### プル
リモートからの取得内容がワークツリーまで反映される。PC内のファイルが即座にリモートと同じ内容に書き替わります。

```
git pull origin プルするブランチ名
```

#### フェッチ
リモートからの取得内容をローカルリポジトリのみに反映させる。ワークツリーに反映させるには再度マージかプルを行います。
ただし、ローカルリポジトに存在しないブランチ(他の人が作った)がある場合、フェッチしてからのプルが必要です。
```
git fetch origin
```
つまり、
```
プル=フェッチ+マージ
```