よく使うGitコマンド集

<h1>この記事の目的</h1>
これまで個人開発で、Gitを使っていましたが、たまにしか使わないコマンドは、使うたびに調べるという状況でした。

今回、Gitの学習をしたので、何度も同じこと調べないで済むよう、まとめておくことがこの記事の目的となります。

また、自分が見返したときに、わりやすいよう各コマンドにコメントを入れているので、初心者の方の参考にもなれれば幸いです。

<h1>よく使うGitコマンド集</h1>

<h3>ローカルリポジトリの新規作成</h3>
```
git init
```
現在のディレクトリに、「.git」ディレクトリが作成され、この中にGitに必要なファイルが保存されていきます。

<h3>リモートリポジトリの登録</h3>
```
git remote add <リモートリポジトリの名前（origin）> <GitHub等のURL>
```
リモートリポジトリを登録することで、次回からURLではなく、登録した名前でGitの操作をすることができるようになります。
なお、よく見かける「origin」というのは、デフォルトで使われる名前なので、他の名前を付けることも可能です。

<h3>リモートリポジトリを確認</h3>
```
git remote
git remote -v #URLまで確認できる
```
先ほど、登録したリモートリポジトリを確認したいときに使います。

<h3>ワークツリーでの変更をステージに追加</h3>
```
git add <ファイル名> #特定ファイルをステージに追加
git add <ディレクトリ名> #特定ディレクトリをステージに追加
git add . #全ての変更をステージに追加
```
変更したファイルは「git add」コマンドにより、いったんステージに追加します。
いきなりローカルリポジトリに記録するのではなく、いったんステージに追加することで、ワークツリーでの変更を任意の一塊（この塊単位でのちに出てくるコミットメッセージをつけることができます。）にしてローカルリポジトリに記録することができます。
複数ファイルを一度にステージに追加したい場合は、ファイル名をスペースで区切って入力します。

<h3>ステージに追加した変更をリモートリポジトリに記録（コミット）する</h3>
```
git commit
git commit -m "コミットメッセージ"
```
「-m」オプションを付けない場合は、エディタが開き、そこにコミットメッセージを入力することができます。
コミットメッセージは変更内容がわかるよう、簡潔に入力します。

<h3>現在の変更状況を確認する</h3>
```
git status
```
変更したファイルが、ステージに追加されているのか、コミットされているのかなど、現在の状況がわかります。
誤操作を避けるためにも、何かGitコマンドを使う前には、「git status」をする癖をつけておくと安心です。

<h3>ワークツリーでの変更内容を確認</h3>
```
git diff #全ての変更内容を確認
git diff <ファイル名> #特定ファイルの変更内容を確認
```
ステージに追加（git add）前の変更内容を確認することができます。
ステージに追加後の変更は確認でいないので、その場合は次のコマンドを使用します。

<h3>ステージでの変更内容を確認</h3>
```
git diff --staged
```
ステージに追加（git add）後の変更内容を確認することができます。

<h3>変更履歴を確認</h3>
```
git log
git log --oneline　#各変更履歴を1行で表示
git log -p <ファイル名>　#変更した内容まで含めて表示
```
「--oneline」や「-p」で、変更履歴の表示方法を変えることができます。目的に応じて使い分けてください。
※私は、「--oneline」がうまくいかないと思ったら、「--online」にしているということがありました。ご注意ください。

<h3>Gitからファイルを削除</h3>
```
git rm <ファイル名>
git rm -r <ディレクトリ名>
git rm --cached <ファイル名> #ワークツリーに残したい場合
```
ワークツリーに残したい場合というのは、パスワードが書かれたファイルなど、Git上にあることは好ましくないけど、削除できないようなファイルに使います。
また、このようなファイルは、「.gitignore」ファイルによりGit上にあげないようにすることが必要です。


