Git: Gitの状態の確認とファイルの状態の管理
git status は、Git で最もよく使われるコマンドの一つです。このコマンドを使用すると、現在の作業ディレクトリの状態を把握し、どのファイルが変更され、どのファイルがステージングされ、どのファイルが追跡対象外になっているかを確認することができます。
1. git statusの概要
(1) なぜステータスを確認する必要があるのですか?
Gitのワークフローでは、常に以下の点に留意する必要があります:
- どのファイルが変更されたか:ワークスペースにはどのような変更が加えられたか?
- ステージングされたファイル:コミットの準備が整ったコンテンツ
- 追跡対象外のファイル:まだ管理されていない、新しく作成されたファイル
- 現在のブランチ:現在、どのブランチで作業していますか?
- Remote との関係:Remote と同期されているかどうか
git status は、これらすべての情報を提供し、Git ワークフローの「ダッシュボード」としての役割を果たします。
(2) 基本的な使い方
# View Full Status
git status
# View Simplified View
git status -s
# Or
git status --short
(3) 国家情報の価値
ステータス情報は、以下の点で役立ちます:
- 次の手順を決める:追加、コミット、またはプッシュ
- ファイルを未コミットのままにしない:すべての変更を必ずコミットするようにしてください
- 作業の進捗状況を確認する:作業の現在の状況をつかむ
- 意図しない変更の検出:変更すべきではないファイルを速やかに特定する
2. ファイルの状態
(1) 4つのファイルの状態
Git 内のファイルには、主に 4 つの状態があります:
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をマスターするための鍵となります:
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
▶ サンプル:状態の変化の観察
# 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の出力は、いくつかの部分に分かれています:
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) 各セクションの意味を理解する
支店情報:
On branch main: 現在メインブランチにありますYour branch is ahead of 'origin/main' by 2 commits: ローカルはリモートより2コミット進んでいるYour branch is behind 'origin/main' by 3 commits: ローカルリポジトリはリモートリポジトリより3コミット遅れています
一時保管場所:
- これらの変更は、次回の
git commitセッションで提出される予定です。 - 緑色で表示されます(カラー表示対応の端末の場合)
- 新規ファイル、変更されたファイル、削除されたファイルが含まれます
バッファリングされていない領域:
- ファイルは変更されましたが、ステージング領域には追加されていません
- 赤色で表示される
- 提出の際は、
git addを使用する必要があります
追跡対象外のファイル:
- Gitが認識していない新しいファイル
- 赤色で表示される
- 管理するには
git addを使用する必要があります
▶ サンプル:ステータス出力の完全な分析
# 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 オプションを使用してください:
git status -s
出力形式は、「タグ」と「ファイル名」の2つの列で構成されています:
XY filename
(2) ステータスインジケーターの意味
| ラベル | 列 X(一時領域) | 列 Y(作業領域) | 説明 |
|---|---|---|---|
?? |
- | - | 追跡対象外のファイル |
A |
追加 | - | ステージング環境に新規追加 |
M |
変更 | - | 変更し、下書きとして保存 |
M |
- | 変更済み | 変更済みだが保存されていない |
MM |
変更済み | 変更済み | ステージング後に変更 |
D |
削除済み | - | 削除し、下書きとして保存 |
D |
- | 削除済み | 削除済み(下書きには保存されていない) |
AD |
追加 | 削除 | 追加後にワークスペースから削除 |
R |
名前を変更 | - | 名前を変更し、下書きとして保存 |
C |
コピー済み | - | コピーして一時保存 |
(3) 簡潔な出力の利点
- クイックビュー:すべてのステータスを一目で確認
- スクリプト対応:解析や処理が容易
- 省スペース:コンパクトな設計で、エンドユーザー向けデバイスに最適
- 色分け:色の目印(キャッシュされている場合は緑、キャッシュされていない場合は赤)を維持する
▶ サンプル:詳細な出力と簡潔な出力の比較
# 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のワークフロー全体を順を追って見ていきましょう:
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) 特別なステータス:部分キャッシュ
ファイルがステージング済みであるにもかかわらず、ワークスペースで新たな変更が行われた場合、特別なステータスが発生します:
# 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 |
ステージ解除、変更済みまたは未追跡に変更 |
| コミット済み | ファイルを編集 | 変更済みとしてマーク |
▶ サンプル:ワークフローの追跡を完了する
# 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
❓ よくある質問
git status では、一部のファイルが赤で表示され、他のファイルが緑で表示されるのですか?git add を使用して追加する必要があります。git diff --staged または git diff --cached を使用すると、ステージングされた変更内容を確認できます。ファイル一覧を表示したい場合は、git status -s を使用すると、左側にマークされたファイルのみが表示されます。git status の動作が遅い場合、どうすればよいですか?git status の実行に時間がかかる場合があります。出力を簡潔にするには git status -s を使用するか、ファイルの状態チェックをスキップするように git config core.ignoreStat true を設定してください。また、追跡対象外のファイルを無視するには git status --untracked-files=no を使用することもできます。git status による表示から特定のファイルを除外するにはどうすればよいですか?.gitignore という名前のファイルを作成し、無視するファイルパターンを列挙します。たとえば、*.log ではすべてのログファイルが無視され、node_modules/ では依存関係ディレクトリが無視されます。無視されたファイルは git status には表示されません。📖 まとめ
git statusは、Git コマンドの中で最もよく使われるもので、現在の作業ディレクトリの状態を把握するのに役立ちます- ファイルには、「未追跡」、「変更済み」、「ステージング済み」、「コミット済み」の4つの状態があります。
- ステータスの表示は、「ステージ済み」、「ステージ未完了」、「追跡対象外」の3つのカテゴリに分類されます。緑色はステージ済みの項目、赤色はステージ未完了の項目を示します。
- 簡潔な出力
git status -sは、ステータスを2列で表示するため、一目で把握しやすく、スクリプト処理に適しています - XYステータスタグにおいて、X列は一時領域のステータスを表し、Y列は作業領域のステータスを表します。
- 状態遷移を理解することは、Gitのワークフローを習得する上で重要です。各状態には、それぞれ実行可能なコマンドが異なります。
- 「部分的にステージング済み(MMステータス)」とは、ファイルがステージング済みであるものの、作業ディレクトリに新しい変更があることを示します。
📝 練習問題
-
基本演習:Gitリポジトリを作成します。ファイルを作成し、ステージングしてコミットし、そのファイルを修正し、再度ステージングしてコミットします。
git statusを使用して、各ステップでのステータスの変化を確認し、ステータスの遷移過程を記録してください。 -
応用演習:さまざまな状態(未追跡、変更済み、ステージング済み、部分的にステージング済み)のファイルを作成し、
git statusの詳細な出力とgit status -sの簡潔な出力を比較して、状態マーカーの意味を理解する。 -
課題:リポジトリの状態を自動的に確認するために、
git status -sの出力を解析し、各状態(未追跡、ステージング済み、変更済みなど)にあるファイルの数をカウントするスクリプトを作成してください。