初心者向けGitの基本操作（Chat GPT作）

:::note info
本記事はGitについてChat GPTに色々と聞いた後に、備忘録も兼ねてまとめるかと思って、「Qiitaの記事になるようにまとめて」と頼んだものです。Gitの記事は溢れていると思うけど、ChatGPTに聞きながら作ってみて結構理解深まったかなと思います。
:::

# はじめに
Gitはソフトウェア開発において非常に重要なバージョン管理システムです。この記事では、Gitの基本的な使い方と、ステージング、コミット、プッシュといった主要な概念について詳しく説明します。これを読めば、Gitの基本操作をマスターできるはずです。


# Gitの基本的な使い方
以下では、Gitの基本的なコマンドとその使い方を具体的な手順で紹介します。
```mermaid
graph TD
  subgraph GitHub
    remoteRepo[リモートリポジトリ]
  end

  subgraph ローカル
    localClone[ローカルリポジトリ]
    editFiles[ファイルの編集]
    checkChanges[変更内容の確認]
    stageFiles[ファイルのステージング]
    commitChanges[ローカルリポジトリにコミット]
  end

  remoteRepo -- git clone\n初回のみ --> localClone
  localClone --> editFiles
  editFiles -- git status --> checkChanges
  checkChanges -- git add --> stageFiles
  stageFiles -- git commit --> commitChanges
  commitChanges -- git push --> remoteRepo
  remoteRepo -- git pull --> localClone
```

## 1. GitHubでリポジトリを作成
まず、GitHubで新しいリポジトリを作成します。

1. GitHubにログインし、右上の「＋」ボタンをクリックします
2. 「New repository」を選択します
3. リポジトリ名を入力し、必要に応じて説明を追加します
4. 「Initialize this repository with a README」にチェックを入れると便利です
5. 「Create repository」をクリックします
これで新しいリポジトリが作成されました。

## 2. リモートリポジトリのクローン
まずはリモートリポジトリをローカルにクローンします。
```sh
git clone https://github.com/ユーザー名/リポジトリ名.git
```
このコマンドはリモートリポジトリの完全なコピーをローカルに作成します。次に、クローンしたリポジトリで作業を開始します。

## 3. ファイルの編集
クローンしたリポジトリ内の任意のファイルを編集します。例えば、index.htmlとstyle.cssを編集したとします。

## 4. 変更内容を確認

```sh
#変更内容の確認
git status
```
このコマンドで、変更されたファイルを確認できます。変更内容を確認したら、ステージングします。

実行すると具体的には以下の情報が返ってきます。
1. On branch main: ブランチの状態
    * 現在のブランチ名とその同期状態
1. Changes to be committed: ステージングエリアの変更
    * ステージングエリアに追加された変更
1. Changes not staged for commit: ステージングされていない変更
    * ステージングされていないが追跡されているファイルの変更
1. Untracked files: 追跡されていないファイル
    * Gitが追跡していない新しいファイル
``` sh
On branch main
Your branch is up to date with 'origin/main'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
    new file:   newfile.txt
    modified:   existingfile.txt

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   anotherfile.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)
    untrackedfile.txt
```

## 5. 編集したファイルをステージング
```sh
#特定のファイルをステージング
git add index.html style.css
```
ここでは、index.htmlとstyle.cssを編集したと仮定しています。特定のファイルだけをステージングすることで、意図しない変更が含まれないようにします。
### ステージング (Staging)
ステージングとは、次のコミットに含める変更を選択するプロセスです。git addコマンドを使用して変更をステージングエリアに追加します。これにより、意図しない変更がコミットに含まれるのを防ぎます。

特定のファイルをステージングする代わりに、リポジトリ内のすべての変更を一度にステージングするには、以下のコマンドを使用します：
```sh
#ディレクトリー内の全てのファイルとステージング
git add .
```
このコマンドは、ワーキングディレクトリ内のすべての変更をステージングエリアに追加します。ただし、意図しない変更が含まれる可能性があるため、使用する際には注意が必要です。
```mermaid
graph LR;
    A[ワーキングディレクトリ] -->|git add| B[ステージングエリア];
    B -->|git commit| C[ローカルリポジトリ];
    C -->|git push| D[リモートリポジトリ];

    subgraph "ローカル環境"
        A
        B
        C
    end

    subgraph "リモート環境"
        D
    end
    linkStyle 0 stroke:#f00,stroke-width:5px;
```

