Gitのコマンドをまとめてみた

今更ですが、Gitについて最近学び直しているので備忘メモとして簡単にまとめます。

それではいきます。

# Gitコマンド一覧

- Gitユーザー名の登録
```bash
$ git config --global user.name "任意のユーザー名"
```

- Gitユーザーのメールアドレスの登録
```bash
$ git config --global user.email 任意のメールアドレス
```

- Gitの設定一覧表示
```bash
$ git config --list
```
このコマンドで表示される内容の設定は「~/.gitconfig」に記載されていて、ファイルの中身はcatコマンドなどで確認できます。

- ワークツリーの変更をステージへ追加（＝ステージにインデックスを作成）

```bash
$ git add <ファイル名>
```

- 現在のファイル変更状況を確認
```bash
$ git status
```
ワークツリーとステージの差分は赤色の文字で、ステージとローカルリポジトリの差分は緑色の文字で表示されます。

- ワークツリーとステージの変更差分を確認
```bash
$ git diff
```
ステージとローカルリポジトリの変更差分を確認する場合は、以下のコマンドを使用します。

- ステージとローカルリポジトリの変更差分を確認
```bash
$ git diff --staged
```

- 変更（コミット）履歴を確認
```bash
$ git log
```

- 変更（コミット）履歴を一行ずつで確認

```bash
$ git log --oneline
```

- 変更（コミット）履歴の変更差分のみを確認
```bash
$ git log -p
```
「-p」の後ろにスペースを開けて、ファイル名を追加することで特定のファイルに絞って確認することができます。

- 変更（コミット）履歴を表示数を制限して確認
```bash
$ git log -n コミット数
```

- ワークツリーとローカルリポジトリの両方からファイル（またはディレクトリ）を削除
```bash
$ git rm ファイル名（またはディレクトリ名）
```

- ローカルリポジトリからのみファイル（またはディレクトリ）を削除
```bash
$ git rm --cached ファイル名（またはディレクトリ名）
```

- ファイルを移動（またはリネーム）
```bash
$ git mv 旧ファイル名 新ファイル名
```
上のmvコマンドを実行すると、ワークツリーだけでなくステージにも変更が反映された状態になります。すなわち、変更後git addした状態になるということです。
ディレクトリを移動する場合は、ファイル名の部分にディレクトリパスを入力すれば可能です。

- ローカルPCのディレクトリをリモートリポジトリへ登録
```bash
$ git remote add origin リモートリポジトリのURL
```
「git remote add」の部分でリモートリポジトリを登録して、その後の「origin」で今後使用するリモートリポジトリの省略名を設定します。
また、使う機会はあまりないかもしれませんが、複数のリモートリポジトリを設定することもできます。
- リモートリポジトリに変更を反映
```bash
$ git push リモート名 ブランチ名
```
リモート名は「origin」が多いですかねー。

- Gitコマンドにエイリアスを登録
```bash
$ git config --global alias.エイリアス名 エイリアス登録するコマンド
```
例としては、「git config --global alias.abc commit」のような感じです。
「--global」をつけた場合は、ホームディレクトリ配下の「~/.gitconfig」ファイルに設定が反映されます。
「--global」をつけない場合は、コマンドを実行した際にいるプロジェクトの「.git/config」ファイルに設定が反映されます。

