環境
Ubuntu 20.4
Git 2.25
内容
コミットを行った直後で、ワーキングディレクトリでは、何のファイルの修正も行っていない状態が以下です。
$git status
nothing to commit, working tree clean
test.txtを修正しました。ワーキングディレクトリで何らかの修正が入ると、ステータスのメッセージ内容が変わります。下記のメッセージは「ワーキングディレクトリで何らかの修正が行われたが、ステージングエリアにはまだ上がっていません。ワーキングディレクトリで、これ以上、修正が行われないようであれば、変更内容をステージングエリアに上げて、コミットへ向いましょう。」といった内容です。ステージングエリアに上げないのであれば、ワーキングディレクトリの変更内容を破棄することもできます。
$git status
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: test.txt
no changes added to commit (use "git add" and/or "git commit -a")
ワーキングディレクトリの変更内容を破棄します。すると、test.txtの内容が、直前にコミットをした直後の状態に戻ります。
$git restore test.txt
ワーキングディレクトリの変更内容を破棄する方法は、ファイル単位で1個つづ行う方法以外に、複数のファイルを一括で破棄する方法もあります。
$git restore test1.txt test2.txt
$git restore .
$git restore ./
$git restore # これはエラーになります
破棄した後状態を表示すると、ワーキングディレクトリでは、何のファイルの修正も行われていない状態に戻っています。
$git status
nothing to commit, working tree clean
もう一度、test.txtを修正しました。次は破棄をしないで、修正内容をステージングエリアに上げます。
$git add test.txt
ステージングエリアに上げました。後はコミットをするだけです。折角、ステージングエリアに上げたが、そこから取り下げることもできます。
$ git status
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: test.txt
ステージングエリアから取り下げました。
$git restore --staged test.txt
ステージングエリアから取り下げれば、ワーキングディレクトリの変更内容を破棄できるようになります。ステージングエリアに上がっている状態で、ワーキングディレクトリの変更内容を破棄することはできません。ここが重要なポイントです。
$git restore test.txt
もう一度、test.txtを修正して、ステージングエリアに上げました。
$git add test.txt
次は破棄しないで、コミットをします。
$git commit -m "test.txtに行を追加"
1 file changed, 1 insertion(+), 1 deletion(-)
コミットをした直後のステータスの内容です。ワーキングディレクトリには何も修正がかかっていませんというメッセージが表示されます。
$git status
nothing to commit, working tree clean
コミットをした直後にリストアをしても、何も起こりません。ワーキングディレクトリでは何の修正を行っていないため、当然、何も起こりません。
$git restore test.txt
コミットをした直後に、ステージングエリアから取り下げるコマンドを実行しても、これまた、何も起こりません。コミットをすると、ステージングエリアの中身は何も上がっていない状態になるため当然です。
$git restore --staged test.txt
複数のファイルを指定する
複数のファイルをステージングエリアに上げて、ファイルを指定して、ステージングエリアから削除することができます。test1.txtとtest2.txtの2つのファイルを修正して、2つともステージングエリアに上げます。
$git add .
$git add test1.txt test2.txt
ステージングエリアに上げた、全てのファイルを取り消す場合です。
$git restore --staged .
$git restore --staged ./ # これでもOK
$git restore --staged # これだとエラーになります
$git restore --staged test1.txt test2.txt # 複数のファイルを指定してもOK
test1.txtを取り消すと、test2.txtだけがステージングエリアに残ります。
$git restore --staged test1.txt
ステータスを確認すると、test2.txtだけがステージングエリアに上がっており、test1.txtはステージングエリアに上がっていないことが確認できます。
$git status
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: test2.txt
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: test1.txt
test1.txtを再び、ステージングエリアに上げます。
$git add test1.txt
test1.txt、test2.txt共に、ステージングエリアに上がっていることが確認できました。
$git status
(use "git restore --staged <file>..." to unstage)
modified: test1.txt
modified: test2.txt