Git コマンド早見表 — やりたいこと別

直前のコミットの取り消し、ブランチ名の変更、リモートブランチの削除など、やりたいこと別に整理した Git コマンド。新しい switch/restore と従来のコマンド、危険度バッジ付き。

最終確認日:2026-10-18 に Git 2.56 の git-scm.com リファレンスと GitHub CLI マニュアル と照合。出典:Git reference (git-scm.com/docs), git restore, git switch, git reset, git config, GitHub CLI manual。

97 個のコマンド
よく使う操作:

履歴を書き換え 他の誰も pull していないコミットでのみ安全 · ⚠ 作業を破棄 変更が完全に消える可能性あり。コピーボタンでは # コメントは除かれます。

初期設定(マシンごとに 1 回)

--global を付けると設定は ~/.gitconfig に保存されます。Git 2.46 以降のドキュメントでは git config set / get / list の形式が使われていますが、従来の形式も使えます。

名前とメールアドレスを設定#Git 2.46 以降
git config set --global user.name "Ana Lee"
git config set --global user.email "ana@example.com"

従来の書き方:git config --global user.name "Ana Lee"

すべてのコミットに記録されます。コミットが自分のアカウントにひも付くよう、Git ホスティングサービスに登録したメールアドレスを使ってください。

新しいリポジトリを main で始める#
git config set --global init.defaultBranch main

従来の書き方:git config --global init.defaultBranch main

設定しないと、git init は今も最初のブランチを master と名付けます(ヒントも表示されます)。

コミットメッセージ用のエディターを選ぶ#
git config set --global core.editor "code --wait"

従来の書き方:git config --global core.editor "code --wait"

ファイルを閉じるまで待機するコマンドなら何でも使えます:"nano"、"vim"、"subl -n -w"。

Windows / macOS の改行コードに対応#
git config set --global core.autocrlf true  # Windows
git config set --global core.autocrlf input  # macOS, Linux

従来の書き方:git config --global core.autocrlf true

コミットは LF で、Windows ではチェックアウト時に CRLF にします。チーム全体なら、個人ごとの設定より "* text=auto" を書いた .gitattributes ファイルのほうが確実です。

Git のバージョンを確認#
git --version

git switch と git restore には 2.23 以降、git config のサブコマンドには 2.46 以降が必要です。

リポジトリを始める

フォルダーをリポジトリにする#
git init
git init -b main  # name the first branch

.git ディレクトリを作成します。ビルド成果物や機密情報が入らないよう、最初のコミットの前に .gitignore を追加しましょう。

既存のリポジトリをコピー#
git clone https://github.com/owner/repo.git
git clone git@github.com:owner/repo.git my-folder

全履歴をダウンロードし、リモート "origin" を設定します。2 つ目の形式は SSH を使い、フォルダー名を指定します。

最新バージョンだけをクローン(高速)#
git clone --depth 1 https://github.com/owner/repo.git

履歴を省略します。CI や大きなリポジトリ向けです。残りは後から git fetch --unshallow で取得できます。

新しいローカルリポジトリを公開#
git remote add origin git@github.com:owner/repo.git
git push -u origin main

先にホスティングサービス側で空のリポジトリを作成してください(または下の gh repo create を使用)。-u で origin/main を上流ブランチとして記憶します。

ステージとコミット

変更内容を確認#
git status
git status -s  # short form

ステージ済み、未ステージ、未追跡のファイルを一覧表示し、次に実行するコマンドを提案します。

次のコミットに含めるファイルをステージ#
git add file.txt
git add .  # everything in this folder and below

git add -A はリポジトリ全体の削除もステージします。

ファイルの一部だけをステージ#
git add -p file.txt

変更(「hunk」)を 1 つずつ確認します。y でステージ、n でスキップ、s で分割、e で編集。

ステージした変更をコミット#
git commit -m "Add login form"
git commit -am "Fix typo"  # stage tracked files and commit

-a は変更・削除された追跡済みファイルを含めますが、新しいファイルは含めません。

追跡中のファイルの名前変更・削除#
git mv old.txt new.txt
git rm file.txt

どちらも変更を自動でステージします。Git は内容から名前変更を検出するので、普通の mv と git add でも大丈夫です。

