Linuxを整える
中級Gitコマンドを整える。
= add・commit・pushが「何をどこへ動かすか」を図で見る
add・commit・push・pull・reset・revert・rebase…同じコマンドの意味を覚えられないのは、頭の中に「作業ツリー→ステージ→ローカル→リモート」という地図が無いからかもしれません。4つの場所を横に並べた図で、コマンドが何をどこへ動かすかをアニメで確認します。fetchとpullの違い、resetとrevertの違いなど誤解しやすい点は正確さを優先して解説します。送信ゼロ。
TLDR — 30秒で分かる
作業ツリー→ステージ→ローカル→リモートの4箇所を横に並べた図で、add/commit/push/pull/fetch/reset/revert/stash/branch/merge/rebaseが何をどこへ動かすかをアニメ確認。fetchは反映しない・pullはfetch+merge、resetはHEAD移動・revertは新コミットなど誤解しやすい点を正確に解説。20コマンドの一覧表+コピー可能な使用例つき。
主な機能
- 作業ツリー/ステージ/ローカルリポジトリ/リモートリポジトリの4ゾーンで①記録②共有③取消④枝分かれ⑤始めるの5モードをアニメ図解
- fetchは取得のみで作業ツリーに反映せず、pullは多くの場合fetch+mergeという誤解しやすい違いを図で明示
- resetは「HEADを動かす」コマンドで直前のコミット取消に限らないこと・--hardの危険性を明記
- revertは打ち消しの新コミットを作ること、checkoutがswitch/restoreに分かれたことを正確に解説
- init/clone/pull/push/add/commit/log/reset/revert/tag/status/diff/mv/stash/branch/checkout/merge/fetch/rebase/gcの20コマンド一覧表(一言で・どこ→どこ・よく使う形)
- 一覧表の各行から図の対応モードへジャンプ可能・コピー機能つき・送信ゼロ
作業ツリー
いま編集中のファイル
ステージ
次のコミットの候補
ローカルリポジトリ
自分のPCの履歴
リモートリポジトリ
GitHub 等
作業ツリー
いま編集中のファイル
ステージ
次のコミットの候補
ローカルリポジトリ
自分のPCの履歴
リモートリポジトリ
GitHub 等
作業ツリー
いま編集中のファイル
ステージ
次のコミットの候補
ローカルリポジトリ
自分のPCの履歴
リモートリポジトリ
GitHub 等
作業ツリー
いま編集中のファイル
ステージ
次のコミットの候補
ローカルリポジトリ
自分のPCの履歴
リモートリポジトリ
GitHub 等
作業ツリー
いま編集中のファイル
ステージ
次のコミットの候補
ローカルリポジトリ
自分のPCの履歴
リモートリポジトリ
GitHub 等
STEP 1
※ イメージ図です。実際の内部構造(オブジェクトDB等)を単純化しています。下の一覧表の「どこ→どこ」列とあわせて確認してください。
COMMANDS
コマンド一覧
コマンド名をクリックすると、上の図の対応するモードへジャンプします(gitは常に自動でジャンプ先が無いこともあります)。
| コマンド | 一言で | よく使う形 |
|---|---|---|
| 今のフォルダに .git を作り、Gitリポジトリとして使えるようにする。 | git init | |
| リモートの履歴をローカルへ複製し、作業ツリーにも展開する。 | git clone https://github.com/user/repo.git | |
| 多くの場合 fetch(取得)+ merge(取り込み)を1回で行う。設定によっては merge の代わりに rebase になる。 | git pull | |
| ローカルリポジトリのコミットをリモートへ送る。 | git push origin main | |
| 作業ツリーの変更を、次のコミットに入れる候補としてステージへ移す。 | git add . | |
| ステージの内容をスナップショットとしてローカルリポジトリの履歴に記録する。 | git commit -m "メッセージ" | |
| ローカルリポジトリのコミット履歴を表示する(何も移動しない)。 | git log --oneline | |
| HEAD(今いる位置)を指定したコミットへ動かす。--soft/--mixed/--hardでステージ・作業ツリーをどこまで戻すかが変わり、「直前のコミットの取消」に限らない。--hardは未保存の変更が消えるため要注意。 | git reset --soft HEAD~1 | |
| 指定したコミットの内容を打ち消す新しいコミットを追加する(履歴は消えない)。共有済みの履歴を戻すときは reset でなくこちらを使う。 | git revert HEAD | |
| 特定のコミットに、リリース名などの目印(動かないラベル)を付ける。 | git tag v1.0.0 | |
| 作業ツリーとステージの状態(変更・未追跡ファイルなど)を表示する(何も移動しない)。 | git status | |
| 作業ツリー・ステージ・コミットの間の差分を表示する(何も移動しない)。 | git diff | |
| ファイルの移動・リネームを行い、その変更をステージまで進める。 | git mv old.txt new.txt | |
| 作業ツリーとステージの変更を一時的に退避し、ローカルリポジトリ内に保管する。 | git stash | |
| 今のコミットを指す新しいポインタ(見出し)を作る。コミット自体は複製しない。 | git branch feature | |
| ブランチ移動とファイル復元の両方に使われてきた多機能コマンド。現在は git switch(ブランチ移動)と git restore(ファイル復元)に役割が分かれている(checkoutも動く)。 | git switch feature | |
| 別ブランチの変更を取り込んだマージコミットを作り、2つの履歴を1本にまとめる。元のコミットは残る。 | git merge feature | |
| リモートの最新情報を取得するだけで、作業ツリーには反映しない。 | git fetch origin | |
| 自分のコミットを別の土台の上に置き直す。mergeとは違い履歴(コミットのハッシュ)が書き換わる。共有済みブランチでは使わないのが定番。 | git rebase main | |
| git gc | リポジトリ内の不要なオブジェクトを整理する。多くの場合Gitが自動で走らせるため、手で打つ機会はほぼない。 | git gc |
よくある誤解・4つ
「たぶんこう」で覚えていると、ハマる場面。
- 1
git resetは「直前のコミットの取消」専用ではないresetの本質はHEAD(今いる位置)をどのコミットに動かすかを指定することです。
--soft/--mixed/--hardでステージ・作業ツリーをどこまで戻すかが変わり、何個前のコミットにも動かせます。特に--hardは未保存の作業ツリーの変更を消すので、実行前に一度立ち止まる価値があります。 - 2
git revertは履歴を消さないrevertは指定したコミットを打ち消す新しいコミットを追加するだけで、元のコミットは履歴に残ります。resetは履歴(今いる位置)そのものを動かすのに対し、revertは打ち消しの記録を積むだけなので、共有済み(push済み)の履歴を戻すときはrevertが安全です。
- 3
git checkoutは今は2つに分かれているcheckoutは長らく「ブランチの切替」と「ファイルの復元」の両方を担っていましたが、現在はブランチ移動は
git switch、ファイルの復元はgit restoreに役割が分かれています。checkoutも今も動きますが、意図がはっきりする分、switch/restoreを覚えておくと事故が減ります。 - 4
git pullは取得+取り込みのセットpullは多くの場合「fetch(取得)+merge(取り込み)」を1回で行います(設定によってはmergeの代わりにrebaseになります)。fetch単体は取ってくるだけで作業ツリーには反映しません。「pullしたのに何も変わらない」ときは、まずfetchとpullを混同していないか確かめるのが定番です。
このページの図解・一覧表・コピー機能はすべてあなたのブラウザの中だけで完結します(純JavaScript)。実際のgitコマンドやシェル、ネットワークには一切アクセスしません(送信ゼロ)。
よくある質問
Q. git add と git commit の違いは何ですか?
A. **git add** は作業ツリーの変更を「次のコミットに入れる候補」としてステージへ移すだけで、履歴にはまだ何も記録されません。**git commit** は、そのステージの内容をスナップショットとしてローカルリポジトリの履歴に記録するコマンドです。addで候補を選び、commitで確定する、という2段階になっています。図の①でこの流れを確認できます。
Q. git pull と git fetch の違いは何ですか?
A. **git fetch** はリモートの最新情報を取ってくるだけで、ローカル内の「origin/main」という記録用の参照を更新するだけです。作業ツリーやブランチの中身は変わりません。**git pull** は多くの場合「fetch+merge」をセットで行い、取得した内容を今のブランチに取り込み、作業ツリーのファイルも最新化します(設定によってはmergeの代わりにrebaseになります)。「pullしたのに変わらない」の逆に「fetchしたのに反映された気がする」という思い込みが、この2つを混同する典型的な原因です。図の②で反映されるタイミングの違いを確認できます。
Q. git reset は「直前のコミットを取り消す」コマンドですか?
A. 正確には違います。git resetは「**HEAD(今いる位置)をどのコミットに動かすか**」を指定するコマンドで、何個前のコミットにも動かせます。`--soft`はHEADだけ、`--mixed`(既定)はHEADとステージ、`--hard`はHEAD・ステージ・作業ツリーの3つすべてを動かします。**--hardは保存されていない作業ツリーの変更を消す**ため、実行前に注意が必要です。図の③で3種類の違いを確認できます。
Q. git reset と git revert はどう違いますか?
A. resetはHEAD(今いる位置)そのものを動かし、動かした先より新しいコミットは(すぐには)見えなくなります。revertは逆に、指定したコミットの内容を打ち消す**新しいコミットを追加**するだけで、元のコミットは履歴に残ります。共有済み(push済み)の履歴を戻したいときは、履歴を書き換えないrevertの方が安全とされています。
Q. git checkout は今も使えますか?switch や restore との違いは?
A. checkoutは今も動きますが、現在は役割ごとに専用コマンドが用意されています。**git switch**はブランチの移動、**git restore**はファイルの復元(直前のコミットやステージの内容に戻す)を担当します。checkoutは元々この両方を1つのコマンドで担っていたため、目的を分かりやすくするために分割されました。図の④で切替の様子を確認できます。
Q. git merge と git rebase の違いは何ですか?
A. mergeは2つのブランチの変更を取り込んだ「マージコミット」を新しく作り、元のコミットはそのまま残して履歴を1本にまとめます。rebaseは自分のコミットを別の土台(例:mainの最新)の上に積み直す処理で、コミットのハッシュ値が変わり**履歴が書き換わります**。このため、**すでにpushして他の人と共有しているブランチではrebaseを使わない**のが定番の注意です。
Q. このツールは何かを送信しますか?
A. 送信しません。図解アニメの再生もコマンド一覧の表示もコピー機能も、すべてこのページを開いたブラウザの中だけで完結します。実際のgitコマンドやシェル、ネットワークには一切アクセスしません(送信ゼロ)。
入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。
RELATED TOOLS
続けて整える