SIGMA-SE Math & Tech Library

SIGMA-SE Math & Tech Library


数学と情報技術をテーマに、書籍や教材だけではつかみにくい考え方を具体例とともに簡潔にわかりやすく伝える解説サイトです。
技術の歴史や背景、関連知識の整理、学習のための覚書や要約記事も掲載しています。

Git - 状態管理と基本操作:status・add・commit・diff・reset・push・pull・checkout

概要

Gitの状態管理の考え方と、よく使う基本コマンドを整理する。

Gitでは、ワーキングツリー、インデックス、ローカルリポジトリ、リモートリポジトリのどこに変更があるかを理解することが重要になる。
コマンドを丸暗記するより、変更がどこからどこへ移動するかを追うと操作ミスを減らせる。

この記事の構成

対象環境と利用上の注意

  • 本文記載時の環境
    Gitの基本コマンドを扱う記事で、旧来のmaster表記と現在のgit switchgit restoreを含む例を掲載。
  • 確認時期
    2026年8月にGitの公式資料と照合。
    特定のリモートリポジトリに対する一連の操作は再実行していない。
  • 現在そのまま利用できない箇所
    既定ブランチ名、リモート名、コミットID、コマンド出力は環境ごとに異なる。
    例の値をそのまま入力せず、対象リポジトリの状態を確認して置き換える。

作業時の注意点

  • addとcommit
    addはコミット候補へ載せる操作、commitは履歴として保存する操作。
  • diffの対象
    ワーキングツリー、インデックス、HEADのどこと比較するかで結果が変わる。
  • reset --hard
    追跡済みファイルの未コミット変更も失われるため、実行前にstatusとdiffを確認。
  • pushとpull
    pushは送る、pullは取り込む操作として方向を意識する。

以下のコマンド例にある[FILE][FILE1][DIR]などは、実際のファイルパスやディレクトリパスへ置き換えるための表記である。角括弧を含めて入力すると、シェルではglobパターンとして解釈されるため、そのままコピーしない。

状態管理の概念

  • ワーキングツリー(working tree)
    現在チェックアウトしているローカルディレクトリを指す。
    実際に修正、追加、削除を行う作業場所のこと。

  • インデックス / ステージ(index / staging area)
    次のcommitに含める内容を準備する領域。
    git addでワーキングツリーの変更内容をインデックスへ記録し、コミット対象を選択。

  • ローカルリポジトリ(local repository)
    ローカルマシン上にある個別リポジトリ。
    commitされたすべての履歴やバージョンが保存される場所。
    branch単位のpushによってcommitリモートリポジトリ(remote repository)に反映。

  • リモートリポジトリ(remote repository)
    ネットワーク上にある共有リポジトリ。
    通常は、GitHubGitLabなどのホスティングサービス上に存在する。

[git status] : ステータス確認

  • 確認用にtouchでファイルを新規作成

    $ touch example-src.txt
    
  • git statusでステータス確認
    Untracked filesには、まだGitの追跡対象になっていないファイルが表示される。
    上記で新規作成したexample-src.txtがバージョン管理下にないためgit addを促す警告が表示されている。

    $ git status
    On branch master
    
    No commits yet
    
    Untracked files:
    (use "git add ..." to include in what will be committed)
    
            example-src.txt
    
    nothing added to commit but untracked files present (use "git add" to track)
    
  • git statusのその他使用例

    $ git status [FILE]    # ファイルパス指定
    $ git status [DIR]    # ディレクトリ指定
    

[git add] : インデックスへ反映

  • 前項の警告に従いgit addを実行
    git addにより、変更がワーキングツリーからインデックスへ反映される。

    $ git add example-src.txt
    
  • ステータス確認

    $ git status
    On branch master
    
    No commits yet
    
    Changes to be committed:
      (use "git rm --cached ..." to unstage)
    
          new file:   example-src.txt
    
  • git addのその他使用例

    $ git add [FILE]    # ファイルを指定して追加する
    $ git add [FILE1] [FILE2] [FILE3]    # 複数ファイルを指定して追加する
    $ git add [DIR]    # ディレクトリを指定して追加する
    $ git add [DIR1] [DIR2] [DIR3]    # 複数ディレクトリを指定して追加する
    $ git add .    # カレントディレクトリ以下の追加・変更・削除を追加する
    $ git add -A    # リポジトリ全体の追加・変更・削除を追加する(--all と同じ)
    $ git add --all    # リポジトリ全体の追加・変更・削除を追加する(-A と同じ)
    $ git add -u    # 追跡済みファイルの変更と削除を追加する(--update と同じ)
    $ git add --update    # 追跡済みファイルの変更と削除を追加する(-u と同じ)
    $ git add -f [FILE]    # .gitignore対象のファイルを強制的に追加する(--force と同じ)
    $ git add --force [FILE]    # .gitignore対象のファイルを強制的に追加する(-f と同じ)
    $ git add -p    # 差分を対話形式で確認しながら追加する(--patch と同じ)
    $ git add --patch    # 差分を対話形式で確認しながら追加する(-p と同じ)
    $ git add -n    # 実際には追加せず、追加対象を確認する(--dry-run と同じ)
    $ git add --dry-run    # 実際には追加せず、追加対象を確認する(-n と同じ)
    

    git add -f--force)は.gitignoreの対象も追加。秘密鍵、認証情報、環境変数ファイルなどを誤って登録しないよう、実行前後にgit statusgit diff --cachedで対象を確認。

