0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

動かして試す、git restoreの動き

Posted at

環境

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
0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?