Git status をいろいろ見てみる

Git の記事をたくさん書いたが、一番使うといっても過言でないくらいの git status を忘れていた。

ドキュメントによると、git status は、ワークツリーの状態を見るコマンド。現在のブランチも確認できる。

git-status - Show the working tree status
Git - git-status Documentation

Git はメッセージが親切でわかりやすいので、きちんと読むようにしたい。

git status は、そのときの状態によって出力が変わるので、個別に見ていく。

いろいろな状況で見てみる

バージョンが古くてすみません。新しいやつもやりたい。

$ git --version
git version 2.21.0 (Apple Git-122.2)

空のディレクトリを作って、git init(Git リポジトリとして初期化)したところから。ディレクトリに何もないところから順番に見ていく。

コミットが一つもないとき

git init で初期化だけしたところ。

$ git init
Initialized empty Git repository in /Users/masuyama/practices/blog/git/status/.git/

$ git status
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)

master ブランチにいて、「コミットがまだない」、そして「コミットすべきものがない」という状態。

"create/copy files and use "git add" to track"(ファイルを作成/コピーし、"git add" を使って追跡する)というメッセージが出る。

git 管理されていないファイルがあるとき

次に、ファイルAを作った。

$ touch A

$ git status
On branch master

No commits yet

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

    A

nothing added to commit but untracked files present (use "git add" to track)

Untracked files は、一度も git add されていなくて Git で追跡されていないファイルのこと。

Untracked files を削除するときはファイルをそのまま削除すればよい。

一方、ブランチを切り替えたりresetしたりしても、Untracked files は消えない。

インデックスに登録後コミットはまだのとき

$ git add A

$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   A

git add して Git で追跡(track)を始めたファイルは、単にファイル削除しても Git からは削除されない。

メッセージにあるように、unstage(git addをキャンセル)するには、git rm --cached <file> する必要がある。

インデックス(ステージ)のことを、昔はcacheと呼んでいたらしい。

(ちょっと脱線)git add したファイルを削除したとき

新しいファイルを git add してから、ファイルを削除してみた。

$ rm A

$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   A

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    deleted:    A

コミットされるべき変更として new file: A(インデックスの状態)

ステージされていない変更として deleted: A(ワークツリーの状態)

インデックスとワークツリーの状態が異なると、このように表示される。

ワークツリーでは削除したファイルがインデックスには残っているということなので、git rm --cached <file>でインデックスからファイルを削除すればよいと書いてある。

git add . でワークツリーの状態をインデックスにコピーする方法もある。

$ git add .

$ git status
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)

削除したファイル(A)がインデックスからも削除され、git init 直後と同じ状態になった。

コミット直後

ファイルAが add されている状態だとする。そこからコミットした。

$ git commit -m "Initial commit"
[master (root-commit) 4342f26] Initial commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 A

$ git status
On branch master
nothing to commit, working tree clean

ワークツリーが clean になった。ワークツリー・インデックス・HEAD(最新コミット)が一致していてコミットすべきものがない状態。

ファイルを変更した

今度は、一度コミットしたファイルAを変更してみる( "Hello" と書き込んだ)。

$ echo "Hello" >> A

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   A

no changes added to commit (use "git add" and/or "git commit -a")

ステージされていない変更があるというメッセージが出ている。

modifiedは「修正済み」という意味。

修正したファイルを add した状態

$ git add A

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   A

コミットされる変更があるというメッセージと、変更したファイル名が表示される。

ここでコミットすれば、ワークツリーが clean な状態になる。

git status のメッセージは、次どうすればいいかまで示してくれていてわかりやすい。