ファイルをディスクに残したまま追跡をやめる#
git rm --cached .env
echo ".env" >> .gitignore

次のコミット以降、リポジトリから削除されます。以前のコミットには残るため、機密情報が含まれていた場合はその情報を無効化して再発行してください。

ブランチ

ブランチを一覧表示#
git branch
git branch -a  # include remote branches
git branch -vv  # show upstream and ahead/behind

現在のブランチには * が付きます。

ブランチを作成して切り替え#Git 2.23 以降
git switch -c feature/login

従来の書き方:git checkout -b feature/login

現在のコミットから始まります。別の場所から分岐するには起点を指定します:git switch -c hotfix origin/main。

別のブランチに切り替え#Git 2.23 以降
git switch main
git switch -  # back to the previous branch

従来の書き方:git checkout main

origin/feature しかない場合、git switch feature でローカルの追跡ブランチが自動的に作成されます。

ブランチ名を変更#
git branch -m new-name  # current branch
git branch -m old-name new-name

ローカルだけの変更です。リモートでも変更するには次の項目を参照してください。

リモートのブランチ名を変更#
git branch -m old-name new-name
git push -u origin new-name
git push origin --delete old-name

リモートで直接名前を変える操作はないため、新しい名前を push して古い名前を削除します。古い名前に対して開いているプルリクエストは閉じられることがあります。GitHub の Web 画面の名前変更ボタンなら、プルリクエストの対象も付け替えられます。

ローカルブランチを削除#⚠ 作業を破棄
git branch -d feature/login
git branch -D feature/login  # even if unmerged

-d は、上流ブランチや HEAD にマージされていないコミットがあると削除を拒否します。-D は構わず削除します。

復旧方法: マージされていないコミットは reflog に残っています。git reflog で先端を探し、git branch feature/login <sha> を実行します。

リモートブランチを削除#⚠ 作業を破棄
git push origin --delete feature/login

従来の書き方:git push origin :feature/login

チームメンバーには git fetch --prune を実行するまで表示されたままです。

復旧方法: そのブランチをローカルに持っている人(または git reflog を使ったあなた)なら push し直せます。

上流ブランチを設定・変更#
git branch -u origin/main
git push -u origin HEAD  # push current branch and track it

従来の書き方:git branch --set-upstream-to=origin/main

上流ブランチは、引数なしの git pull と git push が使うブランチです。

古いコミットを見る(detached HEAD)#Git 2.23 以降
git switch --detach a1b2c3d
git switch -c rescue  # keep work made there

従来の書き方:git checkout a1b2c3d

detached の状態で作ったコミットはどのブランチにも属しません。他へ切り替える前にブランチを作らないと、reflog からしかたどれなくなります。

マージ、リベース、チェリーピック

ブランチを現在のブランチにマージ#
git switch main
git merge feature/login
git merge --no-ff feature/login  # always create a merge commit

可能ならファストフォワードします。--no-ff を付けると履歴にブランチが残ります。

ブランチを 1 つのコミットにまとめる#
git merge --squash feature/login
git commit -m "Add login"

まとめた変更をステージしますが、マージとしては記録しません。そのためブランチはマージ済みとして扱われません。

マージのコンフリクトを解決#
git status  # list conflicted files
# edit the files, remove <<<<<<< ======= >>>>>>> markers
git add file.txt
git commit  # or: git rebase --continue

片方を丸ごと採用するには git restore --ours file.txt または --theirs を使います。リベース中は「ours」がリベース先のブランチを指し、マージとは逆になります。

進行中のマージを中止#⚠ 作業を破棄
git merge --abort

マージを始める前の状態に戻ります。

復旧方法: 行ったコンフリクトの解決は失われます。マージ開始時に未コミットの変更があった場合、--abort では復元できないことがあるため、マージ前にコミットするか stash してください。

ブランチを main にリベース#履歴を書き換え
git switch feature/login
git rebase main

自分のコミットを main の上に再適用して履歴を一直線にします。コンフリクトを解決して git add し、git rebase --continue を実行します。--abort で中止できます。

復旧方法: 直後なら git reset --hard ORIG_HEAD。後からなら git reflog で元の先端を探します。

