Gitの基本操作/現場での頻出コマンド16選

<br>

# ■ はじめに
<br>
最近ではGitを使ってソース資産のバージョン管理を行う現場が増えてきました。
しかしながらGitの場合、SVNなどと異なり操作にはコマンド操作が多く混乱しがちですよね。

今回は、Gitの基本的な使い方と、実際の現場でよく使うコマンドをまとめました。
この記事を読めば、最低限必要な操作は理解できるようになるはずです。

# ■ 目次
<br>

1. [Gitとは](#1-gitとは)
2. [基本のGitコマンド](#2-基本のgitコマンド)
3. [応用的なGitコマンド](#3-応用的なgitコマンド)
4. [実際に現場で使うコマンド](#4-実際に現場で使うgitコマンド)
5. [まとめ](#5-まとめ)

# 1. Gitとは
<br>

まず初めに、Gitとは**バージョン管理システム**です。
簡潔に説明するとファイルの変更履歴を管理できるツール。
プログラムのソースコードなどの資産を安全に管理するために使われます。
<br>

:::note
主な特徴
- **分散型**: 各ユーザーがローカルリポジトリへcloneしてオフラインでも作業できる。
- **ブランチ管理が強力**: ブランチで分けられるため複数の作業を同時並行で進めやすい。
- **高速**[^1] : 大量の変更にも素早く対応（プルやプッシュ、マージ）できる。
:::

Gitは分散型のバージョン管理ツールですが、対になるものとして**集中型バージョン管理システム**があり、
SVN[^2]はこれに該当します。
ソースはGit、分散管理を行う必要のない設計書などはこちらを使用している現場が多い印象です。


# 2. 基本のGitコマンド
<br>
Gitを使うなら、最低限押さえておきたい基本コマンドはこちら！

#### 2.1 リポジトリの初期化

新しいプロジェクトを始めるときには、まずリポジトリを作成します。
リポジトリとは、ファイルのバージョンを追跡するためのデータベースのことです。

``` bash
git init
```

#### 2.2 ファイルのステージング（追加）
ステージングとは、新規作成、編集、削除したファイルをコミットする前に「これをコミットしますよ」とGitに伝える段階です。
``` bash
git add <ファイル名>
```

:::note
この場合はファイル名を単体で指定して変更をステージングエリアに追加します。
:::

変更した複数ファイルやすべてを追加したいときはこちら。
この「.」は「現在のディレクトリ内のすべてのファイル」を意味します。
``` bash
git add .
```
:::note
プロジェクト全体で複数のファイルを一気にコミットしたいときに便利です。
また、すべてのファイルをステージングに追加する場合にも使われます。
:::


#### 2.3 コミット（変更の確定）
追加した変更を「確定」するのが**コミット**です。
-m オプションを使うことで、コミットメッセージをインラインで指定できます。
```bash
git commit -m "コミットメッセージ"
```

:::note
他の開発者が後から変更を理解できるように何をしたのか簡単に書きましょう。
例：「バグ修正」「新機能追加」など
プロンプトによってはチケット番号や作業者の名前を記載するよう決まりがあったりもします。
:::

#### 2.4 状態確認
リポジトリの現在の状態を確認する際には git status コマンドを使います。

``` bash
git status
```

:::note
このコマンドを実行すると、以下の情報を取得できます。
・ステージングされていない変更
・まだコミットされていないステージングされた変更
・追跡されていない新しいファイル
:::

#### 2.5 履歴確認
これまでに行ったコミットの履歴を確認するためには、git log コマンドを使います。
``` bash
git log
```
:::note
コミットの履歴（日時、コミットID、コミットメッセージ）などを確認することができます。
:::



# 3. 応用的なGitコマンド 
<br>

#### ブランチ操作

複数人で開発するときに、作業ごとにブランチを切り分けて管理すると便利です。

#### 3.1 ブランチの作成
新しい作業用ブランチを作成したいときは、次のコマンドを使います。
```bash
git branch <ブランチ名>
```

#### 3.2 ブランチの切り替え
作ったブランチに切り替えたいときはこちら。
```bash
git checkout <ブランチ名>
```

:::note
「check out」は日本語ではは「出ていく」という意味がありますが、
gitでは「他のbranch」へ移動するといった意味になりますね。
:::

最近のGitでは git switch コマンドも使えます。
```bash
git switch <ブランチ名>
```

:::note
上記の理由から「switch」の方がピンとくる方も多いかも。
:::


#### 3.3 ブランチのマージ
別のブランチで作業が終わったら、メインブランチに変更を統合します。
```bash
git merge <ブランチ名>
```


# 4. 実際に現場で使うGitコマンド
<br>

#### 4.1 リモートリポジトリの追加・確認

リモートリポジトリを追加するには、以下のコマンドを使います。
```bash
git remote add origin <リポジトリURL>
```

:::note
リモートリポジトリとは、GitHubやGitLabなどにあるリポジトリのことです。
これをローカルリポジトリと連携させることで、リモートとローカルの間でコードをやり取りできるようになります。
:::

:::note
origin はリモートリポジトリの名前で、デフォルトではよくこの名前が使われます。もちろん、任意の名前を付けることもできます。
<リポジトリURL> には、GitHubや他のリモートリポジトリサービスから取得したURLを指定します。
:::

リモートリポジトリを追加したら、次のコマンドで正しく設定されているか確認します。

```bash
git remote -v
```

:::note 
このコマンドで、リモートリポジトリの一覧と、それに対応するURLが表示されます。
:::

#### 4.2 プッシュ（リモートに反映）


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

:::note
ローカルで行った変更をリモートリポジトリに反映するために使うのが git push です。
特定のブランチの変更をリモートにアップロードします。

git fetchを使用することもできますが、fetchはリモートからの変更をローカルにダウンロードするだけでマージは行いません。
:::

:::note
origin は先ほど追加したリモートリポジトリの名前です
例えば、「main」というブランチをリモートに反映したい場合は git push origin main になります。
:::

#### 4.3 プル（リモートの変更を取り込む）

リモートリポジトリに他のメンバーがプッシュした変更を、ローカルに取り込む際に git pull を使います。
このコマンドは、リモートリポジトリから最新の変更を取得し、ローカルのブランチにマージします。

```bash
git pull
```

:::note
git pull は、実際には git fetch（リモートからの最新情報を取得）と git merge（その変更をローカルに統合）の2つのコマンドを組み合わせたものです。
:::

#### 4.4 クローン（リモートリポジトリのコピーを作成）
リモートリポジトリからローカルにプロジェクトをコピーしてきたいときには git clone を使います。

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

:::note
<リポジトリURL> には、コピーしたいリモートリポジトリのURLを指定します。
このコマンドを実行すると、リポジトリ全体がローカルにコピーされ、ローカルのフォルダとして展開されます。
:::

#### 4.5 コンフリクトの解消
Gitの操作でしばしば起こるのがコンフリクト（衝突）です。
これは、異なる変更が同じファイルの同じ部分で行われた場合に発生します。
例えばAさんとBさんが同じ行を変更して、お互いがそれをマージしようとした際にコンフリクトが発生します。

まずはコンフリクトしたファイルを開き、手動で解消します。

:::note
変更差分のあるファイルは以下のように表示されます。
```diff_javascript
- console.log("Hello")
+ console.log("Hello World")
```
:::

その後、コンフリクトを解消したファイルをステージングしてコミットします。


```bash
git add <解消したファイル>
git commit
```



:::note
git add で解消したファイルをステージングし、その後に git commit で確定します。
:::


# 5. まとめ
<br>

Gitの基本的なコマンドを使いこなすことで、効率よく開発を進められます。
今回紹介したコマンドは、日常的に使うものばかりなので、まずは慣れることを目指してみてください。

[^1]:差分ベースの管理による効率性
[^2]:Subversion