Gitでよく使うコマンドやオプション

Gitで個人的によく使うコマンドやオプションを簡単にまとめています。

このページの目的と動作環境

最終更新日:2022/12/17

Gitは仕事でのプログラミング開発現場で必須のツールですが、個人で何かウェブサイトやアプリを開発する時や独学でプログラミングの学習する時も、gitによるバージョン管理はバックアップになるので非常に便利で使えます。

また、Gitを使うためのGUIツールやプラグインは色々ありますが、コマンドラインのgit操作を一度覚えて慣れてしまえば、汎用性があって色々な場面で同じように使えるので、コマンドgitの方が楽になります。

という事でここではgitコマンドで個人的によく使うコマンドをまとめています。

■以下の環境で試しています。
OS:macOS Big Sur(バージョン11.7.1)

$ git version
git version 2.32.0 (Apple Git-132)

Gitでよく使うコマンド

■git helpコマンド。gitコマンド一覧の簡単なヘルプを表示する。

$ git help
〜
git helpの後にサブコマンドを指定すると、指定したサブコマンドの詳細ヘルプを見れる。
$ git help checkout

■git initコマンド。Gitのリポジトリを作る。

$ git init
Initialized empty Git repository in /Users/hogeuser/tmp/testgit/hogedir/.git/

[master #]$ ls -a
.    ..   .git
コマンドを実行したディレクトリがGitリポジトリになり、そのディレクトリ内がGit管理下になって、色々なgitコマンドが実行できるようになる。あと、コマンド実行後、.gitディレクトリが生成されている。

Gitのバージョンによってはgit initコマンド実行時に「hint:〜」の警告が出る。

$ git init
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint: 
hint: 	git config --global init.defaultBranch <name>
hint: 
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint: 
hint: 	git branch -m <name>
Initialized empty Git repository in /Users/hogeuser/tmp/testgit/hogedir/.git/

この警告メッセージをDeepL翻訳で翻訳するとこんな感じです。

「初期ブランチの名前として 'master' を使用します。このデフォルトのブランチ名は変更される可能性があります。新しいリポジトリで使用する初期ブランチ名を設定し、この警告を表示しないようにするには、以下を実行します。

git config --global init.defaultBranch <name> を実行します。

master' の代わりによく使われる名前は 'main'、'trunk'、'development' などです。作成したばかりのブランチは、このコマンドで名前を変更することができます。

git branch -m <name>」

警告内容は、なんかブランチ名の話で初期ブランチ名をmasterにするけど、警告を表示しないようにするには初期ブランチ名を設定してねっていう意味だと思います。ですので初期ブランチが名がmasterのままで良ければスルーでいいと思う。

ちなみに、git initコマンドでディレクトリをGitリポジトリ(Git管理下)にしたけど、やっぱりGitリポジトリ管理をやめて元のディレクトリに戻したい場合、.gitディレクトリ(ローカルGitリポジトリ)を削除すればいい。

[master]$ rm -rf .git

■Gitの共有リポジトリ(bareリポジトリ)を作るには、git initコマンドに--bareオプションを付ける。

$ git init --bare
Initialized empty Git repository in /Users/hogeuser/tmp/testgit/hogebaredir/

[BARE:master]$ ls -a
.           ..          HEAD        config      description hooks       info        objects     refs
コマンドを実行したディレクトリがGit共有リポジトリになる。
通常のリポジトリと違い、共有リポジトリは実行できるgitコマンドが限られている。例えば、git addやgit commitは実行エラーになるが、git logは実行できてGit共有リポジトリでもコミットログを見る事はできる。

■git addコマンド。Gitの作業ディレクトリ(ワークツリー)からステージングエリア(インデックス)に移動する。

[master #]$ git add hoge.txt
hoge.txtファイルをステージングエリアに移動しました。
作業ディレクトリからステージングエリアに移動したいファイルが複数あって、ファイル名を全て指定するのが面倒な場合は、.(ドット)を指定すれば一気に全ての作業ディレクトリのファイルをステージングエリアに移動できる。
[master #]$ git add .

■git commitコマンド。ステージングエリアからリポジトリにコミットする。

[master +]$ git commit
〜
git commitコマンド実行時にコマンドライン上でコミットログを書きたい時は、-mオプションを使う。
[master +]$ git commit -m 'hoge.txtファイルの修正。'
直前のコミットログを修正したい場合や、現状のステージングエリアのファイルを直前のコミットにまとめたい場合は、--amendオプションを使う。
[master]$ git commit --amend

■git logコマンド。過去のコミットログを見る。

[master]$ git log
commit 6b8c56b70〜 (HEAD -> master)
Author: hoge name <hogehoge@hogehoge.jp>
Date:   Thu Dec 15 00:46:31 2022 +0900

    hoge.txtファイルの修正(amendで修正)。

commit 1e38c662〜
Author: hoge name <hogehoge@hogehoge.jp>
Date:   Thu Dec 15 00:43:29 2022 +0900

    hoge.txtファイルの作成。
--onelineオプションを付ければ、コミットログ1つを1行で表示してくれるので凄く見やすい。
[master]$ git log --oneline
6b8c56b (HEAD -> master) hoge.txtファイルの修正(amendで修正)。
1e38c66 hoge.txtファイルの作成。
--statオプションを付ければ、コミットログだけでなく変更されたファイルも表示してくれる。
[master]$ git log --stat
-pオプションを付ければ、コミットログだけでなく変更箇所も表示してくれる。
[master]$ git log -p

■git statusコマンド。現在のGit管理の状態を表示する。作業ディレクトリやステージングエリアのファイルがあるなら表示してくれる。

[master *]$ git status
〜

■git diffコマンド。作業ディレクトリ(ワークツリー)とリポジトリ(コミット)の差分(ファイル内の変更箇所)を表示する。

[master *]$ git diff
git diffの後にファイルを指定すれば、そのファイルの差分だけを表示する。
[master *]$ git diff hoge.txt
--stagedオプションを付けると、ステージングエリア(インデックス)とリポジトリ(コミット)の差分を表示する。
[master +]$ git diff --staged
[master +]$ git diff --staged hoge.txt

■git branchコマンド。ブランチのリストを表示する。

[master]$ git branch
新規ブランチを作成したい場合、git branchコマンドの後に作成したいブランチ名を指定する。developブランチを作成してみる。
[master]$ git branch develop
ブランチを削除したい場合、-dオプションで削除したいブランチを指定する。
[master]$ git branch -d develop
Deleted branch develop (was a4d481d).
ただ、削除しようとしたブランチの内容に修正(コミット)がある場合、完全にマージされてないよというエラーが出てブランチの削除ができない。
[master]$ git branch -d develop
error: The branch 'develop' is not fully merged.
If you are sure you want to delete it, run 'git branch -D develop'.
エラーが出ても構わずブランチを削除したい場合、エラーメッセージにある通り-Dオプションを指定すれば削除できる。
[master]$ git branch -D develop

■git checkoutコマンド。ブランチを切り替える。developブランチに切り替えてみる。

[master]$ git checkout develop
Switched to branch 'develop'
[develop]$

■git switchコマンド。git switchもブランチを切り替える。developブランチに切り替えてみる。

[master]$ git switch develop
Switched to branch 'develop'
[develop]$
git switchはGitバージョン2.23で追加されたコマンドらしくgit checkoutよりも新しい。だからブランチ切り替えの時はgit switchを使った方が良いのかもしれない。
ちなみに新しくブランチを作り、同時にその作ったブランチに切り替えるには、-cオプションでできる。
[develop]$ git switch -c webbra
Switched to a new branch 'webbra'
[webbra]$ 

■git mergeコマンド。あるブランチのコミット内容を別のブランチに取り入れる(マージする)。
masterブランチにいる状態でgit mergeでdevelopブランチを指定すると、developのコミット内容をmasterにマージする事ができる。

[master]$ git merge develop
両方のブランチの同じ箇所を修正していてgit mergeを実行した場合、コンフリクト(衝突)が発生する。
[master]$ git merge develop 
Auto-merging moge.txt
CONFLICT (content): Merge conflict in moge.txt
Automatic merge failed; fix conflicts and then commit the result.
コンフリクトが発生した場合、コンフリクト箇所を修正してgit addとgit commitをすれば解決できる。

■git rmコマンド。Gitバージョン管理下にあるファイルを削除する場合、git rmコマンドを使う。

[master]$ git rm moge.txt
git rmコマンドでファイル(moge.txt)を削除した後にlsコマンドで確認するとファイルは削除されて無くなっているが、git statusコマンドで状態を確認するとステージングエリアにいる状態なので、ちゃんとgit commitしてあげる。
[master +]$ ls
hoge.txt
[master +]$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	deleted:    moge.txt

[master +]$ git commit -m 'moge.txtファイルを削除した。'

ちなみにGit管理下にあるファイルを削除するのではなく、ファイルは消さずに残すけどGitバージョン管理の対象外にしたい場合、.gitignoreファイルを作成してそのファイルにGit管理の対象外にしたいファイルやディレクトリを書けばいい。

アマゾンでGit・GitHubの入門書・実践本を探す[広告]

■git mvコマンド。Gitバージョン管理下にあるファイルを移動する場合、git mvコマンドを使う。

[master]$ git mv hoge.txt tmp/
git rmコマンドと同じで、git mvコマンドを実行した後にgit statusコマンドで状態を確認するとステージングエリアにいる状態なので、ちゃんとgit commitしてあげる。
[master +]$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	renamed:    hoge.txt -> tmp/hoge.txt

[master +]$ git commit -m 'hoge.txtファイルをtmpディレクトリへ移動した。'

■git resetコマンド。元のある状態に戻したい場合、git resetコマンドを使う。バックアップみたいに使えるから便利。
--hardオプションとコミットIDを指定すると、指定したコミットIDの状態まで戻れる。コミットIDはgit logで確認できる。また、指定するコミットIDは7桁あれば良いのでgit log --onelineオプションで表示するコミットIDを指定すればいい。

[develop]$ git log --oneline
89e969e (HEAD -> develop) moge.txtの修正。moge3の追加。
74c20dd (master) コンフリクトを解消。
c6c6c8f moge2.txtを追加。moge22を追加。
145c8d0 moge.txtの修正。moge2を追加。
489cc06 moge.txtファイルの作成。
d8492bd hoge.txtファイルをtmpディレクトリへ移動した。
c25336c moge.txtファイルを削除した。
a4d481d moge.txtファイルの作成。

[develop]$ git reset --hard c6c6c8f
HEAD is now at c6c6c8f moge2.txtを追加。moge22を追加。

[develop]$ git log --oneline
c6c6c8f (HEAD -> develop) moge2.txtを追加。moge22を追加。
489cc06 moge.txtファイルの作成。
d8492bd hoge.txtファイルをtmpディレクトリへ移動した。
c25336c moge.txtファイルを削除した。
a4d481d moge.txtファイルの作成。
6b8c16a hoge.txtファイルの修正(amendで修正)。
1e35a66 hoge.txtファイルの作成。
元のある状態に戻すのが少し不安な場合、新しいブランチを作ってそのブランチでやればいい。そうすればやっぱり戻す必要なんて無かった…なんて後悔がなくなる。ちなみに--hardオプションにORIG_HEADを指定すれば、直前のgit resetの実行を無かった事にできるけど、やっぱり新しいブランチを作ってそこで色々と試した方が安心だし簡単だと思う。
[develop]$ git reset --hard ORIG_HEAD

何もオプションを付けずにgit resetでコミットIDを指定すると、コミットポイントは戻す事ができるがファイル自体の修正は戻らない(git statusコマンドで確認できる)。だから、コミットは取り消したいけどファイル修正を元に戻したくない場合に使える。

[develop]$ git log --oneline
c6c6c8f (HEAD -> develop) moge2.txtを追加。moge22を追加。
489cc06 moge.txtファイルの作成。
d8492bd hoge.txtファイルをtmpディレクトリへ移動した。
c25336c moge.txtファイルを削除した。
a4d481d moge.txtファイルの作成。
6b8c16a hoge.txtファイルの修正(amendで修正)。
1e35a66 hoge.txtファイルの作成。

[develop]$ git reset d8492bd

[develop]$ git log --oneline
d8492bd (HEAD -> develop) hoge.txtファイルをtmpディレクトリへ移動した。
c25336c moge.txtファイルを削除した。
a4d481d moge.txtファイルの作成。
6b8c16a hoge.txtファイルの修正(amendで修正)。
1e35a66 hoge.txtファイルの作成。

[develop]$ git status
On branch develop
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	moge.txt

あと、直前のコミットポイントにはHEADという名前が付いているので(git logでも確認できる)、直前のコミットポイントに戻りたい場合は--hardオプションにHEADを指定すれば戻れる。

[develop *]$ git log --oneline
c6c6c8f (HEAD -> develop) moge2.txtを追加。moge22を追加。
489cc06 moge.txtファイルの作成。
d8492bd hoge.txtファイルをtmpディレクトリへ移動した。
c25336c moge.txtファイルを削除した。
a4d481d moge.txtファイルの作成。
6b8c16a hoge.txtファイルの修正(amendで修正)。
1e35a66 hoge.txtファイルの作成。
[develop *]$ git status
On branch develop
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   moge.txt

[develop *]$ git reset --hard HEAD

[develop]$ git log --oneline
c6c6c8f (HEAD -> develop) moge2.txtを追加。moge22を追加。
489cc06 moge.txtファイルの作成。
d8492bd hoge.txtファイルをtmpディレクトリへ移動した。
c25336c moge.txtファイルを削除した。
a4d481d moge.txtファイルの作成。
6b8c16a hoge.txtファイルの修正(amendで修正)。
1e35a66 hoge.txtファイルの作成。
[develop]$ git status
On branch develop
nothing to commit, working tree clean
ただもちろんHEADじゃなくてコミットIDを指定しても戻れるしそっちの方が汎用性があるので、個人的にはgit resetコマンドを使う時はコミットIDを指定すればいいかなと思っている。

■git configコマンド。色々とリポジトリの設定やグローバルオプションの設定をしたり、設定情報を確認できる。
-lオプションを付けると、Gitリポジトリやグローバルオプションの設定一覧を確認できる。例えば、Gitユーザのメールアドレスや名前の設定、エイリアスコマンド、リモートリポジトリなどの情報がわかる。

[develop]$ git config -l
gitを使用するユーザのグローバルなユーザ名とメールアドレスを設定するには、--globalオプションでuser.name、user.emailを指定して設定する。
[develop]$ git config --global user.name "hoge name"
[develop]$ git config --global user.email "hogehoge@hogehoge.jp"
ユーザ名・メールアドレスを設定できたかどうかは、すぐ上でも書きましたが-lオプションで確認できる。

よく使うコマンドにエイリアス(別名)を設定したい場合も、"git config --global 〜"で設定できる。
例えば、git statusコマンドをgit stで実行できるようにするエイリアス設定です。

[master]$ git config --global alias.st status
これでgit stコマンドを実行できるようになる。

また、オプション付きのコマンドをエイリアス設定したい場合は、設定時にコマンドを""(ダブルクォーテーション)で囲む。 例えば、git log --onelineコマンドをgit logoneで実行できるようにするエイリアス設定です。

[master]$ git config --global alias.logone "log --oneline"
これでgit logoneコマンドを実行できるようになる。

設定したエイリアスコマンドの確認は、git config -lコマンドでできる。

エイリアスコマンドの設定を解除したい場合、git config --globalに--unsetオプションも付ける。

[master]$ git config --global --unset alias.st
[master]$ git config --global --unset alias.logone

また、~/.gitconfigファイルでもエイリアスコマンドの設定を確認できるし、このファイルを直接編集してエイリアスコマンドを設定したり解除したりもできる。

■git grepコマンド。
git grepコマンドは、macOSやLinuxのgrepコマンドと同じ使い方ができる。じゃあこの2つの違いは何かというと、ただのgrepはgitバージョン管理下にないファイルも含めて全てのファイルを検索対象にしてしまうが、git grepはgitバージョン管理下にあるファイルのみを検索対象にする(.gitignoreで指定したファイルだけでなく、.gitディレクトリなどgitバージョン管理下にないファイルは結構ある)。だからgit grepの方が検索速度が圧倒的に速いというメリットがある。なので、gitリポジトリ内でgrepしたい時は、git grepコマンドを使用する方が良い。

コマンド例として、カレントディレクトリ(サブディレクトリも含む)のgit管理下のファイルを対象にhogehogeという文字列(大文字小文字区別無し)をgrep検索する。

[master]$ git grep -ir hogehoge .

Kindle Unlimitedなら対象の本が定額で読み放題 [広告]
対象本には、プログラミングなどのIT関連本、マンガ、雑誌、ビジネス書などがたくさんあります!

■git remoteコマンド。
git remote addコマンドはリモートリポジトリの設定ができる。一般的にリモートリポジトリは、GitHubのリポジトリやサーバやクラウド環境のgit共有リポジトリ(bareリポジトリ)などを指定すると思う。けど自分のパソコンの適当なディレクトリをリモートリポジトリに設定できる。

例えば、AWSのec2上に作った共有リポジトリをリモートリポジトリに設定してみる。前提としてec2へのSSH接続設定は~/.ssh/configファイルで設定済みで、ssh ec2hostコマンドでSSH接続できる。また、ec2の/home/ec2-user/ec2web.gitディレクトリに共有リポジトリ(bareリポジトリ)を作成済み。共有リポジトリは"git init --bare"コマンドで作れる。
それでは、ec2上の共有リポジトリをリモートリポジトリに設定する。

[master]$ git remote add origin ssh://ec2-user@ec2host/home/ec2-user/ec2web.git
originはリモートリポジトリに付けた名前、ec2-userはec2へのSSHログインユーザ、ec2hostはec2のホスト名(~/.ssh/configファイルで設定したHost名)、ec2web.gitはec2上で建てた共有リポジトリ(bareリポジトリ)。

リモートリポジトリの設定の確認は、git remote -vコマンドかgit config -lコマンドでできる。

[master]$ git remote -v
origin	ssh://ec2-user@ec2host/home/ec2-user/ec2web.git (fetch)
origin	ssh://ec2-user@ec2host/home/ec2-user/ec2web.git (push)
[master]$ git config -l | grep remote
remote.origin.url=ssh://ec2-user@ec2host/home/ec2-user/ec2web.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
リモートリポジトリの設定の取り消しは、git remote rmコマンドでできる。
[master]$ git remote rm origin

■git pushコマンド。
ローカル環境のgitリポジトリの内容をリモートリポジトリ(共有リポジトリ)にアップして更新する(ローカル環境のgitリポジトリとリモートの共有リポジトリの同期を取る)。
設定したoriginというリモートリポジトリにmasterブランチの内容をpushしてみる。

[master]$ git push origin master

■git cloneコマンド。共有リポジトリの内容をクローン(複製)する。
共有リポジトリ(ssh://ec2-user@ec2host/home/ec2-user/ec2web.git)を、適当なec2webdirディレクトリを作成してそこにクローンする。

$ git clone ssh://ec2-user@ec2host/home/ec2-user/ec2web.git ec2webdir
問題なくクローンできればec2webdirディレクトリがgitリポジトリになり、git remote -vコマンドでリモートリポジトリの設定を確認すると、共有リポジトリがリモートリポジトリに設定されている事が確認できる。
[master]$ git remote -v
origin	ssh://ec2-user@ec2host/home/ec2-user/ec2web.git (fetch)
origin	ssh://ec2-user@ec2host/home/ec2-user/ec2web.git (push)
リモートリポジトリ名はoriginになっている。

■git pullコマンド。
リモートリポジトリの内容(最新コミット)をローカルのgitリポジトリに取り入れる(同期を取る)。
設定済みのoriginというリモートリポジトリのmasterブランチを、ローカルのgitリポジトリに取り入れる。

[master]$ git pull origin master

Figをインストールしてのコマンドライン操作を快適にする。gitコマンドでも使える。

Figという便利なツールの紹介です。macOSにFigをインストールする事で、ターミナルでコマンド入力する時にコマンドの入力候補を提案してくれるようになります。
Figのコマンド操作の自動補完機能の例

Figの自動補完機能は強力なので、Figを導入すればコマンド操作がより快適になると思います。そして、Figはgitコマンドでも有効なので、gitのサブコマンドやオプション入力時に助けになってくれます。

Figのインストール方法については別ページで紹介していますので、興味のある方は参考にしてください。
Figをインストールしてコマンド操作を自動補完で快適にする

EclipseのSpring BootプロジェクトのソースをGitで管理する。ec2、さくらのレンタルサーバ、vagrant上にgit共有リポジトリを作る

gitコマンドの具体的な使用例として、別ページでEclipseで開発しているSpring BootプロジェクトをGitで管理する方法を書いています。
EclipseのSpring BootをGitで管理する。更にリモート環境でGit共有リポジトリ管理も

また、AWSのec2、さくらのレンタルサーバ、vagrant仮想マシン上にgit共有リポジトリ(bareリポジトリ)を建てて、gitリモート管理する方法についても別ページで説明しています。
ec2、さくらのレンタルサーバ、vagrant上にgit共有リポジトリを作る