Git: Gitの状態の確認とファイルの状態の管理

git status は、Git で最もよく使われるコマンドの一つです。このコマンドを使用すると、現在の作業ディレクトリの状態を把握し、どのファイルが変更され、どのファイルがステージングされ、どのファイルが追跡対象外になっているかを確認することができます。

1. git statusの概要

(1) なぜステータスを確認する必要があるのですか?

Gitのワークフローでは、常に以下の点に留意する必要があります:

git status は、これらすべての情報を提供し、Git ワークフローの「ダッシュボード」としての役割を果たします。

(2) 基本的な使い方

BASH
# View Full Status
git status

# View Simplified View
git status -s
# Or
git status --short

(3) 国家情報の価値

ステータス情報は、以下の点で役立ちます:



2. ファイルの状態

(1) 4つのファイルの状態

Git 内のファイルには、主に 4 つの状態があります:

100%
stateDiagram-v2
    [*] --> Untracked: Create a New File
    Untracked --> Staged: git add
    Untracked --> Untracked: Edit
    Staged --> Committed: git commit
    Committed --> Modified: Edit File
    Modified --> Staged: git add
    Staged --> Modified: Edit the temporary file
    Committed --> Committed: git commit

(2) 各状態の詳細な説明

ステータス 英語名 説明 表示色 推奨される対応
追跡対象外 追跡対象外 新規ファイル、Gitで追跡されていない git add と共に追加が必要
変更済み 変更済み 変更済みだがステージングされていない git add が必要
ステージング済み ステージング済み ステージング領域に追加済み Gitにコミット可能
コミット済み コミット済み リポジトリにコミット済み 表示なし クリーン

(3) 状態遷移プロセス

状態遷移を理解することは、Gitをマスターするための鍵となります:

100%
graph TB
    A[Create a New File] -->|Untracked| B[Not Tracked Status]
    B -->|git add| C[Saved]
    C -->|git commit| D[Submitted status]
    D -->|Edit File| E[Status: Modified]
    E -->|git add| C
    C -->|Edit the temporary file| F[Partial Cache<br/>MMStatus]
    F -->|git add| C
    
    style B fill:#f8d7da
    style C fill:#d4edda
    style D fill:#c3e6cb
    style E fill:#fff3cd
    style F fill:#e2e3e5

▶ サンプル:状態の変化の観察

BASH
# Initialize the repository
mkdir status-demo && cd status-demo
git init

# Create a New File
echo "# Demo Project" > README.md
echo "console.log('Hello');" > app.js

# View Status - Not tracked
git status
# On branch main
# 
# No commits yet
# 
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#         README.md
#         app.js
# 
# nothing added to commit but untracked files present

# Add a file to the staging area
git add README.md

# View Status - Partial Cache
git status
# On branch main
# 
# No commits yet
# 
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#         new file:   README.md
# 
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#         app.js


3. ステータス出力の詳細な説明

(1) 出力構造

git statusの出力は、いくつかの部分に分かれています:

TEXT 📖 参照専用
On branch main                    ← Current branch
Your branch is up to date with 'origin/main'.  ← Long-Distance Relationships

Changes to be committed:          ← Saved Changes(Green)
  (use "git restore --staged <file>..." to unstage)
        modified:   file1.txt
        new file:   file2.txt

Changes not staged for commit:    ← Unsaved changes(Red)
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   file3.txt

Untracked files:                  ← Untracked files(Red)
  (use "git add <file>..." to include in what will be committed)
        file4.txt

no changes added to commit        ← Summary Information

(2) 各セクションの意味を理解する

支店情報

一時保管場所

バッファリングされていない領域

追跡対象外のファイル

▶ サンプル:ステータス出力の完全な分析

BASH
# Creating Complex Scenes
git init
echo "# Project" > README.md
git add README.md
git commit -m "Initial commit"

# Create files in various states
echo "new file" > new.txt           # Not tracked
echo "change" >> README.md          # Edited but not saved
echo "staged" > staged.txt
git add staged.txt                  # New files that have been cached
echo "more" >> staged.txt           # Saved and then modified

# View Full Status
git status
# On branch main
# Changes to be committed:
#   new file:   staged.txt
# 
# Changes not staged for commit:
#   modified:   README.md
#   modified:   staged.txt
# 
# Untracked files:
#   new.txt


4. ステータスの概要

(1) 簡潔な出力形式

簡潔な出力を得るには、-s または --short オプションを使用してください:

BASH
git status -s

出力形式は、「タグ」と「ファイル名」の2つの列で構成されています:

TEXT 📖 参照専用
XY filename

(2) ステータスインジケーターの意味

ラベル 列 X(一時領域) 列 Y(作業領域) 説明
?? - - 追跡対象外のファイル
A 追加 - ステージング環境に新規追加
M 変更 - 変更し、下書きとして保存
M - 変更済み 変更済みだが保存されていない
MM 変更済み 変更済み ステージング後に変更
D 削除済み - 削除し、下書きとして保存
D - 削除済み 削除済み(下書きには保存されていない)
AD 追加 削除 追加後にワークスペースから削除
R 名前を変更 - 名前を変更し、下書きとして保存
C コピー済み - コピーして一時保存

(3) 簡潔な出力の利点

▶ サンプル:詳細な出力と簡潔な出力の比較

BASH
# Create Multiple States
echo "untracked" > file1.txt
echo "content" > file2.txt
git add file2.txt
echo "more" >> file2.txt
echo "tracked" > file3.txt
git add file3.txt
git commit -m "Add files"
echo "modified" >> file3.txt

