【🔰初心者向け】Git入門 [add, status, commit, push]

## はじめに
こんにちは！ITスクールRareTECHにてCS（Customer Support）を担当している池村です。今回の記事はGitの基本コマンドについてです。Gitは初心者にとって難しいと感じる領域ですが、コマンド一つ一つをしっかり理解していけば問題はありません。

今回の記事では、クローンしてきたリポジトリに変更を加え、それをリモートに反映させるまでをみていきます。

前回の記事からの続きですので、まずは以下の記事を一読お願いいたします。

https://qiita.com/ikemura-ren/items/b0d02af934853dc5fbde

![f50a364d-d50c-415e-921c-6c24e1b23ea2_720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/4346e247-6bdb-4359-be60-60eda59ee49a.png)


## クローンしてきたローカルリポジトリについて
まずはクローンしてきたリポジトリの中に何があるのかを確認していきましょう。
前回の記事では、`README.md`だけ準備したリポジトリをクローンしてきました。

ご自身のPCにあるリポジトリのことを**ローカルリポジトリ**と呼びます。

```Bash:何があるのかを確認する
ls -a
```

上記のコマンドを叩くと、以下のようなファイル・ディレクトリがあると思います。
```Bash:表示結果
.         ..        .git      README.md
```

ここで大事になるのは`.git`ディレクトリです。
この`.git`ディレクトリが置いてあるディレクトリは、Gitの管理下にあるという証明になります。

以下の記事でも紹介しましたが、これがホームディレクトリにあると、様々な問題が発生しますので、ご注意ください。

https://qiita.com/ikemura-ren/items/7e0c4fe00236badce9c0

さて、この`.git`の中身ですが、**初心者は覚える必要がないもの**です。
ただ、一応表として残しておきます。Gitの理解を深めたい時に参照してください。

