【メモ】ぼっちではやろうと思わなかった`Gitコマンド`基本編

## 目次

- [初めに](#初めに)
- [1. `git add .`](#1-git-add-)
- [2. `git branch`](#2-git-branch)
- [3. `git pull`](#3-git-pull)
- [4. `git checkout -b [ブランチ名]`](#4-git-checkout--b-ブランチ名)
- [5. `git branch -D [ブランチ名]`](#5-git-branch--D-ブランチ名)
- [6. `git diff`](#6-git-diff)
- [7. `git commit -m "コメント"`](#7-git-commit--m-コメント)
- [8. `git push origin [ブランチ名]`](#8-git-push-origin-ブランチ名)
- [9. Mergeリクエスト (Pullリクエスト) を出す](#9-Mergeリクエスト-Pullリクエスト-を出す)
- [実際に経験したので追記コマンド](#実際に経験したので追記コマンド)
  - [11. `git log --oneline`](#11-git-log--oneline)
  - [12. `git reset HEAD~~~`](#12-git-reset-HEAD~~~)
  - [13. `git push -f origin [branch名]`](#13-git-push--f-origin-branch名)
- [最後に](#最後に)

## 初めに

インターンに参加するまで、Gitコマンドは`commit`と`push`、`clone`しかほぼ使っていない状態だったので、ここで一度整理をしておきます。

---

### 1. `git add .`

ワークディレクトリの変更をステージングエリアに追加します。
`branch`をきる度に、実行するのを忘れないでください。


```
ワークディレクトリ
  file.txt (変更済み)

$ git add .

ステージングエリア
  file.txt (変更済み)
```

---

### 2. `git branch`

現在のブランチを表示します。

pushする位置が間違っていないかよく使います。

```
$ git branch
  feature/login
* master
  feature/signup
```

`*` がついているブランチが現在のブランチです。

---

### 3. `git pull`

リモートリポジトリの変更をローカルに取り込みます。

```
リモートリポジトリ
  file.txt (変更済み)

$ git pull

ローカルリポジトリ
  file.txt (変更済み)
```

---

### 4. `git checkout -b [ブランチ名]`

新しいブランチを作成して、そのブランチに切り替えます。

```
$ git checkout -b feature/new-feature
Switched to a new branch 'feature/new-feature'

$ git branch
  feature/login
  master
* feature/new-feature
  feature/signup
```

---

### 5. `git branch -D [ブランチ名]`

指定したブランチを削除します。

```
$ git branch -D feature/login
Deleted branch feature/login.

$ git branch
* master
  feature/signup
```

---

### 6. `git diff`

ワークディレクトリとステージングエリアの変更点を確認します。

変更があったかどうかを確認する時によく使います。

```
$ git diff
diff --git a/file.txt b/file.txt
@@ -1,3 +1,3 @@
 This is a sample file.
-Old line.
+New line.
```

---

### 7. `git commit -m "コメント"`

変更をコミットし、コメントを付けます。

この記事もぜひ読んでみてください。

https://qiita.com/numanomanu/items/45dd285b286a1f7280ed

```
$ git commit -m "Update file.txt"
[master abcdefg] Update file.txt
 1 file changed, 1 insertion(+), 1 deletion(-)
```

---

### 8. `git push origin [ブランチ名]`

ローカルの変更をリモートリポジトリにプッシュします。

```
$ git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 258 bytes | 258.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:username/repository.git
   abcdefg..hijklmn  master -> master
```

---

### 9. Mergeリクエスト (Pullリクエスト) を出す

この部分はコマンドラインではなく、GitHubやGitLabを使用して行います。

1. GitHub (または使用しているGitホスティングサービス) にログインします。
2. リポジトリのページに移動します。
3. 「Pull requests」または「Merge requests」のタブをクリックします。
4. 「New pull request」または「New merge request」のボタンをクリックします。
5. ベースとなるブランチ（通常は`master`や`main`）とマージしたいブランチ（この例では`feature/new-feature`）を選択します。
6. 変更内容を確認し、必要なコメントや説明を追加します。
7. 「Create pull request」または「Submit merge request」のボタンをクリックしてリクエストを作成します。

---

このプロセスを完了すると、リポジトリの管理者や他のチームメンバーがあなたの変更をレビューし、必要に応じてフィードバックを提供することができます。フィードバックが完了したら、変更はメインブランチにマージされます。

## 実際に経験したので追記コマンド

### 11. `git log --oneline`

コミットの履歴を一行でシンプルに表示します。

```
$ git log --oneline
hijklmn Update README.md
abcdefg Add new feature
1234567 Initial commit
```
---

### 12. `git reset HEAD~~~`

`git reset`コマンドを使用すると、指定したコミットにHEAD（現在のブランチの先頭）を戻すことができます。`~`の記号は、戻りたいコミットの数を示します。この場合、`~~~`と3つの`~`があるため、最新の3つのコミットをワークディレクトリに保持したまま、HEADを3つ前のコミットに戻します。

例:
- `HEAD~`: 1つ前のコミットに戻す
- `HEAD~~`: 2つ前のコミットに戻す
- `HEAD~~~`: 3つ前のコミットに戻す
... という具体的な動作になります。

```
$ git log --oneline
hijklmn Update README.md
abcdefg Add new feature
1234567 Add some changes
890abcd Initial commit

$ git reset HEAD~~~
Unstaged changes after reset:
M README.md

$ git log --oneline
1234567 Add some changes
890abcd Initial commit
```

---

### 13. `git push -f origin [branch名]`

ローカルの変更を強制的にリモートリポジトリにプッシュします。このコマンドは他の人との作業が競合する可能性があるため、注意して使用する必要があります。

```
$ git push -f origin feature/new-feature
Counting objects: 3, done.
Writing objects: 100% (3/3), 258 bytes | 258.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:username/repository.git
 +abcdefg...1234567 feature/new-feature -> feature/new-feature (forced update)
```

## 最後に

このような流れで、チームで作業する時にはGitコマンドを利用すると思います。私も今までは、ハッカソンなどの短い開発時間が多かったり、2人など少ない開発メンバーが多かったので、使っていませんでしたがインターンをきっかけこれからGitネイティブになれるように、利用していきたいと思います。