Git コマンドメモ

# Git コマンドメモ

よく使う Git コマンドのメモと使用例。

## 1. 初期操作

### リポジトリの初期化と最初のコミット

```bash
git init
git add .
git commit -m "Initial commit"
```

### リポジトリのクローン

カレントディレクトリ内にクローンが作成される

```bash
git clone <リポジトリのURL>
```

## 2. 基本コマンド

### 状態確認

現在の作業ディレクトリの状態を確認する

```bash
git status
```

### 変更の確認

ステージングされていない変更内容を確認する

```bash
git diff
```

ステージング済みの変更内容を確認する

```bash
git diff --staged
```

### 変更の追跡（ステージング）

```bash
# すべての変更を追加
git add .
# 特定のファイルを追加
git add <ファイル名>
```

> **Tips** ステージングの取り消しは `git reset` コマンドを使用
>
> ```bash
> git reset
> ```

### コミット

ステージングされている変更の履歴を記録する

```bash
# コミットメッセージを含めてコミット
git commit -m "コミットメッセージ"
# 追跡済みファイルの変更を追加してコミット
git commit -am "変更を追加してコミット"
```

### コミット履歴の確認

```bash
# コミット履歴を表示
git log
# コミット履歴を簡潔に表示
git log --oneline
# グラフィカルに履歴を表示
git log --graph --oneline --all
```

#### コミットの取り消し

```bash
# 特定のコミット履歴を取り消し
git reset --soft <コミットID>
# 直前のコミット履歴を取り消し、ファイルの内容の変更は保持される
git reset --soft HEAD^
# 直前のコミット履歴を取り消し、ファイルの内容の変更も取り消される
git reset --hard HEAD^
```

### リモートリポジトリとの連携

#### リモートリポジトリの情報取得

情報の取得のみを行い、ローカルリポジトリを最新の状態にする

```bash
git fetch
```

#### リモートの変更を取得してマージ

リモートリポジトリの変更を取得し、現在のブランチにマージする

```bash
git pull
```

#### ローカルの変更をリモートに送信

```bash
git push
```

### スタッシュ

コミットはせずに変更を退避したいときに使用

```bash
git stash
```

> **Tips:** スタッシュするときにコメントを付けることもできる
>
> ```bash
> git stash save "スタッシュのコメント"
> ```

#### スタッシュの一覧表示

```bash
git stash list
```

#### スタッシュの適用

```bash
# 直近のスタッシュを適用
git stash apply
# 特定のスタッシュを適用
git stash apply <スタッシュ名>
```

> **Tips:** スタッシュを適用する際に、`--index` オプションを使用すると、ステージングされていない変更も適用される
>
> ```bash
> git stash apply --index
> ```

#### 退避した作業を元に戻すと同時に、stash のリストから消す

```bash
# 直近のスタッシュを適用してスタッシュリストから削除
git stash pop
# 特定のスタッシュを適用してスタッシュリストから削除
git stash pop <スタッシュ名>
```

## 3. ブランチ操作

### ブランチの作成

```bash
# ブランチを作成
git branch <ブランチ名>
# ブランチを作成して切り替え (従来の方法)
git checkout -b <ブランチ名>
# ブランチを作成して切り替え (Git 2.23以降の新しい方法)
git switch -c <ブランチ名>
```

### ブランチの一覧表示

```bash
# ローカルブランチの一覧
git branch
# リモートブランチを含むすべてのブランチの一覧
git branch -a
```

### ブランチの切り替え

```bash
# 従来の方法
git checkout <ブランチ名>
# Git 2.23以降の新しい方法
git switch <ブランチ名>
```

### ブランチのマージ

指定した他のブランチの変更を現在のブランチに統合する

> **Tip:** ブランチをマージする前に、マージ先のブランチを最新の状態にしておく必要がある

```bash
# リポジトリを最新の状態に更新
git fetch
# マージ先のブランチに切り替える
git checkout <マージ先のブランチ名>
# マージ
git merge <マージ元のブランチ名>
```

#### マージコンフリクトの解決

マージ時にコンフリクトが発生した場合の対処方法

1. コンフリクトが発生したファイルを開く
2. コンフリクト部分を編集して解決する（`<<<<<<<`, `=======`, `>>>>>>>` のマーカーを削除）
3. 変更をステージングする
    ```bash
    git add <コンフリクトを解決したファイル>
    ```
4. マージを完了する
    ```bash
    git commit
    ```

### ブランチの削除

```bash
# ローカルブランチの削除（マージ済みの場合）
git branch -d <ブランチ名>
# ローカルブランチの強制削除（マージしていない変更がある場合）
git branch -D <ブランチ名>
# リモートブランチの削除
git push origin --delete <ブランチ名>
```

### 変更の復元（Git 2.23 以降）

```bash
# ステージングされていない変更を元に戻す
git restore <ファイル名>
# ステージングされた変更をステージングから外す
git restore --staged <ファイル名>
```

## 4. 高度な操作

### リベース

ブランチの起点を変更する（履歴を整理する）

```bash
git rebase <ブランチ名>
```

### タグ付け

特定のコミットにタグを付ける

```bash
# 軽量タグを作成
git tag <タグ名>
# 注釈付きタグを作成
git tag -a <タグ名> -m "タグのメッセージ"
# タグをリモートにプッシュ
git push origin <タグ名>
```

### 変更の一時保存と復元

```bash
# 現在の変更を一時的に退避
git stash
# 退避した変更を一覧表示
git stash list
# 退避した変更を適用
git stash apply
# 退避した変更を適用して削除
git stash pop
```

### 初回プッシュ時や上流ブランチの設定

```bash
git push -u origin <ブランチ名>
```