Git初心者がGitの使い方を簡単にまとめる

## はじめに
:::note info
この記事は、Git( & Qiita)初心者が、自身のための勉強メモとして書いた記事です。
:::
すでにGitの使い方をまとめた素晴らしい記事が複数あるので、Git初心者はそちらを参考にすることをオススメします。

Qiita記事: [[初心者向け]GitとGitHubの使い方を徹底解説](https://qiita.com/renesisu727/items/248cb9468a402c622003)
Qiita記事: [君には1時間でGitについて知ってもらう(with VSCode)](https://qiita.com/jesus_isao/items/63557eba36819faa4ad9)

## Gitとは
**Git**は、**分散型のバージョン管理システム**です。ファイルの変更履歴を保存し、その変更履歴を辿ることで、ファイルの状態を戻すことができます。「**リポジトリ**」と呼ばれるファイルやデータの格納庫を使います。

**GitHub**は、ソースコードを共有し、管理するためのプラットフォームです。

## ファイル変更からプッシュまでの概要
Gitでは、自分のファイルの変更内容を、ローカルリポジトリに書き込んで、変更内容をリモートリポジトリに転送することで、バージョン管理をします。

エディタでファイルの変更内容を保存したら、それを「ステージングエリア」に追加します(=**ステージング**)。そして、コメント(=コミットメッセージ)を添えて、ローカルリポジトリに記録(=**コミット**)します。更にこれをリモートリポジトリに送信(=**プッシュ**)することで、リモートリポジトリに情報が保存されます。

### 実際にやってみる
実際に、手元にあるファイルをGitHub上へプッシュしてみましょう。

なお、gitのインストール、GitHubへの公開鍵認証、`git config user.name`及び`git config user.email`などの初期設定の説明は省略します。

まず、コマンドプロンプトを開いて、バージョン管理したいプロジェクトファイルへcdコマンドで移動し、次のコマンドを打ちます。
```
git init
````
プロジェクトファイル直下に.gitファイルが作成されました。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3771658/e641f95c-6bd2-dbc1-b9f0-ab3c1af2691e.png)
.gitファイルの中身には、ファイルの変更履歴やブランチ(リポジトリの分岐した状態を指すもの)などを保管していくことで、バージョン管理を行っています。

次に、git addコマンドにて、ファイル(hello.c)をステージします。
```
git add hello.c
````
git add (ファイル名)とすることで、(ファイル名)をステージします。まとめてステージしたい場合は、
```
git add .
````
とします。
ステージングエリアに追加されたファイルを、ローカルリポジトリに追加します。
```
git commit
```
コミットしたら、
```
git status
```
として、前回のコミットから変更のあるパスを表示できます。
そして、
```
git commit -m 'コミットメッセージ
```
とすることで、コミットすることができます。開発では、コミットの内容がわかりやすいように、コミットメッセージを記します。

開発におけるコミットメッセージの書き方はこちらを参考にすると良いでしょう。
Zenn記事: [Gitのコミットメッセージの書き方（2023年ver.）](https://zenn.dev/itosho/articles/git-commit-message-2023)

最後に、
```
git push origin (リモートブランチ名)
```
とすることで、プッシュ完了です。上流ブランチを設定することで、`origin (リモートブランチ名)は、省略可能です。

## その他まとめ
上記の流れで、ローカルファイルをGitHub上へ公開することが出来ましたが、実際の開発では、**ブランチ**や**マージ**といった概念が重要になります。また、GitHubには、**Pull requests**や**GitHub issues**といったものもあり、チームでの開発では大切な要素になります。

GitやGitHubについて網羅的に説明しようとするのは極めて難しいので、大雑把ではありますが、以下に自分の勉強メモを簡単にまとめました。


### 用語のまとめ
| 用語 | 意味 |
|:-:|:-:|
|リポジトリ|ファイルを管理しておく場所。ローカルリポジトリとリモートリポジトリの2種類がある|
|ワークスペース|作業しているフォルダ|
|ステージ|変更したファイルをステージングエリアに追加する|
|コミット|変更をリポジトリに記録する|
|リセット|変更をなかったことにする|
|ブランチ|異なるコミット履歴を持つ、コードの分岐した状態|
|マージ|ブランチを合流させる|
|リベース|現在のブランチのコミットを別のブランチの先端に再適用する|
|パッチ|(Gitでは、)プログラムの変更部分のソース|
|プッシュ|ローカルリポジトリからリモートリポジトリにデータを記録する|
|プル|リモートリポジトリからローカルリポジトリにデータを記録する|
|フェッチ|リモートリポジトリとローカルリポジトリの差分を検出する|
|スタッシュ|ファイルの変更を一時的に退避する|
|アメンド|直前のコミットを修正して、新しいコミットを作成する|
|チェリーピック|特定のコミットを別のブランチに適用する|
|タグ|リリースされたバージョンなどに名前をつける|
|ファストフォワード|マージ元のブランチが、マージ先のブランチの履歴に完全に含まれているようなマージ|
|コンフリクト|マージ操作中に発生する変更内容の衝突|
|.gitignore|Gitによる追跡を避けるファイルを指定するためのファイル|
|.gitkeep|Gitリポジトリで、空のディレクトリを保持するためのファイル|


### コマンドのまとめ
```
# Gitのバージョンを表示する
git --version

# Gitリポジトリの現在の状態を表示する
git status

# コミット履歴を表示する(--all、--graph、--sinceオプションなどがある)
git log

# タグの一覧を表示する
git tag

# ブランチの一覧を表示する
git branch

# リモートリポジトリの一覧を表示する
git remote

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

# すべての設定の確認
git config -l --show-origin

# リポジトリを作成する
git init

# hello.cをステージング
git add hello.c
# 変更したファイルをステージング
git add .

# コミットする
git commit -m 'コミットメッセージ'
# アメンドによるコミット
git commit --amend --no-edit

# プッシュする
git push origin (リモートブランチ名)
# アップストリームを設定する
git push --set-upstream origin (リモートブランチ名)
# アップストリーム設定後のプッシュ
git push

# フェッチする
git fetch

# 以前の状態を復元する
git checkout .

# 1つ手前のコミット(HEAD^)まで戻す(リセットモードには、Soft, Mixed, Hardがある)
git reset HEAD^ --hard

# コミットに「v1.0.0」という名前のタグを追加する。(コミットID)が未指定なら、最新のコミットに反映される
git tag v1.0.0 (コミットID)

# タグを削除
git tag -d v1.0.0

# ブランチ「develop」を作成
git branch develop
# 特定のコミットからブランチ「develop」を作成
git checkout (コミットID) -b develop

# ブランチ「develop」に切り替える
git checkout develop

# マージする(--no-editをつけることでコミットメッセージを自動的に作成)
git merge feature-branch --no-edit

# ブランチを削除する(削除するブンチ以外のブランチにチェックアウトした状態で↓)
git branch -d feature-branch

# ブランチ名を変更する(masterをmainにする)
git branch -m master main

# リモートリポジトリのアドレスを登録する
git remote add origin (アドレス)

# クローンする
git clone (アドレス) (フォルダ名)

# スタッシュする(-uオプションで、ステージングしていないファイルも対象とする)
git stash save '作業中断'

# スタッシュを適用する(※git stash listで識別番号を確認すること)
git stash apply stash@{0}

# スタッシュを削除する
git stash drop stash@{0}

# リベース
git rebase (ブランチ名)

# チェリーピック
git cherry-pick (コミットID)

# 差分の確認
git diff HEAD^ HEAD^^
# パッチファイルの作成
git diff HEAD^ HEAD^^ > ../patch.diff

# パッチの適用
patch < ../patch.diff
```

### 備考
* GitHubでは、SSHを使用することで、ユーザーがリモートリポジトリに安全にアクセスする
* Gitをチームで運用する際プロセスをワークフローという。[[日本語訳]A successful Git branching model](https://qiita.com/homhom44/items/9f13c646fa2619ae63d0)
* リモートブランチの名前変更や削除、デフォルトブランチの変更はGitHub上で行える
* リベースは、コミットログを整理したいときに使う
* アメンドができるのは、プッシュをしていないコミットのみ
* Issues...プロジェクト管理において、タスク、バグ、機能要求などを追跡するための機能
* Milestone...進捗状況を管理するための機能
* GitHub Pages...Publicに設定したリポジトリのウェブサイトを公開する
* GitHub Actions...CI/CDツール
* GitHub Desktop...GitHub公式によるGitのクライアントソフト