## 6. コミット
```sh
#commitする
git commit -m "Update index and style"
```
ステージングされた変更をコミットし、変更内容をローカルリポジトリに保存します。コミットメッセージは変更内容を簡潔に説明するものにしましょう。
### コミット (Commit)
コミットは、ステージングエリアにある変更をローカルリポジトリに保存するプロセスです。git commitコマンドを使用します。コミットは変更のスナップショットとして保存され、履歴に残ります。
```mermaid
graph LR;
    A[ワーキングディレクトリ] -->|git add| B[ステージングエリア];
    B -->|git commit| C[ローカルリポジトリ];
    C -->|git push| D[リモートリポジトリ];

    subgraph "ローカル環境"
        A
        B
        C
    end

    subgraph "リモート環境"
        D
    end
    linkStyle 1 stroke:#f00,stroke-width:5px;
```

## 7. プッシュ
```sh
#pushする
git push origin main
```
ローカルリポジトリの変更をリモートリポジトリに送信します。これで、他のチームメンバーと変更を共有できます。
### プッシュ (Push)
プッシュは、ローカルリポジトリの変更をリモートリポジトリに送信するプロセスです。git pushコマンドを使用します。これにより、リモートリポジトリが最新の状態に更新され、他の開発者と共有されます。
```mermaid
graph LR;
    A[ワーキングディレクトリ] -->|git add| B[ステージングエリア];
    B -->|git commit| C[ローカルリポジトリ];
    C -->|git push| D[リモートリポジトリ];

    subgraph "ローカル環境"
        A
        B
        C
    end

    subgraph "リモート環境"
        D
    end
    linkStyle 2 stroke:#f00,stroke-width:5px;
```

## 8. プル
```sh
# リモートリポジトリの変更をローカルリポジトリに取得
git pull origin main
```
リモートリポジトリの変更をローカルリポジトリに取り込むことで、最新の状態を保つことができます。

### プル (Pull)
プルは、リモートリポジトリの変更をローカルリポジトリに反映させるプロセスです。git pullコマンドを使用します。これにより、他の開発者が行った変更をローカルリポジトリに取り込むことができます。
```mermaid
graph LR;
    A[リモートリポジトリ] -->|git pull| B[ローカルリポジトリ];
    linkStyle 0 stroke:#f00,stroke-width:5px;
    subgraph "リモート環境"
        A
    end
    subgraph "ローカル環境"
        B
    end
```

# その他のGitの機能
Gitには、基本的なステージング、コミット、プッシュ、プルの他にも多くの便利な機能があります。ここではいくつかの重要な機能について簡単に説明します。

## ブランチ (Branch)
ブランチは、作業を分岐させるための機能です。新しい機能を開発する際に、既存のコードに影響を与えずに作業することができます。以下のコマンドで新しいブランチを作成し、移動します。

```sh
# 現在のブランチの確認
git branch
# リモートブランチの確認
git branch -r
# ローカルとリモートのすべてのブランチを確認
git branch -a

# 新しいブランチを作成
git branch 新しいブランチ名
# 作成したブランチに移動
git checkout 新しいブランチ名
```
```mermaid
graph LR;
    subgraph "ローカル環境"
        direction LR;
        A['main'ブランチ] -->|git branch branch_1| B['branch_1'ブランチ];
        B -->|git checkout branch_1| C['branch_1'ブランチで作業];
    end
```

## マージ (Merge)
マージは、ブランチで行った変更を別のブランチに統合するプロセスです。以下のコマンドで、現在のブランチに他のブランチの変更を統合します。
```sh
# 例：featureブランチをmainブランチにマージ
git checkout main
git merge branch_1
```
```mermaid
graph LR;
    A['branch_1'ブランチの変更] -->|git merge| B[mainブランチ];
    subgraph "ローカル環境"
        direction LR;
        A
        B
    end
```
## ログ (Log)
Gitログは、コミットの履歴を表示するためのコマンドです。変更履歴を確認したい場合に使用します。

```sh
# コミット履歴の表示
git log
```
他にもさまざまなGitコマンドが存在しますが、使用頻度が高くないため、ここでは省略しています。実際に必要になったときに、その都度調べて使ってみてください。


# まとめ
Gitの基本的な操作は、ステージング、コミット、プッシュの順に行います。ステージングでは変更を選択し、コミットでローカルに保存し、プッシュでリモートリポジトリに送信します。この手順を守ることで、効率的なバージョン管理が可能になります。

# 終わりに
この記事では、Gitの基本的な使い方と主要な概念について説明しました。Gitの操作に慣れてくると、さらに高度な機能も使いこなせるようになります。まずは基本をしっかりと身につけて、効率的な開発環境を構築しましょう。

Gitを活用して、より良いソフトウェア開発を実現してください。