<h3>ファイル名の変更</h3>
```
git mv <旧ファイル名> <新ファイル名>
```
ファイル名の変更後、ステージへの反映までされるので、変更後のaddコマンドは不要です。


<h3>ローカルリポジトリの内容をリモートリポジトリにアップ</h3>
```
git push origin <ブランチ名>
```
これで、プルリクエストを出したりといったGitHub等のリモートリポジトリ上での操作が可能となります。


<h3>ワークツリーでの変更を取り消し</h3>
```
git checkout -- <ファイル名> #特定ファイルの変更を取り消し
git checkout -- <ディレクトリ名> #特定ディレクトリの変更を取り消し
git checkout -- . #ワークツリーでの全ての変更を取り消し
```
ワークツリーで作業をしたけれど、やっぱり直前のコミットの状況まで戻したいときに使います。
注意点としては、「git add」する前までしか使えないということです。
また、後述するブランチの切り替えでも「checkout」を使うので、入力ミスに要注意です。

<h3>ステージへの変更を取り消し</h3>
```
git reset HEAD <ファイル名> #特定ファイルの変更を取り消し
git reset HEAD <ディレクトリ名> #特定ディレクトリの変更を取り消し
git reset HEAD . #ワークツリーでの全ての変更を取り消し
```
「git add」後であれば、こちらのコマンドを使用して取り消します。
ただし、あくまでステージへの変更を取り消す（「git add」前に戻す）のみなので、ワークツリーにも取り消しを反映させたいのであれば、本コマンドを実行後、上記の「git checkout　〜」をする必要があります。

<h3>直前のコミットを修正</h3>
```
git commit --amend　#エディタが開きます
git commit --amend -m "修正後のコミットメッセージ" #エディタは開きません
```
修正し忘れた内容をファイルに反映させたら、再度git addをしてから、こちらのコマンドを実行します。
ファイルの内容に変更がない場合（コミットメッセージをタイポしたなど）であれば、addコマンドは必要ありません。
なお、リモートリポジトリへのプッシュ後は、このコマンドによる修正はダメです。

<h3>リモートリポジトリから情報を取得する</h3>
```
git fethc <リモート名（origin）>
```
リモートリポジトリの情報をローカルリポジトリに取得します。
取得した情報は、remotes/origin/<ブランチ名>に保存されています。
あくまでも、ローカルリポジトリに取得するだけなので、ワークツリーには取得した情報は反映されません。

<h3>fetchで取得した情報をワークツリーに反映させる</h3>
```
git merge <リモート名（origin）>/<ブランチ名（main）>
```
<リモート名（origin）>/<ブランチ名（main）>というのは、fetchで取得された情報の保存場所を示しています。（「remotes/」は省略されています。）
なお、GitHubでは、２０２０年に、デフォルトブランチの名称が「master」から「main」に変更されています。
調べ物をするときは、記事が作成された時期も確認し、適宜読み替える必要があります。


<h3>リモートリポジトリから情報を取得して、ローカルリポジトリに反映させる</h3>
```
git pull origin main
git pull --rebase origin main　
```
pullは、前述のfetchとmergeを一度に行うコマンドです。「--rebase」オプションを使うことで、fetchとrebaseを一度に行うことも可能です。（rebaseは後ほど出てきます。）
注意点として、ローカルリポジトリの今いるブランチに変更が反映されるので、実行前に必ずブランチの確認をしましょう。


<h3>新しいブランチを作成</h3>
```
git branch <ブランチ名>
```
mainブランチは、リリースされているサービスのソースコードであることが多く、ここにいきなり「git push」することは、通常ありません。
なので、作業をする際は、こちらのコマンドでブランチを切ってから作業をします。(実際は、後述する「git checkout -b <ブランチ名>」を使用することがほとんどかと思います。)

<h3>ブランチの一覧を表示する</h3>
```
git branch
git branch -a #リモートブランチを含めて表示
```
ブランチの一覧が表示され、今いるブランチにはブランチ名の左に「*」が付きます。
「-a」オプションを使うと、「git fetch」で取得したリモートブランチについても、表示することができます。

