【GitHubまとめ第1回】基礎コマンド

# はじめに
必須スキルとなっているgit・gitHubの基礎についてまとめました。今回は「ローカルからリモートリポジトリにpushするまでの流れ」・「変更を取り消す方法」・「クローンの生成方法」を記述しています。初学者向けの内容ですが、ローカルの構造が分かっていない方には少し不親切な説明になっているかもしれません。
コマンドはコピペしやすいように、`$`をあえてつけていません。

全3回に渡って、下記の計画で進めます。
【計画】
 <font color="red">第1回目 git基礎コマンド(今回)</font>
 第2回目 ブランチ・マージ・リベース・コンフリクト（https://qiita.com/tatsuya_1995/items/04148896a7f23a1f2090)
第3回目 プルリクエスト (https://qiita.com/tatsuya_1995/items/6d48b7ba8487fe38bbf8)



※沢山出回っている記事ですので、あくまでも自分用メモです。
## gitのローカル基本構造
ローカルは3つのエリアに分かれる
1. ワークツリー(ファイルを変更する作業場所)
2. ステージ（コミットする変更を準備）
3. ローカルリポジトリ（スナップショットを記録）


## ローカルリポジトリの新規作成
初めに、`.gitディレクトリ`を生成。

```
git init
```
`Initialized empty Git repository in ○○○○○○`と表示されればOK!
.gitディレクトリはリポジトリやインデックスファイル、設定ファイルが作られる。
この中に`git add .`や`git commit`などのコマンドで作成されるファイルはこの中に保存される。

## リモートリポジトリ(GitHub)へpushする流れ
### ワークツリーからステージへ追加

```
git add .
```

### ステージからローカルリポジトリへコミット

```
git commit
```
誰がいつ何の変更したかの記録を残すため重要。
※`git commit -m "<メッセージ>"`とオプションをつけることでエディタを立ち上げずにコミットできる。



### ローカルリポジトリからリモートリポジトリへプッシュ


#### GitHubでリモートリポジトリを作成
GitHub→Your profile→Repositories→New→Repository nameを入力→Create repositoryの流れ。
そのURLをコピー![remoteRepository.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/8ea80038-4998-3edc-9608-f169a453c28e.png)


#### リモートリポジトリ(GitHub)を新規追加
originというショートカットでURLのリモートリポジトリを登録
URLはGitHub上で作成したもの。


```
git remote add origin https://github.com/*****.git
```
>origin:
直訳は「起源、発端、源」。デフォルトのリポジトリの場所(URL)の別名

#### リモートリポジトリ(GitHub)へプッシュ

```
git push -u <リモート名> <ブランチ名>
git push　-u origin master
```
`-u`オプションをつけておくと、次回以降`git push`のみでpushできる。
GitHubのリモートリポジトリを確認すると、リモートリポジトリにpushできていることができる。


## 現在の状態のファイルの状態を確認
```
git status
```
ワークツリ⇄ステージ⇄リポジトリ間で変更されたファイルを、それぞれ確認することができる。
<font color="red">コミットやステージに追加する前にどのファイルが変更されたかを確認する癖を付ける。</font>
→全てのファイルをコミットすると、変更途中の物までコミットしてしまうリスクがある。どれをコミットするのか確認した方が安全。
![スクリーンショット 2021-01-12 14.34.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/4cd4c772-875a-0c1b-3420-10c6429f7544.png)
この図はstageに追加していないindex.htmlがあるという意。
`git add .`した後、`git commit`をすると、ローカルリポジトリまで行っているので表示は出なくなる。

## 変更の履歴を確認

```
git log
```
コミットのハッシュ値、変更者、日付、コメントが表示される。
![gitlog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/f90036d0-167e-661f-52a3-806b644c39ec.png)

### 変更履歴のオプション
#### １行で表示する

```
git log --oneline
```

#### ファイルを指定して変更差分を表示する

```
git log -p <ファイル名>
```

#### 表示するコミット数を指示する

```
git log -n <コミット数>
```

## ファイルの削除方法
ファイルを削除するだけではなく「ファイルを削除する記録を残す」という意。

### ファイルごと記録もを削除

1. リポジトリにコミットした記録が消える
2. ワークツリーからファイルが消える


```
git rm <ファイル名>
git rm -r <ディレクトリ名>
```

>ファイルとディレクトリの違い
・ファイル：コンピュータ上で記録・管理される情報の単位
・ディレクトリ：ファイルの目的や種類などに応じて整理するための「入れ物」。ディレクトリはファイルとディレクトリの両方を格納できる。
参考：http://www.cc.kyoto-su.ac.jp/~hirai/text/files.html

### ワークツリーにファイルは残して、リポジトリの記録だけ削除

```
git rm --cashed <ファイル名>
```

### `git rm `コマンド後、元の状態に戻す

```
git reset HEAD <ファイル名>
git checkout <ファイル名>
```

##バージョン管理しないファイルの取り扱い
パスワードなどの公開したくないファイルは`.gitignore`ファイルに指定する

### .gitignoreファイルを生成

```
touch .gitignore
```

### .gitignoreファイルに、公開しないファイル名を記述

![.gitignore.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/8405e0fd-159b-515d-91dc-03fd8059ad8d.png)
`.gitignore`ファイルに、公開したくないファイル名を記述するとバージョン管理から除外される。（今回は`secret.html`)
## ワークツリーのファイルを元の状態に戻す

