Gitのコマンドは暗記するものではなく、引くものです。この記事は読み物ではなく表として作りました。サンプル料理教室のホームページ website を例に、場面ごとに使うコマンドを並べ、主なものには実際に動かした表示を付けています。AIが提案してきたコマンドの意味を確かめるときも、ここで引けます。読み終わるというより、困ったときに開いて、打っていいコマンドかどうかを判断できるようになる記事です。
この記事の内容
先に答えると
毎日使うのは7つで、ほかは必要になってから引けば足ります。消えて困るコマンドは6つだけ覚えておきます。
- 毎日の7つは
git status、git diff、git add、git commit、git push、git pull、git switchです - 迷ったら
git statusを打ちます。何も変わらず、次に打つコマンドの案内まで出ます - 打っても何も変わらないのは、
status、log、diff、show、blame、reflogです - 危ないのは
reset --hard、push --force、clean -fd、checkout .、rebase、branch -Dです - コミットしたものはほぼ戻せます。コミットしていないものは戻せません
コミットは、変更を1回分の記録として残すことです。ここからの表示は、一時フォルダに作った練習用の送り先を相手に動かしたものです。そのため送り先がフォルダの形で出ます。b60a52e のような番号はコミットの番号で、毎回違う値になります。

始める:init・clone・config
| コマンド | すること | 例 |
|---|---|---|
git init | 今のフォルダをGitの管理下に置く | git init website |
git clone | 送り先のリポジトリを手元に複製する | git clone URL |
git config | 名前やメールなどを設定する | git config --global user.name "代表" |
リポジトリは、ファイルと履歴をまとめて入れておく箱です。既存のものを受け取るならclone、新しく始めるならinitです。詳しくは「git clone・pull・fetchの違い:受け取る操作の使い分け」にあります。
$ git init website
Initialized empty Git repository in .../website/.git/
$ git clone remote/website.git b-website
Cloning into 'b-website'...
done.
状態を見る:status・log・diff・show・blame
ここは何度打っても壊れません。
| コマンド | すること |
|---|---|
git status | 今どの枝にいて、何が変わっているか |
git log | コミットの履歴 |
git diff | まだ git add していない変更の中身 |
git diff --staged | git add 済みで、次のコミットに入る変更の中身 |
git show | 1つのコミットの中身 |
git blame ファイル | 各行を最後に変えたコミットと人 |
$ git status
On branch main
Your branch is up to date with 'origin/main'.
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: menu.html
no changes added to commit (use "git add" and/or "git commit -a")
$ git diff
diff --git a/menu.html b/menu.html
index 1ccb69c..529342b 100644
--- a/menu.html
+++ b/menu.html
@@ -1,2 +1,2 @@
<h1>料金表</h1>
-<p>和食の基本 6,000円</p>
+<p>和食の基本 6,200円</p>
$ git blame menu.html
^b60a52e (代表 2026-11-08 01:09:11 +0900 1) <h1>料金表</h1>
e7c061b9 (代表 2026-11-08 01:09:11 +0900 2) <p>和食の基本 6,200円</p>
- が消した行、+ が足した行です。
よく使う付け方
| 付け方 | 分かること |
|---|---|
git log --oneline | 1コミット1行の履歴 |
git log --oneline --graph --all | 全部の枝を線の図つきで |
git log --oneline -- menu.html | そのファイルを変えたコミットだけ |
git log --author=代表 | その人のコミットだけ |
git log --since=1.week | この1週間のコミットだけ |
git show HEAD~1:menu.html | 1つ前の版のファイルの中身 |
git status -sb | 短い表示。枝と、送り先との差も出る |
HEAD は今いる場所のコミット、HEAD~1 はその1つ前です。
$ git log --oneline --graph --all --decorate -5
* 1abe085 (HEAD -> main) 和食の料金を修正
* dfe77db (origin/main, origin/HEAD) 夏の教室を追加
* e7c061b 料金表を修正
* b60a52e 最初の版
$ git show HEAD~1:menu.html
<h1>料金表</h1>
<p>和食の基本 6,000円</p>
(2つ目の表示は、1つ目より前の時点で打ったものです。)
保存する:add・commit
| コマンド | すること |
|---|---|
git add ファイル | 次のコミットに入れるものを選ぶ |
git add . | 今のフォルダの変更を全部選ぶ。.env なども入るので注意 |
git commit -m "題名" | 選んだものを履歴に残す |
$ git add menu.html
$ git diff --staged --stat
menu.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
$ git commit -m "料金表を修正"
[main e7c061b] 料金表を修正
1 file changed, 1 insertion(+), 1 deletion(-)
詳しくは「git add・commit・pushの違い:保存して送るまでの流れ」にあります。
送る・受け取る:push・pull・fetch・remote
| コマンド | すること | 手元のファイル |
|---|---|---|
git push | コミットを送る | 変わらない |
git push -u origin 枝 | 新しい枝を初めて送る | 変わらない |
git fetch | 送り先の更新を受け取るだけ | 変わらない |
git pull | 受け取って、今の枝に反映する | 変わる |
git remote -v | 送り先のURLを見る | 変わらない |
origin は送り先につけた呼び名です。外注エンジニアBが夏の教室を送ったあと、代表の手元で確かめる流れは次のとおりです。
$ git fetch
From ../remote/website
e7c061b..dfe77db main -> origin/main
$ git status -sb
## main...origin/main [behind 1]
$ git log --oneline HEAD..origin/main
dfe77db 夏の教室を追加
$ git pull
Updating e7c061b..dfe77db
Fast-forward
index.html | 1 +
1 file changed, 1 insertion(+)
[behind 1] は、送り先のほうが1コミット進んでいるという意味です。
枝:branch・switch・merge・rebase
ブランチ(枝)は、本筋の main を止めずに作業を分ける線です。
| コマンド | すること |
|---|---|
git branch | 枝の一覧。-a で送り先の枝も |
git switch 枝 | 枝を移る |
git switch -c 枝 | 枝を作って移る |
git merge 枝 | その枝を今の枝へ合流させる |
git branch -d 枝 | 合流済みの枝を消す |
git rebase 枝 | 今の枝のコミットを、その枝の後ろに付け直す |
$ git switch -c fix-menu-price
Switched to a new branch 'fix-menu-price'
$ git commit -m "和食の料金を修正"
[fix-menu-price 1abe085] 和食の料金を修正
1 file changed, 1 insertion(+), 1 deletion(-)
$ git switch main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.
$ git merge fix-menu-price
Updating dfe77db..1abe085
Fast-forward
menu.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
$ git branch -d fix-menu-price
Deleted branch fix-menu-price (was 1abe085).
rebaseは最初は使わなくてかまいません。外注先に頼まれたときのために、動きだけ載せます。番号が 75df741 から 1546c0c に変わります。コミットを作り直しているからです。
$ git log --oneline --graph --all -4
* 75df741 夏のコースを追加
| * af6f8e3 駐車場の案内を追加
|/
* 1abe085 和食の料金を修正
* dfe77db 夏の教室を追加
$ git rebase main
Successfully rebased and updated refs/heads/add-summer-menu.
$ git log --oneline --graph --all -4
* 1546c0c 夏のコースを追加
* af6f8e3 駐車場の案内を追加
* 1abe085 和食の料金を修正
* dfe77db 夏の教室を追加
枝の詳しい話は「git branchとmergeの使い方:枝を分けて合流する、GitHub Flowまで」、git switch と git checkout の違いは「git switchとcheckoutの違い:枝を切り替える操作と、detached HEAD」にあります。
戻す:restore・revert・reset・stash
| 戻したいこと | コマンド | 注意 |
|---|---|---|
| コミット前の変更を捨てる | git restore ファイル | 捨てたものは戻せない |
git add を取り消す | git restore --staged ファイル | ファイルは消えない |
| pushしたコミットを打ち消す | git revert コミット | 履歴に打ち消しが足される |
| 手元のコミットを取り消す | git reset --soft HEAD~1 | 変更は残る。pushしたものには使わない |
| 作業を一時的によける | git stash | 新しいファイルはよけない |
| よけた作業を戻す | git stash pop | 戻すと一覧から消える |
$ git stash
Saved working directory and index state WIP on main: 1546c0c 夏のコースを追加
$ git status --short
$ git stash list
stash@{0}: WIP on main: 1546c0c 夏のコースを追加
$ git revert --no-edit HEAD
[main 088f041] Revert "和食の料金を6,500円に修正"
Date: Sun Nov 8 01:09:12 2026 +0900
1 file changed, 1 insertion(+), 1 deletion(-)
git stash は、まだ一度も git add していないファイルをよけません。draft.html だけが新しい状態で打つと、次のように何もよけずに終わります。
$ git stash
No local changes to save
$ git status --short
?? draft.html
使い分けの詳しい話は「Gitで元に戻す:revert・reset・restoreの違いと使い分け」にあります。
印:tag
| コマンド | すること |
|---|---|
git tag | 印の一覧 |
git tag -a v1.0 -m "説明" | 今のコミットに説明つきの印を付ける |
git push origin v1.0 | 印を送る。指定しないと送られない |
$ git tag -a v1.0 -m "夏の教室を載せた版"
$ git tag
v1.0
$ git push origin v1.0
To ../remote/website.git
* [new tag] v1.0 -> v1.0
調べる:reflog・help
| コマンド | すること |
|---|---|
git reflog | 手元で枝やHEADが動いた記録。消したコミットを探す |
git コマンド -h | 短い使い方 |
git help コマンド | 公式の説明の全文 |
git help -a | コマンドの全一覧 |
$ git reflog -3
088f041 HEAD@{0}: reset: moving to HEAD~1
f66066d HEAD@{1}: commit: 作業の途中
088f041 HEAD@{2}: revert: Revert "和食の料金を6,500円に修正"
git reflog は手元の記録で、別のパソコンには引き継がれません。記録は既定で90日、今の枝から外れたものは30日を過ぎると消える対象になります。
危ないコマンド
AIが提案してきたときも、ここに載っているものは意味を確かめてから打ちます。先に枝を作っておくと、元の場所に戻れます(git branch backup-before-reset)。
| コマンド | 消えるもの | 戻す手段 |
|---|---|---|
git reset --hard | コミットしていない変更すべて | コミット済みの分は git reflog。未コミットは戻せない |
git push --force | 送り先にある、他の人のコミット | 他の人の手元に残っていればそこから。--force-with-lease を使う |
git clean -fd | Gitが管理していない新しいファイルとフォルダ | 戻せない。先に -n で一覧を見る |
git checkout . | 今のフォルダのコミットしていない変更 | 戻せない |
git rebase | 消えないが、コミットの番号が全部変わる | 途中なら git rebase --abort。終わったあとは git reflog |
git branch -D | 合流していない枝の札 | git reflog で番号を探して枝を作り直す |
reset –hard と reflog
$ git log --oneline -1
bafe470 夏の料金表に変更
$ git reset --hard HEAD~1
HEAD is now at 5c98b7f 代表の修正
$ git reflog -2
5c98b7f HEAD@{0}: reset: moving to HEAD~1
bafe470 HEAD@{1}: commit: 夏の料金表に変更
$ git reset --hard HEAD@{1}
HEAD is now at bafe470 夏の料金表に変更
コミットしていれば、このように戻せます。コミットしていない変更は記録に残りません。
clean と checkout .
確認なしで消えます。git clean は必ず -n(消さずに一覧だけ出す)を先に打ちます。.gitignore に書いたファイルは、-x を付けない限り対象になりません。
$ git status --short
M index.html
$ git checkout .
Updated 1 path from the index
$ git status --short
?? draft.html
?? tmp/
$ git clean -fdn
Would remove draft.html
Would remove tmp/
$ git clean -fd
Removing draft.html
Removing tmp/
push –force と –force-with-lease
Bが先にpushしたあと、それを受け取っていない代表が送ると拒否されます。--force-with-lease は、受け取っていない更新があれば止まります。--force は止まらず、送り先のBのコミットが消えます。
$ git push
To ../remote/website.git
! [rejected] main -> main (fetch first)
error: failed to push some refs to '../remote/website.git'
$ git push --force-with-lease
To ../remote/website.git
! [rejected] main -> main (stale info)
error: failed to push some refs to '../remote/website.git'
$ git push --force
To ../remote/website.git
+ 4b8c463...5c98b7f main -> main (forced update)
(1つ目の hint: の行は省きました。)ただし git fetch で受け取ったあとなら --force-with-lease も通るので、中身を見ずに打てば同じことです。共有している枝には使いません。
branch -D と rebase
$ git branch -D try-new-design
Deleted branch try-new-design (was 51ebb9e).
$ git switch -c try-new-design 51ebb9e
Switched to a new branch 'try-new-design'
rebaseが途中で止まったら、git rebase --abort で始める前に戻れます。
$ git rebase --abort
$ git status -sb
## fix-title
共有している枝でrebaseすると、他の人の履歴と食い違います。Gitの公式も、他の人が土台にしている枝のrebaseを悪い考えとしています。