<h3>ブランチの切り替え</h3>
```
git checkout <既存のブランチ名>
git checkout -b <新ブランチ名>　 #ブランチを新規作成して、そのまま切り替える
```
ワークツリーでの修正を取り消す際に出てきた「checkout」と同じなので、入力ミスに要注意です。
また、ブランチを新規作成する際には、とりあえずブランチを作るだけという状況はほとんどないかと思いますので、こちらのコマンドを使うと覚えておけばよいかと思います。

<h3>現在作業しているブランチ名の変更</h3>
```
git branch -m <ブランチ名>
```
タイポ等、ブランチ名を誤って作成した場合に使います。

<h3>ブランチを削除</h3>
```
git branch -d <ブランチ名>　#マージ済みの場合
git branch -D <ブランチ名> #マージ前の場合
```
誤って作成したブランチを削除したいときなど、マージ前のブランチを削除する場合は、大文字の「-D」を使う必要があります。

<h3>コミット履歴を整理した上で、変更を統合する</h3>
```
git rebase <ブランチ名>
```
変更を統合するという意味では、mergeと同じですが、rebaseでは、変更を統合したブランチのコミットを親コミットとするようにコミット履歴が変更されます。コミット履歴をどうしたいかで使い分けをします。
注意点としては、リモートリポジトリにプッシュしたコミットはrebaseをしてはいけないということです。（リモートリポジトリにプッシュができなくなります。）

<h3>コミットにタグを付ける</h3>
```
git tag -a <タグ名> -m "<メッセージ>"　＃詳細版タグ
git tag <タグ名> #簡易版タグ
git tag <タグ名> <コミット名> #過去のコミットにタグ付けする
git tag #作成したタグの一覧を表示する
git show <タグ名> #タグのデータを表示する
```
デプロイしたタイミング（コミット）がわかるようにタグを付けるといった使い方をします。
詳細版だと、メッセージやタグの作成者もあわせて記録できます。
過去のコミットにタグを付けたい場合は、git logでコミット名を確認しましょう。

<h3>タグをリモートリポジトリに送信する</h3>
```
git push <リモート名(origin)> <タグ名> #タグを個別に送信
git push <リモート名(origin)> --tags #全てのタグをまとめて送信
```
タグは通常のpushコマンドでは送信されないため、リモートリポジトリに送信するためには、上記のコマンドが別途必要となります。

<h3>コミットせずに作業を一時避難させる</h3>
```
git stash #変更を一時避難させる
git stash list #避難した作業の一覧を表示する
```
作業中に急遽別の作業が必要となったが、まだコミットするほどではないという状況の時に使います。


<h3>一時避難させた作業を復元する</h3>
```
git stash apply #最新の避難した作業を復元する
git stash apply --index #ステージ（addした後）の状況も含めて復元する
git stash apply <スタッシュ名> #特定の避難した作業を復元する
```
スタッシュ名は、上記の避難した作業の一覧から確認できます。

<h3>一時避難させた作業を削除する</h3>
```
git stash drop #最新の避難した作業を削除する
git stash drop <スタッシュ名> #特定の避難した作業を削除する
git stash clear #全ての避難した作業を削除する
```
削除しないと、どんどん一時避難した作業が増え続けるので、不要になったら削除します。

<h1>おわりに</h1>
単に学習するだけでなく、自分の頭で考えて、文字にすることで理解が深まったと感じています。
今後も、新たに使うようになったGitコマンドがあれば、随時追加していきたいと思います。

<h5>参考：学習教材</h5>
Git： もう怖くないGit！チーム開発で必要なGitを完全マスター
https://www.udemy.com/course/unscared_git/
Gitコマンドを使うことでどのように動くかを図を使って解説されており、イメージが掴みやすかったです。