- ワークツリーの変更を取り消す（＝ステージの状態に戻す）
```bash
$ git checkout -- ファイル名（またはディレクトリ名）
```
「checkout」コマンドはブランチを切り替える時にも使用しますが、ブランチの切り替えなのか、ファイルの変更取り消しなのかを区別するために「--」がついています。
また、前回のaddコマンド実行時からの全ファイルの変更を取り消したい場合は、「git checkout -- .」のコマンドで取り消すことができます。
- ステージに追加した変更を取り消す（＝最新のコミットの状態に戻す）
```bash
$ git reset HEAD ファイル名（またはディレクトリ名）
```
「git reset HEAD .」とすると、全ファイルの変更が前回のコミットの状態に戻ります。
また、このコマンドのみではワークツリーの変更は元に戻らないので注意が必要です。
ワークツリーも元に戻したい場合は、このresetコマンドを実行した後、前述のcheckoutコマンドを実行しましょう。
- 直前のコミットをやり直す
```bash
$ git commit --amend
```
最新のステージの状態で最新のコミットをやり直します。
一点注意点があり、リモートリポジトリへ既にプッシュしてしまった変更は取り消さないようにしましょう。他の人の余計な混乱を招く可能性があります。
既にリモートへプッシュしてしまった後に変更したい場合は、新しいコミットを作成してプッシュし直しましょう。
- リモートリポジトリの情報を表示
```bash
$ git remote
```
「git remote -v」と入力するとより詳細な情報を確認することができます。
- リモートリポジトリのより詳細な情報を表示
```bash
$ git remote show リモート名
```
リモート名は「origin」などが入ります。
- リモートの情報を変更
```bash
$ git remote rename 旧リモート名 新リモート名
```
- リモートの情報を削除
```bash
$ git remote rm 旧リモート名 新リモート名
```
当たり前ですが、ロケールのリポジトリから指定したリモートリポジトリの情報が削除されるだけで、リモートリポジトリが削除されるわけではありません。
- リモートの情報を変更・削除
```bash
$ git remote rename 旧リモート名 新リモート名
```
- リモートから情報を取得
```bash
$ git fetch リモート名
```
リモート名は「origin」などとなります。
このコマンドでローカルリポジトリへリモートのブランチとコミットの情報が取得されますが、ワークツリーへは反映されないことに注意してください。
ワークツリーに取り込む場合は以下のコマンドを実行しましょう。
- 別ブランチの変更を現在のワークツリーへ反映する
```bash
$ git merge ブランチ名
```
マージ先のブランチはコマンド実行時にチェックアウトしているブランチとなります。
ブランチ名を「origin/main」のようにすることで、前述のfetchコマンドで取ってきた情報を現在のワークツリーへ反映することができます。
「origin」をつけずにブランチ名だけ（featureなど）を指定すると、そのローカルのブランチの内容をマージすることができます。
また、マージ先ブランチの最新コミット履歴にマージされた側のコミット履歴が追加され、マージ先ブランチの最新コミットが新たに作られ更新されます。（例：masterにfeatureを取り込んだ場合、masterの最新コミット履歴にfeatureの最新コミット履歴が追加され、masterの最新コミットはfeatureでコミットしたものとなる。）
- リモートからデータを取得してマージ
```bash
$ git pull リモート名 ブランチ名
```
pullコマンドは、fecth → mergeの順番でコマンドを実行した場合と同じ挙動となります。
マージ先のブランチはコマンド実行時にチェックアウトしているブランチになる点に注意しましょう。
- リモートからデータを取得してリベース
```bash
$ git pull --rebase リモート名 ブランチ名
```
rebaseで取り込むことで、マージコミットがコミット履歴に残らないようになります。 シンプルにローカルブランチを最新に更新したい時に使用しましょう。
- ローカルのブランチ一覧を表示
```bash
$ git branch
```
「-a」オプションを付けることによって、リモートのブランチもすべて表示されます。
- ローカルにブランチを新規作成
```bash
$ git branch ブランチ名
```
- リモートブランチからローカルブランチを新規作成
```bash
$ git branch ブランチ名 リモートブランチ名
```
例としては「git branch feature origin/feature」のような感じです。
- ブランチ名を変更
```bash
$ git branch -m 新ブランチ名
```
コマンド実行時にチェックアウトしているブランチの名前が変更されます。
- ブランチを削除
```bash
$ git branch -d ブランチ名
```
masterにマージされていない変更が残っている場合は警告が出て削除はされません。 「-d」の部分を「-D」に変更することで、警告を無視して強制削除できます。
- ブランチを切り替え
```bash
$ git checkout ブランチ名
```
「git checkout -b ブランチ名」のように「-b」オプションを付けることで、ブランチの作成と切り替えを同時に行うことができます。
- リモートブランチからローカルブランチを作成して切り替え
```bash
$ git checkout -b 作成するローカルブランチ名 リモートブランチ名
```
「git checkout -b feature origin/feature」のような感じです。
- ブランチの履歴（親コミット）を更新する
```bash
$ git rebase ブランチ名
```
コマンド実行時にチェックアウトしているブランチの履歴（親コミット）を更新します。
featureブランチで作業をしている途中に、最新のmasterブランチの内容を取り込みたい場合などで使用します。
もちろん、masterへfeatureを取り込むことの可能です。
一点、一度リモートへプッシュしたコミットが最新の状態ではrebaseコマンドは実行しないようにしましょう。
リモートリポジトリとのコミット履歴の整合性が合わず、プッシュできなくなります。
- 過去のコミットを修正する・まとめる
```bash
$ git rebase -i HEAD~数字
```
このコマンドは実行後のステップが他のコマンドより少し複雑ですが、こちらの記事がわかりやすくまとめられていました。
- タグを作成する
```bash
$ git tag タグ名
```
コマンド実行時にチェックアウトしているブランチの最新コミットにタグ付けされます。
- 既存のコミットにタグを作成する
```bash
$ git tag タグ名 コミットID
```
- 注釈付きタグを作成する
```bash
$ git tag -a タグ名 -m "タグの説明"
```
こちらもコマンド実行時にチェックアウトしているブランチの最新コミットにタグ付けされます。
- 既存のコミットに注釈付きタグを作成する
```bash
$ git tag -a タグ名 -m "タグの説明" コミットID
```
- タグの一覧を表示する
```bash
$ git tag
```
上記コマンドの後ろに「-l 文字列」とオブションを追加することで、指定した文字列で始まるタグのみを表示することができます。
- タグの詳細を表示する
```bash
$ git show タグ名
```
- ローカルの全タグの情報をリモートへ反映
```bash
$ git push origin --tag
```
- ローカルの特定のタグの情報をリモートへ反映
```bash
$ git push origin タグ名
```
- 作業を一時退避する
```bash
$ git stash
```
ワークツリーとステージの変更が一時退避されます。
現在のブランチで変更をコミットしたくないが、別のブランチにチェックアウトしたい場合などに使用します。
- 一時退避した（stashした）変更の一覧を確認
```bash
$ git stash list
```
- 一時退避した（stashした）変更をワークツリーに復元
```bash
$ git stash apply
```
一番最後にstashした内容が復元されます。
また、このコマンドだけではステージに追加した内容は退避されないことに注意しましょう。
ステージにも復元したい場合は以下のコマンドを実行します。
- 一時退避した（stashした）変更をワークツリーとステージに復元
```bash
$ git stash apply --index
```
- 一時退避した（stashした）特定の変更を復元
```bash
$ git stash apply stash@{スタッシュ番号}
```
スタッシュ番号は「git stash list」コマンドで確認しましょう。
- 一時退避した（stashした）作業を削除する
```bash
$ git stash drop
```
dropの後に「stash@{スタッシュ番号}」をつけると特定の退避作業を、
「clear」をつけるとすべての退避中作業が削除されます。

コマンドは他にもあると思いますが、以上です。

---

【宣伝】
Next.jsを使って技術系ブロクを作りました。
めちゃくちゃのんびり投稿しているので記事は少ないですが、よかったら見てやってください。
こちら
↓
https://www.nattomatofu.com/