Gitコマンドの基本＆実務で役立つ操作まとめ📚

## はじめに
Gitは開発現場で欠かせないバージョン管理ツールです。

本記事では、基本コマンド・実務で役立つコマンドをまとめました。
チーム開発でよく使う操作を解説します！

**※ 実務で多用するコマンドには 🌟 付けしています。**

## 目次
1. [リポジトリのクローン](#-リポジトリのクローン)
2. [既存プロジェクトの更新](#-既存プロジェクトの更新)
3. [ブランチ操作](#-ブランチ操作)
4. [ステージングとコミット](#-ステージングとコミット)
5. [リモートへのプッシュ](#-リモートへのプッシュ)
6. [マージ](#-マージ)
7. [変更の取り消し](#-変更の取り消し)
8. [実務で役立つ便利なGitコマンド](#-実務で役立つ便利なgitコマンド)
9. [まとめ](#-まとめ)
10. [参考文献](#-参考文献)

## ✅ リポジトリのクローン
リモートリポジトリをローカルに複製します。
```yml
# リポジトリをクローン 🌟
git clone リポジトリURL

# 任意のディレクトリ名でクローン
git clone リポジトリURL ディレクトリ名
```
💡 初めてプロジェクトに参加する際に実行する基本操作です。

## 🔄 既存プロジェクトの更新
他のメンバーの変更を取得し、自分の作業環境に反映します。
```yml
# 最新のコードを取得（ローカルには反映されない）🌟
git fetch

# mainの最新を取得＆マージ（fetch + merge のショートカット）🌟
git pull origin main

# mainブランチの変更内容を統合 🌟
git merge main
```
💡 `git pull` は作業開始前に必ず実行し、最新の状態を保持しましょう。

## 🌿 ブランチ操作
機能ごとにブランチを作成し、適切に管理します。
```yml
# 現在のブランチを確認
git branch --contains

# 新しいブランチを作成
git branch ブランチ名

# ブランチを切り替える 🌟
git checkout ブランチ名
git switch ブランチ名

# 新規ブランチを作成して切り替える 🌟
git checkout -b ブランチ名
```
💡 mainやdevelopで直接作業せず、必ずブランチを作成して作業しましょう。

## 🔥 ステージングとコミット
作業内容をステージングし、履歴に残します。
### ステージング操作
```yml
# コミット対象をステージング
git add ファイルパス

# カレントディレクトリ配下のコミット対象を一括でステージング 🌟
git add .

# ステージの状態を確認 🌟
git status

# ステージングを解除（HEADの状態に戻す）
git reset HEAD

# 特定のファイルだけステージング解除
git reset HEAD ファイルパス
```
### コミット操作
```yml
# コミット（メッセージをつける）🌟
git commit -m "コミットメッセージ"

# エディタでコミットメッセージを入力（vi操作）
git commit
# メッセージ入力 → `esc` → `:wq` → `Enter`
```
💡 こまめにコミットし、変更の追跡を容易にしましょう。

## 🚀 リモートへのプッシュ
コミットした変更をリモートリポジトリに反映します。
```yml
# 作業ブランチのプッシュ初回 🌟
git push -u origin ブランチ名
# -u： upstream の略で、ブランチの最新状態を自分のローカルリポジトリと同期するための基準になるリモートブランチ

# 作業ブランチのプッシュ2度目以降
git push origin ブランチ名 🌟
git push origin HEAD # HEAD：今作業しているブランチの場所を示すポインタ 🌟
```
💡 プッシュ前に `git status` や `git branch` で確認すると尚よしです！

## 🔀 マージ
複数のブランチを統合する際に使用するのが `git merge` です。
### ✅ 基本的なマージ
```yml
# mainブランチに移動 🌟
git checkout main

# mainの最新を取得 🌟
git pull origin main

# 作業ブランチに移動 🌟
git checkout ブランチ名

# mainを作業ブランチへマージ 🌟
git merge main
```
💡 ポイント
* `git merge` は現在のブランチに対して指定ブランチを統合します。
* コンフリクトが発生した場合は手動で解決し、再度コミットが必要です。

### 🔥 マージ時のコンフリクト解消
コンフリクトが発生すると以下のように表示されます。
```yml
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
```
#### 競合箇所を修正
```yml
# コンフリクトを修正した後、ステージング
git add .

# マージ完了
git commit -m "コンフリクト解消"
```
💡 マージのコツ
* マージ前に必ず `git fetch` で最新の状態にしましょう。
* コンフリクト解消後は、他のメンバーと内容を確認しましょう。

### 🔄 マージコミットを避ける（Fast-forwardマージ）
```yml
# Fast-forwardでマージ（履歴がきれいに）
git merge --ff ブランチ名
```
💡 Fast-forwardマージとは
* 分岐した履歴がない場合に、ブランチを直線的に統合する方法です。
* 履歴が複雑にならないため、シンプルな作業では推奨されます。

## ⏪ 変更の取り消し
「間違えてコミットした」「前の状態に戻したい」ときに使用します。
### リセット（reset）
```yml
# コミットを取り消して作業ツリーに戻す（変更は保持）
git reset --soft 取り消すコミットID
git reset --soft HEAD # HEAD：直前のコミット

# コミットを取り消し、ステージングも解除
git reset --mixed 取り消すコミットID

# コミットを完全に取り消して変更も削除（要注意）
git reset --hard 取り消すコミットID
```
💡 `--hard` は不可逆なので慎重に！

### リバート（revert）
```yml
# コミットを取り消し、新たなコミットとして反映
git revert 取り消すコミットID 🌟
git revert HEAD # HEAD：直前のコミット
```
💡 リモートにpush済みの変更を取り消す場合は、`reset` ではなく `revert` を推奨。
💡 推奨理由：複数人で一つのブランチを操作する際に `reset` だと **コミット履歴を削除してしまうため、他の人が以降一切のコミット操作ができなくなる。**
* `reset`：変更を完全に取り消す = コミット履歴を削除する
* `revert`：変更を取り消すための新しいコミットを生成する = コミット履歴は残る

🥺チーム開発の際は推奨でなく**必ず `revert` を使ってください🥺**

## 🧷 実務で役立つ便利なGitコマンド
### 💾 スタッシュ操作
作業中の変更を一時的に退避し、別の作業に移る際に役立ちます。
```yml
# 作業内容を一時退避 🌟
git stash

# 作業内容を一時退避：メモ付きでスタッシュしたい場合 ✍️ 🌟
git stash save "作業中の修正メモ"

# Gitのバージョン2.13以降では以下の形式も使用できます。
git stash push -m "作業中の修正メモ"

# スタッシュの一覧を表示 🌟
git stash list

# git stash list の実行例
　stash@{0}: On main: 修正内容A  
　stash@{1}: On main: 修正内容B
 ・
 ・
 ・


# 最新のスタッシュ(stash@{0})を適用
git stash apply

# 特定のスタッシュを適用：''には stash@{~}内のスタッシュ番号を指定 🌟
git stash apply '1'

# スタッシュを削除 🌟
git stash drop '0'

# すべてのスタッシュを削除
git stash clear
```
✅ 使用シーン
* 急なブランチ切り替えやレビュー対応時に作業を退避しておけます。
* 必要なスタッシュは削除せず、後で適用可能です。

### ✏️ ブランチ名の変更
```yml
# 現在のブランチ名を変更 🌟
git branch -m 新ブランチ名

# 特定のブランチ名を変更
git branch -m 古いブランチ名 新ブランチ名

# リモートに反映
git push origin 新ブランチ名

# 古いブランチをリモートから削除
git push origin --delete 古いブランチ名
```
✅ 使用シーン
* タイポ修正や命名規則の変更時に便利です。

### 🎯 特定のコミットを確認
```yml
# ログの表示（簡易）🌟(`revert`時にコミットIDを見たい場合等)
git log --oneline --graph

# 特定のファイルの変更履歴を確認
git log -- ファイル名
```

### 🚧 競合解決
```yml
# 競合ファイルを確認
git status

# 競合を手動で修正した後、変更をステージング
git add 競合ファイル

# 競合解決後、マージ完了
git commit -m "競合解消"
```

### 🗑️ 不要なブランチ・リポジトリの削除
```yml
# ローカルのブランチを削除 🌟
git branch -d ブランチ名

# 強制削除 🌟
git branch -D ブランチ名

# ローカルリポジトリを削除
rm -rf .git

# リポジトリ削除確認
ls -lah
```

## 🎉 まとめ
本記事では、Gitの基本コマンド＋実務で役立つ操作を紹介しました。

以下、まとめになります。

　**✅ クローン： git clone**
　**🔄 更新：git fetch / git pull** 
　**🌿 ブランチ操作：git branch / git checkout** 
　**🔥 ステージングとコミット：git add / git commit** 
　**🚀 プッシュと削除：git push / git branch -d** 
　**🔀 マージ操作：git merge / git merge --ff** 
　**⏪ リセット・リバート：git reset / git revert** 
　**💾 スタッシュ：stash**
　**✏️ ブランチ名変更：branch -m**

Gitをマスターすると、作業効率が向上し、チーム開発時のトラブル対応もスムーズになります！

## 💫 参考文献
* [Git初心者必見！「git reset」と「git revert」の使い分け方](https://envader.plus/article/244)
* [GitのHEADとは何者なのか]()