最近のコミットをまとめる・並べ替える・メッセージを変える#履歴を書き換え
git rebase -i HEAD~3

一覧が開きます。pick を squash/fixup に変えると結合、reword でメッセージ編集、drop で削除、行の入れ替えで並べ替えができます。

復旧方法: git reflog にリベース前のコミットが表示されます。git reset --hard <sha> で元に戻せます。

古いコミットを修正#履歴を書き換え
git commit --fixup=a1b2c3d
git rebase -i --autosquash a1b2c3d~1

fixup コミットは、リベース時に a1b2c3d へ自動的に統合されます。

復旧方法: インタラクティブリベースと同じく git reflog。

マージコミットなしで pull#
git pull --rebase
git config set --global pull.rebase true  # make it the default

取得した内容の上にローカルのコミットをリベースします。

別のブランチからコミットをコピー#
git cherry-pick a1b2c3d
git cherry-pick -x a1b2c3d  # note the source in the message

同じ変更を持つ新しいコミットを作ります。範囲指定:git cherry-pick A..B(A は含まない)。

リモート:fetch、pull、push

リモートの確認と変更#
git remote -v
git remote set-url origin git@github.com:owner/repo.git

set-url でクローンの接続先を HTTPS から SSH に(または名前が変わったリポジトリに)切り替えます。

マージせずに変更をダウンロード#
git fetch
git fetch --prune  # also drop deleted remote branches

