# Gitで見本を記録して戻す

macOS/Linuxのターミナル用です。コマンドは一行ずつ実行し、失敗したら止めてください。
共有場所や既存プロジェクトの外で、新しいフォルダを作ります。

```sh
git --version
mkdir 0ku-git-practice
cd 0ku-git-practice
pwd
git rev-parse --show-toplevel
```

最後はGit管理下でないというエラーが期待結果です。パスが出たら既存リポジトリの中なので、外へ新規フォルダを作り直します。
フォルダが既にある場合も、その中身を使わず新しい名前で始めます。
Gitが未導入なら公式 https://git-scm.com/downloads の環境に合う方法を確認してください。

```sh
git init
```

テキストエディタで、次の三行を新規フォルダの `shop.md` へ保存します。

```text
架空の店舗案内
営業時間：10時から18時
連絡先：練習のため省略
```

## 最初の記録

```sh
git status --short
git add -- shop.md
git diff --cached -- shop.md
git commit -m "練習開始の案内文"
git log -1 --oneline
git status --short
```

最初のstatusはshop.mdだけ、cachedの差分は見本三行の追加です。
履歴が一件表示され、最後のstatusが空なら記録できています。
commitで名前やメールのエラーが出る場合のみ、この新規練習リポジトリで次を行い、commitから再実行します。

```sh
git config --local user.name "Practice Learner"
git config --local user.email "practice@example.invalid"
```

これは練習場所だけの名義です。公開やpushは行いません。署名など別のエラーが出る場合、管理設定を無効化せず環境の管理者へ確認します。

## 変更と差分

エディタで10時を11時へ変えて保存します。

```sh
git diff -- shop.md
```

営業時間の行だけが変わっていることを読みます。git addやcommitはまだしません。

## ファイル一つを戻す

以下はshop.mdの未コミットの変更を置き換えます。残したい変更がある場合は実行しません。
同じファイル内の別の修正も戻るので、差分を必ず先に読みます。

```sh
git restore --source=HEAD --worktree -- shop.md
git diff -- shop.md
git status --short
```

差分とstatusが空で、本文は10時へ戻ることを確認します。店名・連絡先も一致していることを見ます。
誤って変更後にgit addした場合、戻す前に次を実行すると記録対象の選択を外せます。手元の本文はそのままです。

```sh
git restore --staged -- shop.md
```

その後、差分を再確認してから上のworktreeの復旧へ進みます。
変更後にcommitも済ませた場合はHEADが変わるため、この手順を続けず履歴を確認します。
他の新規ファイルがstatusに出ても、まとめて削除・復旧しません。今回の対象はshop.mdだけです。

公式資料：
https://git-scm.com/docs/git-init
https://git-scm.com/docs/git-add
https://git-scm.com/docs/git-commit
https://git-scm.com/docs/git-restore