| ディレクトリ / ファイル | 役割 |
|----------------|--------------------------------------|
| **HEAD** | 現在のブランチの最新コミットを指す |
| **config** | リポジトリの設定情報 |
| **hooks/** | コミット時のスクリプト |
| **index** | ステージングエリアの状態を保持 |
| **logs/** | HEAD やブランチの移動履歴 |
| **objects/** | すべての Git データ（コミット・ファイルのバージョン） |
| **refs/** | ブランチやタグの参照情報を管理 |



## ファイルを追加してみる
では何かしらのファイルを追加してみましょう。
```Bash:ファイルの追加
touch test.txt
```

上記のコマンドを叩くと、test.txtというファイルが追加され、ワーキングツリーに変更が加えられた状態になります。

:::note info
ワーキングツリーとは、実際に作業しているファイルやディレクトリの状態を指す用語です。
:::


#### `status`コマンドで、変更がされたかどうか確認をする
```Bash:statusコマンドで確認
git status
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/195a3377-52b2-41a1-86fb-36f9c55a7e49.png)

ここで赤く表示されているのが、変更が加えられたファイルです。
この英語で書かれている部分を日本語にすると以下になります。

```Bash:日本語にしてみる
現在のブランチ: main  
このブランチは 'origin/main' と同期しています。  

未追跡のファイル:  
  （`git add <ファイル名>` を実行すると、コミット対象に追加できます）  
        test.txt  

コミットに追加されたファイルはありませんが、未追跡のファイルが存在します（`git add` を実行すると追跡できます）。
```

:::note info
git addをしろ〜と言われているようですね。
:::

#### ローカルでの基本的な操作の流れについて
ローカルリポジトリでの作業の流れをかいつまんで解説します。
1. ファイルの中身を変更する or ファイルを追加する
1. その変更をステージングエリアに乗せる（`git add`）
1. ローカルでの変更を確定させる（`git commit`）
1. ローカルの変更をリモートへ反映させる（`git push`）

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/bec84a5d-08c4-4363-b5d2-94f43edd230f.png)

:::note info
`git status`コマンドは、変更を加えられたファイルが、現在どの領域にあるのかを確認できるコマンドです。
:::



## `add`をしてみる
ではファイルに変更を加えたところで、そのファイルをステージングエリアに乗せる作業を行います。ここで出てくるのが`git add`コマンドです。

```Bash:ステージングエリアに乗せる
git add test.txt
```

上記コマンドを叩いたあと、再度`status`を確認していきましょう。
```Bash:statusを確認
git status
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/e7a841a8-2da5-4b67-8b21-a77aa61c05cf.png)

画像のように、赤文字から黄色の文字に変わりました。
書かれている文章にも変化が現れましたね。

```Bash:日本語にしてみる
現在のブランチ: main  
このブランチは 'origin/main' と同期しています。  

コミット予定の変更:  
  （`git restore --staged <ファイル名>` を使うとステージングを解除できます）  
        新規ファイル:   test.txt  
```

ステージングエリアに乗ったファイルを解除する方法は置いておいて、ステージングエリアに乗ったことは確定したので、今度はコミットをしてローカルリポジトリの変更を確定させましょう。

## `commit`をしてみる
ではステージングエリアに乗ったファイルをコミットしていきます。
```Bash:コミットする
git commit -m "test.txtの追加"
```
この`""`の中身はなんでも良いのですが、何を変更したのかわかりやすいメッセージを書きましょう。

コミットを完了させると、`status`を見ても、何も表示されなくなります。
コミットが行われたかどうかは、`git log`で確認ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/564a26dd-99f0-4bbf-af8d-3b5c772c1536.png)

:::note warn
`git log`についての詳細は、今後の記事で紹介いたします。
:::

ここまでで以下のような作業をしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/0522dfbd-0b59-4e0c-bb1f-ee10cfa925e3.png)


## `push`をしてみる
さて、ここまできたら、最後はリモートリポジトリに反映させるだけになります。
リモートリポジトリの状態を今一度確認しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/af3db915-3954-476a-9fc4-73d5cd0007d8.png)

まだGithub上にはREADME.mdしかありませんね。
ローカルで作成したtest.txtは存在しません。では`git push`コマンドでリモートに変更を反映させていきます。

```Bash:pushをしてみる
git push origin main
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/495dabd2-6f12-40e6-a478-4842593569ec.png)

画像のような結果になりましたら、成功しています。
GitHubの方も確認してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/6caf0d0f-c714-4504-a5cd-e522a56fd345.png)

追加されていますね。ローカル→リモートの流れはこれにて終了です。


## `add`や`commit`のオプションについて
#### `add`の使い方の応用
先ほどまでは`add`コマンドでファイルを指定しましたが、まとめてステージングエリアに乗せることができます。

```Bash:まとめて乗せる
git add .
```

`.`を使うと、**今いるディレクトリ以下にある、変更されたファイル類をまとめて**ステージングエリアに乗せることができます。

ファイルを複数指定して乗せることもできます。
```Bash:複数指定
git add test2.txt test3.txt
```

#### `commit`の使い方の応用
`commit`の使い方に関しても色々な応用があります。
まずは、すでに`commit`されているファイルに変更が加えられた場合に、`add`と`commit`を一緒に行う方法です。
```Bash:addごと行う
touch test4.txt
git add test4.txt

git commit -m "test4.txtの追加"

echo "Hello World!!" >> test4.txt

git commit -a -m "test4.txtにHello World!!を追記"
```

:::note info
多用することはないかな？と思っています
:::

次にコミットメッセージを修正したい時に便利なオプションです。
```Bash:直前のコミットメッセージを修正
git commit --amend -m "正しいコミットメッセージ"
```

:::note info
直前のコミットで、コミットメッセージをミスったら、これを使ってください。
:::

少々取り扱い注意ですが、`--amend`オプションでは、新規で追加した変更ファイルを、直前のコミットに追加することもできます。

```Bash:新規変更を加えてコミットを修正
git add newfile.txt
git commit --amend --no-edit
```

上記コマンドを利用すると、直前のコミットに対してnewfile.txtの変更も加えられます。
`--no-edit`のオプションは、コミットメッセージは変更しない時に使われるオプションになります。

:::note alert
すでにpushされたコミットに対して、変更を加えるとややこしいことになるのでお勧めしません。
:::


## おわりに
読了ありがとうございました。
これらのコマンドはGitのコマンドの中でも基本中の基本ですが、かなり大事なところですね。初心者がGitコマンドで一番怖いと感じるのは、おそらくコンフリクトだと思います。現在の記事内容まででは、まだ発生はしませんので安心してコマンドを実行してみてください。
では次の記事ではブランチについてと、`pull`や`merge`などについて解説していきます。

https://qiita.com/ikemura-ren/items/df4cfc534be61fa9c6ba