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
のメッセージは、次どうすればいいかまで示してくれていてわかりやすい。