origin/* だけを更新し、自分のブランチには触れません。

現在のブランチを更新#
git pull

git fetch とマージ(pull.rebase を設定していればリベース)。

コミットを push#
git push
git push -u origin HEAD  # first push of a new branch
git config set --global push.autoSetupRemote true

push.autoSetupRemote(Git 2.37 以降)を設定すると、新しいブランチで引数なしの git push を実行するだけで上流ブランチが設定されます。

履歴の書き換え後に安全に強制 push#履歴を書き換え
git push --force-with-lease

--force と違い、まだ fetch していないコミットがリモートにあると拒否します。バックグラウンドの fetch に備えてさらに安全にするには --force-if-includes(Git 2.30 以降)を追加します。

復旧方法: 上書きされたリモートのコミットは、それを持っていた人の reflog に残っています。GitHub でもしばらくは SHA でアクセスできます。

フォークを元のリポジトリに合わせて更新#
git remote add upstream https://github.com/original/repo.git
git fetch upstream
git switch main
git merge upstream/main

GitHub CLI なら gh repo sync でも可能です。

元に戻す

ミスがどこにあるかで選びます:作業ツリー、ステージングエリア、ローカルのコミット、すでに push したコミット。一度でもコミットしたものは大抵 git reflog で見つけられますが、破棄した未コミットの編集は戻せません。

直前のコミットを取り消す(変更は残す)#履歴を書き換え
git reset --soft HEAD~1

コミットは消え、変更はステージされた状態で残るので、すぐコミットし直せます。ステージせずに残すなら git reset HEAD~1(--soft なし)を使います。

復旧方法: git reset ORIG_HEAD でコミットが戻ります。すでに push していた場合は git revert を使ってください。

直前のコミットと変更を破棄#⚠ 作業を破棄
git reset --hard HEAD~1

ブランチを 1 コミット戻し、追跡中のすべてのファイルをそれに合わせてリセットします。

復旧方法: コミットは git reflog に残っています(到達不能なエントリは既定で 30 日後に期限切れ):git reset --hard HEAD@{1}。追跡中のファイルの未コミットの変更は完全に失われます。

push 済みのコミットを取り消す#
git revert a1b2c3d
git revert HEAD  # the latest commit

元のコミットを打ち消す新しいコミットを追加するので、他の人の履歴は変わりません。共有ブランチで安全に取り消す方法です。

マージコミットを revert#
git revert -m 1 <merge-sha>

-m 1 で 1 番目の親(通常は main)を残します。後でそのブランチを再マージするには、先にこの revert を revert する必要があります。

直前のコミットメッセージを変更#履歴を書き換え
git commit --amend -m "Better message"

直前のコミットを新しいコミットで置き換えます。push 前なら問題ありませんが、push 後は --force-with-lease が必要です。

復旧方法: git reset --soft HEAD@{1} で amend 前のコミットに戻ります。

入れ忘れたファイルを直前のコミットに追加#履歴を書き換え
git add forgotten.txt
git commit --amend --no-edit

メッセージはそのままでファイルを追加します。

復旧方法: git reset --soft HEAD@{1}。

ファイルのステージを取り消す(git add を元に戻す)#Git 2.23 以降
git restore --staged file.txt
git restore --staged .  # everything

従来の書き方:git reset HEAD file.txt

変更は作業ツリーに残り、ステージだけが取り消されます。

ファイルの変更を破棄#⚠ 作業を破棄Git 2.23 以降
git restore file.txt

従来の書き方:git checkout -- file.txt

ファイルをステージ済みのバージョン(何もステージしていなければ直前のコミット)に戻します。

復旧方法: 編集はコミットされていないので Git からは復旧できません。エディターのローカル履歴に残っている可能性はあります。

ローカルの変更をすべて破棄#⚠ 作業を破棄Git 2.23 以降
git restore --staged --worktree .
git clean -fd  # also delete untracked files

従来の書き方:git reset --hard git clean -fd

直前のコミットに戻ります。先に git clean -n を実行して、削除されるものを確認してください。

復旧方法: 復旧できません。未コミットの編集と未追跡ファイルは削除されます。元に戻せる代替手段は git stash -u です。

削除したファイルを復元#Git 2.23 以降
git restore file.txt  # deletion not committed
git restore --source=a1b2c3d~1 file.txt  # deleted in commit a1b2c3d

従来の書き方:git checkout a1b2c3d~1 -- file.txt

削除したコミットは git log --diff-filter=D -- file.txt で探せます。

別のコミットやブランチの時点のファイルを取得#⚠ 作業を破棄Git 2.23 以降
git restore --source=main -- config.yml

従来の書き方:git checkout main -- config.yml

作業コピーだけを上書きします。ステージもするなら --staged --worktree を追加します。見るだけなら git show main:config.yml。

復旧方法: そのファイルの未コミットの編集は上書きされます。

失ったコミットや削除したブランチを探す#
git reflog
git branch rescued a1b2c3d

reflog には HEAD がたどったすべての位置が記録されています。ミスの前の SHA を探して、そこにブランチを作ります。

push していないマージを取り消す#⚠ 作業を破棄
git reset --hard ORIG_HEAD

ORIG_HEAD は merge、rebase、reset の実行時に直前の位置に設定され、次に同様のコマンドを実行すると上書きされます。

復旧方法: git reflog にはマージコミットがまだ残っています。

リベースを取り消す#⚠ 作業を破棄
git reflog  # find "rebase (start)"; the entry below it is the old tip
git reset --hard HEAD@{5}

リベースの直後なら git reset --hard ORIG_HEAD でも同じです。

復旧方法: 未コミットの変更は --hard で破棄されるので、先に stash してください。

git reset を取り消す#⚠ 作業を破棄
git reset --hard HEAD@{1}

HEAD@{1} は直前の移動の前に HEAD があった位置です。コミット済みの作業にのみ有効です。

コミットした機密情報や巨大なファイルを履歴から削除#履歴を書き換え
git filter-repo --invert-paths --path secrets.env

git filter-repo は別ツール(pip install git-filter-repo)で、git-filter-branch のドキュメントでも推奨されています。実行後は全員がクローンし直す必要があります。いずれにせよ機密情報は無効化して再発行してください。push した時点で公開されています。

復旧方法: filter-repo は新しいクローンで実行します。確実になるまで古いクローンは残しておきましょう。

stash

作業を一時的に退避#
git stash
git stash push -m "half-done login"
git stash -u  # include untracked files

追跡中のファイルの変更を保存して作業ツリーをきれいにするので、ブランチを切り替えられます。

退避した作業を戻す#
git stash pop  # apply and drop
git stash apply stash@{1}  # apply, keep the stash

コンフリクトが起こることがあります。pop では、適用に失敗した場合 stash は残ります。

stash の一覧と確認#
git stash list
git stash show -p stash@{0}

新しい順に並び、stash@{0} が最新です。

一部のファイルだけ stash#
git stash push -- src/login.ts
git stash push --staged  # only what is staged (2.35+)

パスを指定した stash では、それ以外はそのまま残ります。

stash をブランチにする#
git stash branch feature/login stash@{0}

stash したコミットにブランチを作り、stash を適用して削除します。コンフリクトを避けられます。

stash を削除#⚠ 作業を破棄
git stash drop stash@{0}
git stash clear

clear ですべての stash を削除します。

復旧方法: 削除した stash はガベージコレクションまで到達不能なコミットとして残ります:git fsck --unreachable | grep commit の後、git stash apply <sha>。

履歴と差分

履歴をグラフで表示#
git log --oneline --graph --all

1 コミット 1 行でブランチ構造を表示します。かなり古い Git ではブランチ名を表示するのに --decorate を追加します。

1 つのファイルの履歴#
git log --follow -p -- path/file.txt

--follow で名前変更をまたいで追跡し、-p で各変更を表示します。

作成者や日付でコミットを絞り込む#
git log --author="Ana" --since="2 weeks ago" --oneline

ほかに --until、メッセージ検索の --grep="fix"、main にはなく feature にあるコミットを示す main..feature も使えます。

1 つのコミットや古いバージョンのファイルを表示#
git show a1b2c3d
git show a1b2c3d:path/file.txt

2 つ目の形式は、作業コピーに触れずに、そのコミット時点のファイルを表示します。

まだコミットしていない変更を確認#
git diff  # unstaged
git diff --staged  # staged, i.e. what will be committed

--stat はファイルごとに要約し、--word-diff は文章の比較に向いています。

2 つのブランチを比較#
git diff main...feature  # changes on feature since it branched
git diff main feature  # the two tips directly

ドット 3 つはマージベースと比較します。プルリクエストで表示されるのはこれです。

各行を誰が変更したか#
git blame -L 10,20 path/file.txt

-w で空白を無視し、-C で他のファイルから移動した行を追跡します。

バグを持ち込んだコミットを特定#
git bisect start
git bisect bad  # current commit is broken
git bisect good v1.4.0  # this one worked
# test, then mark each step good or bad
git bisect reset

二分探索で、約 log2(n) ステップです。git bisect run ./test.sh で自動化できます。

追跡中のファイルを検索#
git grep -n "TODO"

大きなリポジトリでは grep より速く、無視されたファイルはスキップします。コミットを指定すると古いバージョンを検索できます。

タグとリリース

リリースにタグを付ける#
git tag -a v1.2.0 -m "Release 1.2.0"
git tag -a v1.1.1 a1b2c3d -m "Hotfix"  # tag an older commit

注釈付きタグ(-a)は作成者、日付、メッセージを保存するので、リリースにはこちらがおすすめです。git tag v1.2.0 だけだと軽量タグになります。

タグを push#
git push origin v1.2.0
git push --follow-tags  # annotated tags reachable from pushed commits

git push は既定ではタグを送りません。git push --tags は不要なローカルタグも含めすべてのタグを送ります。

ローカルとリモートのタグを削除#⚠ 作業を破棄
git tag -d v1.2.0
git push origin --delete v1.2.0

削除したリリースタグの名前は再利用しないでください。他のクローンには古いタグが残っています。

復旧方法: タグを付けたコミットには影響しないので、そのコミットにタグを付け直します。

タグの一覧と現在のバージョンの表示#
git tag -l "v1.*"
git describe --tags

describe は最も近いタグとそれ以降のコミット数を表示します(例:v1.2.0-3-ga1b2c3d)。

サブモジュールとワークツリー

サブモジュールを追加#
git submodule add https://github.com/owner/lib.git vendor/lib
git commit -m "Add lib submodule"

.gitmodules に URL を記録し、もう一方のリポジトリの特定のコミットに固定します。

クローン後にサブモジュールを取得#
git clone --recurse-submodules <url>
git submodule update --init --recursive  # already cloned

これを実行しないと、サブモジュールのフォルダーは空のままです。

サブモジュールを最新のコミットに移動#
git submodule update --remote
git commit -am "Bump submodules"

各サブモジュールの追跡ブランチを取得します。新しい固定先は親リポジトリでコミットしてください。

2 つのブランチで同時に作業#
git worktree add ../repo-hotfix hotfix
git worktree add -b review ../repo-review origin/main

同じリポジトリを共有する 2 つ目の作業フォルダーです。stash や 2 つ目のクローンは不要です。

ワークツリーの一覧と削除#
git worktree list
git worktree remove ../repo-hotfix
git worktree prune  # forget folders deleted by hand

未コミットの変更があると remove は拒否します(強制するには --force)。

お掃除

削除される未追跡ファイルを事前確認#
git clean -n -d

git clean -f の前には必ず実行してください。

未追跡ファイルを削除#⚠ 作業を破棄
git clean -fd  # untracked files and folders
git clean -fdx  # also ignored files (build output, .env!)

-x を付けると無視されたファイルも削除され、.env などのローカル設定も含まれます。

復旧方法: 復旧できません。これらのファイルは一度も Git に入っていません。

main にマージ済みのブランチを削除#
git branch --merged main
git branch -d branch-a branch-b

先に一覧を確認してください。-d は未マージのブランチを拒否するので、試しても安全です。

古いリモート追跡ブランチを削除#
git fetch --prune
git config set --global fetch.prune true

サーバー上で削除されたブランチの origin/* 参照を削除します。

大きなリポジトリを高速化#
git maintenance start
git gc

maintenance start はバックグラウンドの prefetch、commit-graph、repack のジョブをスケジュールします。gc はその場でオブジェクトをパックし、到達不能なものを削除します。

設定とエイリアス

すべての設定とその出どころを確認#Git 2.46 以降
git config list --show-origin

従来の書き方:git config --list --show-origin

システム、グローバル、リポジトリの値を、それぞれが書かれたファイルと一緒に表示します。

エイリアスを作成#Git 2.46 以降
git config set --global alias.st "status -s"
git config set --global alias.lg "log --oneline --graph --all"

従来の書き方:git config --global alias.st "status -s"

その後は git st や git lg が使えます。! を先頭に付けるとシェルコマンドを実行します:alias.root "!pwd"。

設定しておくと便利な既定値#Git 2.46 以降
git config set --global pull.rebase true
git config set --global push.autoSetupRemote true
git config set --global rerere.enabled true
git config set --global merge.conflictStyle zdiff3
git config set --global diff.algorithm histogram

従来の書き方:git config --global pull.rebase true

pull 時にリベース、初回 push で上流を自動設定(2.37 以降)、コンフリクトの解決を記憶、コンフリクトに共通の祖先を表示(2.35 以降)、より見やすい差分。

すべてのリポジトリでファイルを無視#
git config set --global core.excludesFile ~/.gitignore_global

従来の書き方:git config --global core.excludesFile ~/.gitignore_global

OS やエディターが作る不要ファイル(.DS_Store、.idea/)向けです。プロジェクト固有のルールはリポジトリの .gitignore に書きます。

GitHub CLI(gh)の基本

gh は GitHub 公式のコマンドラインツールで、Git とは別にインストールします。

GitHub にログイン#
gh auth login
gh auth setup-git  # let git use gh for HTTPS credentials

ブラウザを開くか、トークンを受け付けます。github.com と GitHub Enterprise の両方で使えます。

ローカルフォルダーから GitHub リポジトリを作成#
gh repo create my-app --private --source=. --push

リポジトリを作成して origin として追加し、現在のブランチを push します。

owner/name でクローン#
gh repo clone owner/repo

フォークの場合は、親リポジトリも upstream リモートとして追加します。

プルリクエストを作成#
gh pr create --fill
gh pr create --draft --title "WIP: login" --body "…"

--fill でコミットメッセージをタイトルと本文に使います。

他の人のプルリクエストをチェックアウト#
gh pr checkout 123

PR のブランチ(フォークを含む)を取得して切り替えます。

プルリクエストの一覧、表示、マージ#
gh pr list
gh pr view 123 --web
gh pr merge 123 --squash --delete-branch

gh pr status で自分に関係する PR を表示します。

Issue の作成と一覧#
gh issue create --title "Bug: …" --body "…"
gh issue list --assignee @me

gh issue view 42 --comments でスレッドをターミナルで読めます。

GitHub Actions の実行を監視#
gh run list
gh run watch

gh run view --log-failed で失敗したステップだけを表示します。

.gitignore のひな形が必要なら .gitignore ジェネレーターを使ってください。Git の外でファイルの 2 つのバージョンを比べるなら、差分チェッカーで変更を左右に並べて確認できます。

静的なリファレンスです。検索はブラウザ内で行われ、入力した内容はどこにも送信されません。 すべての無料ツールを見る.

不具合や改善できそうな点を見つけましたか?いただいたメッセージはすべて読み、すぐに対応します。

この Git 早見表は、コマンド別ではなくやりたいこと別に整理しています。「git reset --soft」で検索する人はいません。みんな「直前のコミットを取り消す」で検索するからです。やりたいことを見つけてコマンドをコピーし、何が変わるのかを 1 行の説明で確認してください。検索ではタスクが優先されるので、「リモートブランチを削除」や「ブランチ名を変更」と入力すれば、該当する項目にすぐたどり着けます。

履歴を書き換えるコマンドや作業を破棄するコマンドには印を付け、何を復旧できるかのメモを添えています。一度でもコミットしたものは git reflog でほぼ必ず見つけ直せますが、restore、reset --hard、clean で破棄したコミット前の変更は失われます。Git にもっとわかりやすいコマンドが加わったもの(2.23 以降の git switch と git restore、2.46 以降の git config set と list)は、そちらを先に示して従来の書き方を併記しているので、チームが Git を去年覚えた人でも 2010 年に覚えた人でも使えます。Git 2.56 の git-scm.com リファレンスと照合済みです。

使い方

  1. 検索ボックスに「直前のコミットを取り消す」「ステージを取り消す」「コミットをまとめる」などやりたいことを入力するか、よく使うタスクをクリックします。
  2. 実行する前にバッジを確認してください。琥珀色は履歴を書き換えるコマンド、赤は作業を破棄する可能性があるコマンドです。復旧メモに元に戻す方法が書いてあります。
  3. 「コマンドをコピー」をクリックします。コピーには # のコメントが含まれないので、そのままターミナルに貼り付けられます。a1b2c3d や feature/login のようなプレースホルダーは自分の値に置き換えてください。
  4. 各タスクの横にある # リンクで特定の答えを共有したり、早見表全体を 2 列の PDF として印刷したりできます。

よくある質問

Git で直前のコミットを取り消すには?

まだプッシュしていなければ、git reset --soft HEAD~1 でコミットを取り消し、変更はステージされたまま残ります。git reset HEAD~1 なら変更はステージされていない状態で残ります。git reset --hard HEAD~1 はコミットとその変更の両方を消します。共有ブランチにすでにプッシュしたコミットの場合は、代わりに git revert HEAD を使ってください。誰の履歴も書き換えずに、取り消し用の新しいコミットを追加します。

git reset、git restore、git revert の違いは何ですか?

git restore はファイルを変更します。作業ツリーの編集を破棄したりステージを取り消したりするだけで、ブランチは動かしません。git reset は現在のブランチを別のコミットに移動させ(--hard ではファイルも上書き)、履歴を書き換えます。git revert は以前のコミットの逆の変更を適用する新しいコミットを作ります。履歴は増えるだけなので、他の人が使うブランチでは安全な選択肢です。

Git のブランチ名をローカルとリモートで変更するには?

git branch -m new-name で今いるブランチの名前を変更します(別のブランチなら git branch -m old new)。リモートには名前変更の操作がないため、git push -u origin new-name で新しい名前をプッシュし、git push origin --delete old-name で古いほうを削除します。GitHub では、Web 画面でブランチ名を変更すると、開いているプルリクエストの対象も切り替わります。

git switch と git checkout、どちらを使うべきですか?

どちらでも構いません。git checkout は、ブランチの切り替えとファイルの復元という無関係な 2 つの仕事をこなすため、Git 2.23 でそれが git switch と git restore に分けられました。新しいコマンドのほうがわかりやすく、誤用しにくい(git checkout -- file は黙って編集を破棄します)ので、この早見表では新しいほうを先に示しています。git checkout は非推奨ではなく、ここにあるどのコマンドにも従来の書き方を併記しています。

git reset --hard のあとでコミットを復旧できますか?

たいていは可能です。git reflog を実行し、reset 前の行を見つけて、git reset --hard HEAD@{n} を実行するか、その SHA にブランチを作成します。他から参照されなくなったコミットも、既定では 30 日間は reflog から到達できます。復旧できないのはコミットしていない作業です。一度もコミットも stash もしていない変更は完全に上書きされます。

git push --force-with-lease は何をするのですか?

リモートのブランチが、最後に fetch したときと同じ場所を指している場合にだけ上書きします。その間に誰かがプッシュしていれば、単純な --force のように相手のコミットを黙って消すのではなく、プッシュが拒否されます。すでにプッシュしたブランチで rebase や amend をしたあとに使いましょう。

どの取り消しコマンドを使う?変更がどこにあるかで決める

• ファイルを編集したが、その編集をなくしたい:git restore file。一度もコミットしていないので復旧できません。

• 間違えてステージした:git restore --staged file。何も失われず、編集はファイルに残ります。

• コミットしたがプッシュしていない:git reset --soft HEAD~1 でコミットをやり直すか、git commit --amend でその場で修正します。

• コミットして共有ブランチにプッシュした:git revert <sha>。他の人が pull したブランチを reset してはいけません。

• コミットやブランチ、失敗した rebase の結果を失った:git reflog のあと、git branch rescued <sha>。

根本にあるルールは、コミットを書き換える操作は、そのコミットが自分だけのものである間は問題ないが、共有した途端に全員の問題になる、ということです。

merge と rebase、どちらを使う?

どちらも、あるブランチの変更を別のブランチに取り込みます。merge は 2 つの履歴が合流したことを、親を 2 つ持つマージコミットとして記録します。何も書き換えないので、共有ブランチでも常に安全です。rebase は自分のコミットを相手のブランチの上に再適用し、最新のコミットから作業を始めたかのような一直線の履歴を作りますが、新しいコミット ID が生成されるため、古いコミットをすでに持っている人は調整が必要になります。

チームでよくある慣習は、自分のフィーチャーブランチは main に rebase して最新に保ち(git pull --rebase または git rebase main)、完成したブランチはプルリクエストで main に merge する、というものです。スカッシュマージなら main には機能ごとに 1 つのコミットが残り、通常の merge ならすべてのコミットとブランチの形が残ります。履歴の一貫性を保つため、リポジトリごとにどちらかに決めて、ホスティングサービスの設定で指定しておきましょう。

既定値から変えておきたい Git の設定

• pull.rebase true:git pull で同期のたびにマージコミットを作らず、rebase します。

• push.autoSetupRemote true(Git 2.37 以降):新しいブランチを最初に git push したときに上流ブランチが設定され、-u が不要になります。

• merge.conflictStyle zdiff3(Git 2.35 以降):コンフリクトマーカーに共通の祖先が含まれるため、ほとんどのコンフリクトが一目瞭然になります。

• rerere.enabled true:コンフリクトをどう解決したかを Git が記憶し、rebase 中に同じコンフリクトが再び起きたときに自動で再適用します。

• fetch.prune true:サーバーで削除されたリモートブランチが、次の fetch でローカルからも消えます。

• init.defaultBranch main:新しいリポジトリが main ブランチで始まります。

関連する無料ツール

  • .gitignore ジェネレーター — 言語、フレームワーク、エディター、OS の .gitignore テンプレートを組み合わせて、1 つのすっきりしたファイルにまとめます。
  • 差分チェッカー — テキスト、コード、JSON ファイルの 2 つのバージョンを比較し、どの行、単語、文字が変わったかを正確に確認できます。
  • Markdown 早見表 — すべての Markdown 要素をソースと表示結果で掲載。拡張記法(表、タスクリスト、脚注、数式、Mermaid、アラート)、9 プラットフォームの対応表、ライブで試せるプレイグラウンド付き。
  • 正規表現早見表 — 正規表現のすべてのトークンを、動作する例、JavaScript・PCRE/PHP・Python・Go・Java・.NET での対応状況、入力済みの正規表現テスターを開く「試す」リンク付きで掲載。