ghとの境目
git は手元の履歴を扱う道具で、GitHub以外の置き場でも使えます。gh はGitHub専用の道具で、プルリクエストやIssue、GitHub Actionsのような、GitHubのサイトの機能を扱います。git push は履歴を送る操作で、gh pr create はプルリクエストを作る操作です。詳しくは「GitHub CLIの使い方:ghでできることと、gitとの違い」にあります。
できないことと、その代わり
| できないこと | その代わり |
|---|---|
| コマンドで公開中のサイトを直接戻す | Gitで戻るのは履歴だけ。反映の仕組みを別に動かす |
| コミットしていない変更を取り戻す | こまめにコミットする |
| 自分の手元から他の人の手元の履歴を消す | 消せない。共有した時点で手が届かないと考える |
| コマンドを打たずに同じことをする | GitHub DesktopやVS Codeの画面でできる。「GitHub Desktop・Sourcetree・VS Codeの使い方と選び方」へ |
よく詰まるところ
| 症状 | 原因 | 直し方 |
|---|---|---|
git log のあと入力できない | 表示の続きを読む画面に入っている | q を押す |
git commit で見慣れない画面が開く | -m を付けず、題名を書く画面が開いた | 「git add・commit・pushの違い:保存して送るまでの流れ」の手順で閉じる |
not a git repository | Gitの管理下でないフォルダにいる | cd でリポジトリのフォルダへ移る |
src refspec main does not match any | まだコミットがない、または枝の名前が master | git status で枝の名前を見て、コミットしてから送る |
the branch ... is not fully merged | 合流していないコミットがある枝を -d で消そうとした | 合流する。捨てるなら -D |
No local changes to save | 新しいファイルしかなく、stashの対象がない | git stash -u で新しいファイルも含める |
コマンドの細かい付け方を思い出したいときは、-h で短い一覧が出ます。
$ git commit -h
usage: git commit [-a | --interactive | --patch] [-s] [-v] [-u[<mode>]] [--amend]
(続きは省略しました。)
実際に運用していると、AIが --force や --hard を提案してくる場面が一番多いです。その行だけをこの表で引いて、何が消えるかを確かめてから進めます。

次に読む
保存して送る流れは「git add・commit・pushの違い:保存して送るまでの流れ」、受け取る操作は「git clone・pull・fetchの違い:受け取る操作の使い分け」にあります。枝の話は「git branchとmergeの使い方:枝を分けて合流する、GitHub Flowまで」、消したものを戻すなら「Gitで元に戻す:revert・reset・restoreの違いと使い分け」を開きます。