【Git】基本的なgitコマンド

# はじめに

Railsなどを中心に勉強中のエンジニア初心者が他の記事を参考にしたり、実際に実装してみたりして、アウトプットの一環としてまとめたものです。
間違っていることもあると思われるので、その際は指摘いただけると幸いです。

# `git init`

ローカルリポジトリが作成される（`.git`ディレクトリが作成される）。

```bash
$ git init

>
	・リポジトリ
		・圧縮ファイル
		・ツリーファイル
		・コミットファイル
	・インデックスファイル
	・設定ファイル
```

# `git config`

`git`にユーザー情報を登録する。誰がコミットしたかなどの履歴に残る。

```bash
$ git config --global user.name "ユーザー名"
$ git config --global user.email "メールアドレス"

$ git config --list
	>
	credential.helper=osxkeychain
	init.defaultbranch=main
	user.name=ユーザー名
	user.email=メールアドレス
```

# `git clone <リポジトリ名>`

リモートリポジトリからローカルリポジトリにクローン（コピー）を作成する。

```bash
$ git clone https://github.com/aaa/bbb.git
```

# `git add`

変更箇所をローカルのワークツリーからステージに追加する（コミットする変更を準備する）。

```bash
$ git add <ファイル名>
$ git add <ディレクトリ名>
$ git add .
```

# `git commit`

ローカルのステージからローカルリポジトリに変更箇所を記録する。

```bash
$ git commit                        # gitエディタが立ち上がり、メッセージを追加する事ができる
$ git commit -m "<コミットメッセージ>"    # gitエディタが立ち上がることなく、メッセージを追加する事ができる。
$ git commit -v                     # gitエディタが立ち上がり、さらにどのような変更を加えたかをエディタ上から確認する事ができる
```

# `git status`

現在の変更状況を確認する。

ローカルリポジトリに反映されていない変更分が表示される（ワークツリー内の変更箇所、ステージ内の変更箇所）。

コミットしてローカルリポジトリに変更箇所を取り込むことで表示されなくなる。

```bash
$ git status
```

# `git diff`

変更差分を確認する。

```bash
# git addする前の変更分確認
$ git diff <ファイル名>

# git addした後の変更分確認
$ git diff --staged
```

# `git log`

変更履歴（コミット履歴）を確認する。

```bash
# 変更履歴を確認する
$ git log

# 変更履歴を１行で確認する
$ git log --oneline

# ファイルの変更差分を表示する
$ git log -p index.html

# 表示するコミット数を制限する
$ git log -n <コミット数>
```

# `git remote add <リモート名> <リモートリポジトリURL>`

`<リモート名>`に指定した名前で、`<リモートリポジトリ>`のURLを登録する。

今後は`<リモート名>`に指定した名前で、GitHubリポジトリにプッシュしたりクローンしたりできる。

リモート名には通常はoriginが用いられる。

```bash
$ git remote add origin https://github.com/aaa/bbb.git
```

# `git push <リモート名> <ブランチ名>`

ローカルリポジトリの内容をリモートリポジトリにプッシュする。

```bash
$ git push origin master

# origin（登録したリモートリポジトリのURL）に対してmasterブランチをプッシュしている
```

# `git reset`

変更分を取り消す。

HEADは現在自分がいる位置のこと（どのブランチのどのコミット位置か）。

オプションとして`--soft`と`--hard`などがあるが、基本的には`--soft`を付けて使うと良い。

注意点としてリモートリポジトリにプッシュ済みのコミットはやり直してはいけない。

```bash
# ステージから変更分を取り消す（ワークツリーの変更分には影響がない）

$ git reset HEAD <ファイル名>      # ファイルの変更を取り消す
$ git reset HEAD <ディレクトリ名>    # ディレクトリの変更を取り消す
$ git reset HEAD .              # 全ての変更を取り消す

# コミットのみを取り消す場合は：--soft
	# コミットコードを指定
	$ git reset --soft <commitID>
	 
	# 直前のコミットを取り消しする場合
	$ git reset --soft HEAD^

# コミット、ステージ、ワークツリーの変更が全て取り消される
	# コミットコードを指定
	$ git reset --hard <commitID>
	 
	# 直前のコミットを取り消しする場合
	$ git reset --hard HEAD^
```

# `git commit --amend`

直前のコミットのみやり直す事ができる。

リモートリポジトリにプッシュしたコミットはやり直してはいけないため注意。

```bash
$ git commit --amend
```

# `git remote`

設定しているリモートの情報を表示する。

```bash
# リモートリポジトリの登録名称を表示する
$ git remote
	>
	origin

# リモートリポジトリのURLを表示する
$ git remote -v
	>
	origin  https://github.com/aaa/bbb.git (fetch)
	origin  https://github.com/aaa/bbb.git (push)

# リモートリポジトリの詳細情報を表示する
# 表示される情報は、「fetchとpushのURL」、「リモートブランチ」、「pullの挙動」、「pushの挙動」。
$ git remote show origin
* remote origin
  Fetch URL: https://github.com/aaa/bbb.git
  Push  URL: https://github.com/aaa/bbb.git
  HEAD branch: main
  Remote branch:
    main tracked
  Local ref configured for 'git push':
    main pushes to main (up to date)
```

