gitとgithubの基本

#概要
独学でプログラミングを学んでいる立場として、一番学んでおかなければならないのは実はGitだと思います。プログラミングスクールでは共同開発の経験が積める場所もありますが、独学では文字通り一人でやっているので、共同開発の経験は積めません。
せめてGitの知識、および使用方法はわかっていないと現場に入れたとしても、開発に携わることができません。
独学で学んでいる時からGitを使用しながらバージョン管理し、実戦でも違和感なく使えるよう学んでいきたいと思います。

#参考文献
[【Git入門】Git + Github使い方入門講座🐒Gitの仕組みや使い方を完全解説！パーフェクトGit入門！](https://www.youtube.com/watch?v=LDOR5HfI_sQ)
YouTubeの動画ですが、こちらが一番わかりやすいです。
特に、実際の現場での使われ方を想定しながら説明してくださるので、理解が深まります。
ありがとうございます。

#Gitとは
いつ、誰が、何を変更したか履歴を記録するバージョン管理ツールです。

#基本用語
**リポジトリ**
プロジェクトの単位であり、Gitのファイルを管理する場所です。この中で作業を行っていきます。
**リモート**
Gitが用意しているサーバーのこと。GitHubを使用するとブラウザで中身を確認できたりします。
**ローカル**
個人で作業している端末をgitではローカルといいます。
**ステージング**
Gitで管理される状態にすることです。正確にはインデックスにコミットするファイルを登録することです。
**マスター**
元々の変更履歴です。
**ブランチ**
マスターから分岐させた別の変更履歴です。マスターに影響を与えずリモートにプッシュすることが可能で、後からマスターへ合流させることができます。
**マージ**
ブランチを別のブランチやマスターへ合流させることです。
**フェッチ**
リモートの状態をローカルにダウンロードしてくることです。

#Gitのコマンド
**git clone**
新規にリモート場にあるリポジトリをローカルへコピーする。後ろにはGitHubから必要な文字列を確認し入力します。

```terminal:
$ git clone git@github.com:~
```

**git status**
Gitの状態を確認するコマンドです。新しいファイルや変更があるファイルはファイル名が赤で表示されます。

```terminal:
$ git status
~
Untracked files:
   (use "git add <file>..." to include in what will be committed)
   ファイル名
~
```

**git add ファイル名**
指定したファイルをGitでステージングするコマンドです。git statusで確認すると指定したファイルが緑で表示されます。

```terminal:
$ git add 指定するファイル名
~
Changes to be committed:
   (use "git rm --cached <file>..." to unstage)
   new file: 指定するファイル名

Untracked files:
   (use "git add <file>..." to include in what will be committed)
   ステージングされていないファイル名
~
```

"git add ."とファイル名ではなくドットを指定する、Gitで管理されていないファイルを全てステージングさせることができます。

```terminal:
$ git add .
~
Changes to be committed:
   (use "git rm --cached <file>..." to unstage)
   new file: ファイル名
   new file: ファイル名
   ~
~
```

**git commit -m "コミットメッセージ"**
ステージングさせたファイルをGitに保存するコマンドです。コミットメッセージを書くことでメッセージを書くことができます。

```terminal:
$ git commit -m "コミットメッセージ"
[master (root-commit) ~] コミットメッセージ
2 files changed, 1 insertions(+)
 create mode ~ ファイル名
~
```

**git log**
git commitの履歴を確認できるコマンドです。

```terminal:
$ git log
commit ~
Author: ~
date: Mon Nov 18 11:06:23 2020 

コミットメッセージ
```

**git push origin**
リモートにアップロードするコマンドです。
originはリモートサーバのことです。

```terminal:
$ git push origin
```

**git push origin ブランチ名**
新しいブランチをリモートにプッシュする場合のコマンドです。

**git pull origin**
ローカルの既存のリポジトリに最新のリポジトリをダウンロードする。

**git checkout ブランチ名**
ブランチから別のブランチへ切替るコマンドです。

```terminal:
$ git checkout master
Switched to a new branch 'master'
```

**git checkout -b ブランチ名 master**
-b ブランチ名で新たなブランチを作成できる。

```terminal:
$ git checkout -b ブランチ名 master
Switched to a new branch 'ブランチ名'
```

**git branch**
ブランチの一覧を見るコマンドです。現在のブランチは緑色で表示されます。
-aを後ろに付けると、リモート側のブランチも確認することができます。

```terminal:
$ git branch
* ブランチ名
  master
```

**git merge 合流させるブランチ名**
現在指定しているブランチへマージを行うコマンドです。

```terminal:
$ git branch
  ブランチ名
* master
$ git merge ブランチ名
Updating ~
Fast-forward
 file | 1+
```

**git fetch origin**
リモートの状態をローカルへダウンロードするコマンドです。

```terminal:
$ git fetch origin
~
From github.com:~
~ ブランチ名 -> origin/ブランチ名
```

**git rebase origin/ブランチ名 ブランチ名**
コミットを元々の最終コミットの後ろへ強引に持ってくるコマンドです。コミットツリーがシンプルになりすっきりします。

```terminal:
$ git fetch origin
$ git rebase origin/ブランチ名 ブランチ名
$ git push origin -f
```

-fはforceプッシュといいリモートの状態を無視してローカルを強引にプッシュするコマンドです。

**git reset --hard HEAD**
ファイルの変更を最終コミットまで戻ることができるコマンドです。

```terminal:
$ git reset --hard HEAD
HEAD is now at ~ コミットメッセージ
```

**git stash**
**git stash pop**
変更した内容をgit stashコマンドで一度消すことができます。git stash popで消した内容を復元することができます。

```terminal:
$ git stash
Saved working directory and index state WIP on ~
$ git stash pop
```

#プルリクエスト
masterにマージしてもらうよう依頼すること。GitHub上では簡単にプルリクエストを確認でき、メッセージを書くこともできます。

#共同開発でのエラー
共同開発の場合、以下のエラーが出る機会がよくあります。

```terminal:
$ git push origin develop
To github.com-~.git
! [rejected] develop -> develop {fetch first}
error: failed to push some refs to 'git:github.com:~.git'
~
```

リモートサーバーにあるブランチと違う履歴をプッシュする場合に警告として出ます。
その場合、手元のローカルにリモートのブランチをマージさせます。

```terminal:
$ git checkout ローカルのブランチ名
~
$ git merge origin/ブランチ名 
~
```

実行してviエディタが表示されたら、:wqと入力するとリモートからローカルへマージさせることができます。

****

```terminal:
$ git push origin develop
~
CONFLICT (content):Merge conflict in ~
~
```

同じファイルの同じ行が違う内容の場合に出るエラーです。該当ファイルを確認すると、該当箇所が編集されているので、正しく編集し直します。

```terminal:
$ git status
~
(fix confilicts and run "git commit")
~
```

いつも通りgit commitを行えば変更をコミットできます。

#コマンドの豆知識
**fetch、mergeとpull**

```terminal
$ git fetch origin
$ git merge origin/ブランチ名
```
この流れは

```terminal
$ git pull ブランチ名
```

と同じ意味合いになります。必要に応じて使い方を分けます。

**mergeとrebase**
mergeとrebaseの使い分けはどちらが正しいというものはないので、必要に応じて使い分けをしてください。

#まとめ
Gitの基本的な部分は理解することができました。正確には違う意味の部分もあるかと思いますが、まずは使い方を覚えて使いこなしていきたいです。