次はインデックスや指定したコミットの内容でファイルを復元する方法について学びます。

現在の状態(状態10)は以下の様になっています。


状態 10 (再掲)


ワーキングツリー
hoge.txt
abcd
piyo.txt
AB


インデックス
hoge.txt
abc
piyo.txt
AB


ローカルリポジトリ「gitlocal」
HEAD
hoge.txt
ab
piyo.txt
AB
"piyo.txtを更新(S9)"
HEAD~
hoge.txt
ab
piyo.txt
A
"hoge.txtを更新(S8)"
HEAD~2
hoge.txt
a
piyo.txt
A
"piyo.txtを追加(S5)"
HEAD~3
hoge.txt
a
"hoge.txtを追加(S4)"

(1) ワーキングツリーにあるファイルをインデックスの内容で復元

まずはワーキングツリーにあるファイルをインデックスの内容で復元する方法です。
実際の開発中はよく使うコマンドです。

ワーキングツリーにあるファイルをインデックスの内容で復元:
git restore <ファイル名>

※ ファイル名を「.」(ドット)にすると現在のディレクトリ以下で更新した全てのファイルを復元します

では演習として hoge.txt をインデックスの内容で復元してみましょう。
すると次の状態 11 になります。
ワーキングツリーの hoge.txt の内容がインデックスの hoge.txt の内容に戻っていることに注目して下さい。


状態 11


ワーキングツリー
hoge.txt
abc
piyo.txt
AB


インデックス
hoge.txt
abc
piyo.txt
AB


ローカルリポジトリ「gitlocal」
HEAD
hoge.txt
ab
piyo.txt
AB
"piyo.txtを更新(S9)"
HEAD~
hoge.txt
ab
piyo.txt
A
"hoge.txtを更新(S8)"
HEAD~2
hoge.txt
a
piyo.txt
A
"piyo.txtを追加(S5)"
HEAD~3
hoge.txt
a
"hoge.txtを追加(S4)"

(2) ワーキングツリーにあるファイルを指定したコミットの内容で復元

次はワーキングツリーにあるファイルを指定したコミットの内容で復元する方法です。

ワーキングツリーにあるファイルを指定したコミットの内容で復元:
git restore --source <コミット> <ファイル名>

※ ファイル名を「.」(ドット)にすると現在のディレクトリ以下で更新した全てのファイルを復元します

では演習としてワーキングツリーの hoge.txt を HEAD~2 の hoge.txt の内容で復元してみましょう。
すると次の状態 12 になります。
ワーキングツリーの hoge.txt の内容は HEAD~2の内容に戻っていますが、インデックスと HEAD の hoge.txt の内容はそのままであることに注目して下さい。


状態 12


ワーキングツリー
hoge.txt
a
piyo.txt
AB


インデックス
hoge.txt
abc
piyo.txt
AB


ローカルリポジトリ「gitlocal」
HEAD
hoge.txt
ab
piyo.txt
AB
"piyo.txtを更新(S9)"
HEAD~
hoge.txt
ab
piyo.txt
A
"hoge.txtを更新(S8)"
HEAD~2
hoge.txt
a
piyo.txt
A
"piyo.txtを追加(S5)"
HEAD~3
hoge.txt
a
"hoge.txtを追加(S4)"

(3) アンステージ ( インデックスにあるファイルを HEAD の内容に復元 )

最後はインデックスにあるファイルを HEAD の内容に復元する方法です。
この行為は「アンステージ」と呼ばれ、ステージング(git add)をキャンセルしたい時に良く利用されています。

アンステージ( git add のキャンセル):
git restore --staged <ファイル>

※ ファイル名を「.」(ドット)にすると現在のディレクトリ以下の全てのファイルをアンステージします

では演習として hoge.txt をアンステージしてみましょう。
すると次の状態 13 になります。
インデックスの hoge.txt の内容は HEAD の hoge.txt 内容に戻っていますが、ワーキングツリーの hoge.txt の内容はそのままであることに注目して下さい。


状態 13


ワーキングツリー
hoge.txt
a
piyo.txt
AB


インデックス
hoge.txt
ab
piyo.txt
AB


ローカルリポジトリ「gitlocal」
HEAD
hoge.txt
ab
piyo.txt
AB
"piyo.txtを更新(S9)"
HEAD~
hoge.txt
ab
piyo.txt
A
"hoge.txtを更新(S8)"
HEAD~2
hoge.txt
a
piyo.txt
A
"piyo.txtを追加(S5)"
HEAD~3
hoge.txt
a
"hoge.txtを追加(S4)"