# Detailed Output
git status
# On branch main
# Changes to be committed:
#   new file:   file2.txt
# 
# Changes not staged for commit:
#   modified:   file3.txt
# 
# Untracked files:
#   file1.txt

# Concise Output
git status -s
# A  file2.txt
#  M file3.txt
# ?? file1.txt


5. 状態の変化の追跡

(1) 典型的なワークフローの状態変化

Gitのワークフロー全体を順を追って見ていきましょう:

100%
sequenceDiagram
    participant W as Workspace
    participant S as Buffer
    participant R as Repository
    
    Note over W: 1. Create a New File
    W->>W: Status: Untracked
    
    Note over W,S: 2. git add
    W->>S: Move to the staging area
    S->>S: Status: Staged
    
    Note over S,R: 3. git commit
    S->>R: Commit to the repository
    R->>R: Status: Committed
    
    Note over W: 4. Edit File
    W->>W: Status: Modified
    
    Note over W,S: 5. git add
    W->>S: Update the temporary storage area
    S->>S: Status: Staged
    
    Note over S,R: 6. git commit
    S->>R: Submit Changes
    R->>R: Status: Committed

(2) 特別なステータス:部分キャッシュ

ファイルがステージング済みであるにもかかわらず、ワークスペースで新たな変更が行われた場合、特別なステータスが発生します:

BASH
# Create and stage a file
echo "version 1" > file.txt
git add file.txt
git status -s
# A  file.txt

# Continue editing the file
echo "version 2" >> file.txt
git status -s
# AM file.txt
# AIndicates that it has been saved temporarily(version 1)
# MIndicates that there are new changes in the workspace(version 2)

# Add Again
git add file.txt
git status -s
# A  file.txt
# The temporary storage area is currentlyversion 2

(3) ステートとGitコマンドの関係

現在の状態 利用可能なコマンド 結果
未追跡 git add ステージング状態になる
未追跡 git clean ファイルを削除
変更 git add 「Staged」に変更
変更 git restore 変更を元に戻しました。ステータスを「コミット済み」に変更しました
ステージング済み git commit コミット済み
ステージ済み git restore --staged ステージ解除、変更済みまたは未追跡に変更
コミット済み ファイルを編集 変更済みとしてマーク

▶ サンプル:ワークフローの追跡を完了する

BASH
# Initialization
git init status-workflow
cd status-workflow

# Steps1:Create a File(Untracked)
echo "# Project" > README.md
git status -s
# ?? README.md

# Steps2:Add to Stash(Staged)
git add README.md
git status -s
# A  README.md

# Steps3:Submit(Committed)
git commit -m "Add README"
git status
# nothing to commit, working tree clean

# Steps4:Edit File(Modified)
echo "## Features" >> README.md
git status -s
#  M README.md

# Steps5:Save Changes Temporarily(Staged)
git add README.md
git status -s
# M  README.md

# Steps6:Revise Again(Partial Cache)
echo "## Usage" >> README.md
git status -s
# MM README.md

# Steps7:Commit Staged Changes
git commit -m "Add features"
git status -s
#  M README.md  (There are still changes to be made in the workspace.)

# Steps8:Submit the remaining changes
git add README.md
git commit -m "Add usage"
git status
# nothing to commit, working tree clean

❓ よくある質問

Q なぜ git status では、一部のファイルが赤で表示され、他のファイルが緑で表示されるのですか?
A 色はファイルの状態を示しています。緑色は、ファイルがステージングされており、次のコミットに含まれることを意味します。赤色は、ファイルがステージングされていない(変更されているか、追跡対象外である)ことを意味し、コミットを行う前に git add を使用して追加する必要があります。
Q 「ワーキングツリーのクリーン化」とはどういう意味ですか?
A ワークスペースがクリーンであり、未コミットの変更が含まれていないことを示します。すべての変更がリポジトリにコミットされており、追跡されていないファイル、ステージングされていないファイル、あるいはステージングされているがコミットされていないファイルは存在しません。これが理想的な作業状態です。
Q ステージングされたファイルのみを表示するにはどうすればよいですか?
A git diff --staged または git diff --cached を使用すると、ステージングされた変更内容を確認できます。ファイル一覧を表示したい場合は、git status -s を使用すると、左側にマークされたファイルのみが表示されます。
Q git status の動作が遅い場合、どうすればよいですか?
A 大規模なリポジトリでは、ファイル数が多いため、git status の実行に時間がかかる場合があります。出力を簡潔にするには git status -s を使用するか、ファイルの状態チェックをスキップするように git config core.ignoreStat true を設定してください。また、追跡対象外のファイルを無視するには git status --untracked-files=no を使用することもできます。
Q git status による表示から特定のファイルを除外するにはどうすればよいですか?
A プロジェクトのルートディレクトリに .gitignore という名前のファイルを作成し、無視するファイルパターンを列挙します。たとえば、*.log ではすべてのログファイルが無視され、node_modules/ では依存関係ディレクトリが無視されます。無視されたファイルは git status には表示されません。

📖 まとめ


📝 練習問題

  1. 基本演習:Gitリポジトリを作成します。ファイルを作成し、ステージングしてコミットし、そのファイルを修正し、再度ステージングしてコミットします。git status を使用して、各ステップでのステータスの変化を確認し、ステータスの遷移過程を記録してください。

  2. 応用演習:さまざまな状態(未追跡、変更済み、ステージング済み、部分的にステージング済み)のファイルを作成し、git status の詳細な出力と git status -s の簡潔な出力を比較して、状態マーカーの意味を理解する。

  3. 課題:リポジトリの状態を自動的に確認するために、git status -s の出力を解析し、各状態(未追跡、ステージング済み、変更済みなど)にあるファイルの数をカウントするスクリプトを作成してください。

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%