[git commit] : ローカルリポジトリへ反映

  • 上記の変更をメッセージ付きでコミット git commitにより、変更がインデックスからローカルリポジトリへ反映される。

    $ git commit -m 'Add example-src.txt'
    [master (root-commit) 304a1cd] Add example-src.txt
    1 file changed, 0 insertions(+), 0 deletions(-)
    create mode 100644 example-src.txt
    
  • git commitのその他使用例

    $ git commit -m "コミットメッセージ"    # コミットメッセージを指定
    $ git commit --amend    # 直前のコミットを作り直す
    

    --amendはコミットIDが変わるため、共有済みのコミットに対しては影響を確認してから使う。

[git diff] : 差分確認

  • コミット後の編集
    ファイルを編集後、再度ステータス確認を行うと下記の通り、コミット後に編集があったことを示すmodified: example-src.txtが表示されるようになる。

    $ echo "test input" > example-src.txt
    $ git status
    On branch master
    Changes not staged for commit:
    (use "git add ..." to update what will be committed)
    (use "git restore <file>..." to discard changes in working directory)
    
            modified:   example-src.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
    
  • git diffで差分確認
    差分結果としてtest inputが追記されていることが分かる。

    $ git diff
    diff --git a/example-src.txt b/example-src.txt
    index e69de29..c2cbb36 100644
    --- a/example-src.txt
    +++ b/example-src.txt
    @@ -0,0 +1 @@
    +test input
    
  • git diffのその他使用例

    $ git diff HEAD    # 最新コミットとの差分確認
    $ git diff --cached    # HEADとインデックスの差分確認
    $ git diff --name-only    # 差分が発生しているファイル名の一覧を表示する
    $ git diff HEAD^ HEAD    # 2件以上コミットがある場合に、直前のコミット内容を確認
    $ git show HEAD    # HEADのコミット内容を確認
    

[git reset] : コミットの取り消し

以下のHEAD~1は一つ前のコミットを表すため、2件以上コミットがある状態で使用する。
最初のコミットしかないリポジトリでは参照先が存在しない。

  • ブランチの位置(HEAD)を1つ前へ戻し、インデックスワーキングツリーはそのまま
    取り消したコミットの変更は、ステージ済みの状態で残る。

    git reset --soft HEAD~1
    
  • ブランチの位置(HEAD)を1つ前へ戻し、インデックスも戻す
    変更内容はワーキングツリーに残るが、ステージからは外れる。--mixedはモードを省略した場合の既定値となる。

    git reset --mixed HEAD~1
    
  • HEADインデックスワーキングツリーを1つ前のコミットへそろえる
    追跡済みファイルの未コミット変更も上書きされる。必要な変更が残っていないか、実行前にgit statusgit diffで必ず確認。

    git reset --hard HEAD~1
    

公開済みのコミットを取り消す場合、resetで共有履歴を書き換えるのではなく、打ち消し用コミットを作るgit revertが適する場合がある。

[git push] : リモートリポジトリへ反映

  • 新規ブランチをリモートリポジトリに反映し、追跡を設定
    ローカルのfeature/new-featureをリモートリポジトリのoriginに作成し、-u(--set-upstream)オプションの指定によって、ローカルリポジトリリモートリポジトリが紐付けられるため、次回以降はgit pushのみでpush可能となる。

    git push -u origin feature/new-feature
    
  • 特定のリモートブランチを指定してリモートリポジトリへ反映
    ローカルのdevelopブランチをリモートリポジトリのoriginに反映。

    git push origin develop
    
  • リモートリポジトリから特定のブランチを削除
    不要になったリモートブランチをoriginから削除。
    共有先へ反映される操作なので、対象名、マージ済みかどうか、共同作業者が使用中でないかを確認してから実行。

    git push origin --delete branch_name
    

[git pull] : リモートリポジトリの変更を取込む

  • リモートリポジトリの変更をローカルリポジトリに取り込む(リモートとブランチを明示的に指定)
    git pullgit fetch後に、設定やオプションに応じてmergeまたはrebaseで現在のブランチへ変更を統合。
    統合前に内容を確認したい場合は、先にgit fetchを実行して差分を確認。
    git pull origin main
    

[git checkout] : チェックアウト

  • ブランチの切り替え
    developブランチに切り替える。

    git checkout develop
    
  • 新規ブランチ作成と切り替え
    新規ブランチを作成し、同時にそのブランチに切り替える。

    git checkout -b feature/develop-1
    
  • 特定のコミットをチェックアウト
    コミットハッシュを指定し、ワーキングツリーを特定のコミットに変更。この操作では特定ブランチを指さないdetached HEAD状態になるため、そのままコミットを重ねる場合は新しいブランチを作成。

    git checkout a1b2c3d
    
  • 役割別の新しいコマンド
    近年のGitでは、ブランチの切り替えにはgit switch、ファイルの復元やステージ解除にはgit restoreを使うと意図を区別しやすい。

    git switch develop
    git switch -c feature/develop-1
    git restore example-src.txt
    git restore --staged example-src.txt
    

    git restore example-src.txtは、ワーキングツリーにある未ステージの変更を破棄する。復元前にgit diff -- example-src.txtで内容を確認し、必要な変更はコミットまたは退避しておく。

まとめ

  • Gitの基本は、変更がワーキングツリー、インデックス、リポジトリのどこにあるかを理解すること。
  • status、diffで確認し、add、commitで履歴に残す流れを押さえる。
  • resetやpush/pullは影響範囲が大きいため、操作前にブランチと状態を確認。

参考文献

この記事を共有
Xで共有 Facebookで共有 LINEで共有



Copyright SIGMA-SE All Rights Reserved.
s-hama@sigma-se.jp