# `git fetch`

リモートリポジトリから情報を取得する。なにはともあれとりあえず、`git fetch`するようにする。

```bash
$ git fetch
$ git fetch <リモート名>
```

# `git pull`

リモートリポジトリから情報を取得してマージする。

基本的には`git fetch`で情報を取得したのちに、`fetch`してきた情報を確認したうえで、ローカル上でマージする方が好ましい。

```bash
$ git pull <リモート名> <ブランチ名>
$ git pull origin master

# 上記コマンドは省略可能
$ git pull

# 下記コマンドは上記コマンドと同じ結果になる
$ git fetch origin master
$ git merge origin master
```

# `git branch <ブランチ名>`

ブランチを新規追加する。ブランチの切り替えまでは行われない。

```bash
$ git branch feature    # featureブランチを新規追加する
```

# `git branch`

ブランチの一覧を表示する。

`-a`オプションをつけるとリモートブランチの情報も含めて全て表示する

```bash
# ローカルブランチの一覧を表示する
$ git branch

	>
	* develop                # 「*」は現在いるブランチを表している
	  main

# リモートも含めてブランチの一覧を表示する
$ git branch -a

	>
	* develop                # 「*」は現在いるブランチを表している
	  main
	  remotes/origin/main    # 「-a」オプションをつけるとリモートブランチの情報も含めて全て表示する
```

# `git checkout <ブランチ名>`

ブランチを切り替える。

`-b`オプションをつける事で、ブランチの新規作成と切り替えを同時に実行できる。

```bash
# 別の既存ブランチに切り替える
$ git checkout <既存ブランチ名>

# ブランチを新規作成し、作成したブランチに切り替える
$ git checkout -b <新規ブランチ名>
```

# `git branch -d <ブランチ名>`

`-d`オプションを付ける事で、対象のブランチを削除する事ができる（`master`ブランチにマージされていないブランチは削除できない）。

`-D`オプションを付けると、強制的にブランチを削除する事ができる。

```bash
# ブランチを削除する（masterブランチにマージされていないブランチは削除されない）
$ git branch -d feature

# 強制的にブランチを削除する
$ git branch -D <ブランチ名>
```

# `git merge`

作業中のブランチを指定したブランチにマージする

```bash
# ローカルリポジトリのブランチにマージする
$ git merge <ブランチ名>

# リモートリポジトリのブランチにマージする
$ git merge <リモート名/ブランチ名>
$ git merge origin/master
```

# `git stach`

作業を一時避難する。

作業途中に、コミットせずにワークツリーの差分を元に戻したいときに使用する（急遽バグ対応などをする必要がある場合など）。

```bash
# 作業途中の変更分を一時避難する
$ git stash

# 避難した作業を確認する
$ git stash list

# 避難した作業を復元する（以下のコマンドは避難作業の復元と削除を同時に実行する）
$ git stash pop
```

# `git remote rename <旧リモート名> <新リモート名>`

リモート名を変更する

```bash
$ git remote rename origin tutorial      # リモート名がoriginからtutorialに変更される 
```

# `git remote rm <リモート名>`

ローカルリポジトリとリモートリポジトリの連携を削除する（リモートリポジトリの情報は削除されない）。

```bash
$ git remote rm origin
```

# `git branch -m <ブランチ名>`

現在作業しているブランチの名前を変更する。

```bash
$ git branch -m new_branch
```

# `.gitignore`

`.gitignore`に記載されているファイルは`git`で管理されない。

自動生成されるファイルやパスワードが記載されているファイルなどは`git`で管理しないように`.gitignore`に記載する。

```bash
# .gitignoreファイルについて

# #から始まる行はコメント

# 指定したファイルを除外
index.html

# ルートディレクトリを指定
/ronn.html

# ディレクトリ以下を除外
dir/

# /以外の文字列にマッチ「*」
/*/*.css
```

# `git rm <ファイル名>`

ファイルの削除を記録する。

```bash
# ファイル（ディレクトリ）ごと削除
$ git rm <ファイル名>
$ git rm <ディレクトリ名>

# ファイルを残したいとき
$ git rm --cached <ファイル名>
```

# `git mv <旧ファイル> <新ファイル>`

ファイルの移動を記録する（`linux`の`mv`コマンドと同じ機能）。

```bash
# 同様のコマンド①
$ mv <旧ファイル> <新ファイル>

# 同様のコマンド②
$ git mv <旧ファイル> <新ファイル>
$ git rm <旧ファイル> <新ファイル>
```

# `git config alias.<エイリアス> <コマンド>`

コマンドにエイリアスをつける（別名をつける）。

`--global`をつけるとPC全体の設定となる。

```bash
$ git config --global alias.ci commit
$ git config --global alias.st status
```