正確には、「指示されたファイルやディレクトリの情報をステージから持ってきて、ワークツリーに反映させる」。

### ファイル名やディレクトリ名を指示して元に戻す
```
git checkout -- <ファイル名>
git checkout -- <ディレクトリ名>
```

### addした全変更を元に戻す

```
git checkout -- .
```
※ピリオドは全ファイルの意味

## ステージのファイルを元の状態に戻す

正確には、「指示されたファイルやディレクトリの情報をリポジトリから持ってきて、ステージに反映させる」。
→最新のコミットの情報でステージの情報を上書きする。ステージから取り消すだけなので、ワークツリーには影響を与えない。

### ファイル名やディレクトリ名を指示して元に戻す

```
git reset HEAD <ファイル名>
git reset HEAD <ディレクトリ名>
```

### commitした全変更を元に戻す

```
git reset HEAD .
```

## 直前のコミットをやり直す

現在のステージの情報を元に、直前のコミットの情報を上書きする。

```
git commit --amend
```
<font color="red">リモートリポジトリにpushしたコミットは修正NG。</font>
リモートリポジトリにpushした内容を修正し、`--amend`で上書きすると、その間にもし他の人が直前のコミット情報を元に内容を変更し、統合しようとした場合に別のファイルと認識されてしまう。



## GitHubからコピー（クローン）を生成する方法

```
git clone <リポジトリ名>
```
<リポジトリ名>はGitHub上のリポジトリのCodeタブにあるURL。これをコピーして貼り付ける。
![clone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/8783acd0-ed4d-b1e1-bba3-e2c98ec9d12c.png)

これによって、リモートリポジトリ(GitHub)から以下の2つが行われる。
1. リモートリポジトリのファイルをワークツリーへコピー
2. .gitディレクトリをコピー
 




## 設定しているリモートリポジトリを表示

```
git remote
git remote -v
```
`-v`オプションは下記のように詳細を表示する。
fetchとpushでURLを切り替えることができる。この例では同じURLで表示。
![gitRemote.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/878d2125-640d-804c-deb5-f2ed66f6e011.png)

## リモートリポジトリを新規追加

```
git remote add <リモート名> <リモートURL>
```


## リモートリポジトリの名前を変更

```
git remote rename <旧リモート名> <新リモート名>
git remote rename old_name new_name  //例
```

## リモートリポジトリを削除

```
git remote rm <リモート名>
```



# 最後に
今回はgitの基礎コマンドについてまとめました。次回はブランチやマージについてまとめます。
（もしこの記事に誤りがありましたらご教授いただけると幸いです。）