目的: revert / reset --soft / reset --hard の違いと、使い分けを理解する
目安: 25分
この実習は捨ててよいBranchで行います。Pull Requestは作りません。
| 状況 | 使うもの | 理由 |
|---|---|---|
| すでにPushして共有されている | git revert |
履歴を壊さない。他人に影響しない |
| まだ手元だけ。Commitを直したい | git reset --soft |
変更を残したままCommitをやり直せる |
| まだ手元だけ。全部捨てたい | git reset --hard |
変更ごと消える |
revert → 打ち消す新しいCommitを「足す」(履歴は残る)
reset → Commitを「なかったこと」にする(履歴が動く)
git switch main
git pull
git switch -c training/<your-name>-undomembers/<your-name>.md の末尾に追加して保存します。
## Revert Training
この行はrevertの練習で追加しました。git add members/<your-name>.md
git commit -m "Add revert training"git log --oneline42b91ad Add revert training
8f2c1ab Add Taro training profile
一番上の7桁の英数字が Commit ID(ハッシュ) です。
git revert 42b91adエディタが開いたら、そのまま保存して閉じます(メッセージは自動生成されています)。 開かせたくない場合は:
git revert --no-edit 42b91adgit log --onelinec7d3e91 Revert "Add revert training"
42b91ad Add revert training
8f2c1ab Add Taro training profile
元のCommitは残っています。 その変更を打ち消す新しいCommitが積まれました。 ファイルを開くと、追加した行は消えています。
「なかったこと」にするのではなく、「取り消した事実」を履歴に残す。
これが、共有済みBranchで revert を使う理由です。
またファイルに1行足して保存します。
git add members/<your-name>.md
git commit -m "aaaa"わざと雑なCommit Messageにしてください。 これを直します。
git reset --soft HEAD~1HEAD~1 は「1つ前のCommit」という意味です。
git log --onelineaaaa のCommitが消えています。
git statusChanges to be committed:
modified: members/taro.md
Commitは消えたが、変更内容はStaging Areaに残っています。 だから、そのままCommitし直せます。
git commit -m "Add reset training note"
git log --onelineまともなメッセージのCommitに置き換わりました。 「Commitメッセージを間違えた」ときの標準的な直し方です。
なお、直前のCommitのメッセージだけを直すなら
git commit --amend -m "..."が手軽です。 どちらも Push前のCommitにのみ使ってください。
このTraining Repositoryでのみ実行してください。
またファイルに1行足して保存します。
git add members/<your-name>.md
git commit -m "Add hard reset training"
git log --onelinegit reset --hard HEAD~1git log --oneline
git statusnothing to commit, working tree clean
ファイルを開いてください。追加した行は跡形もなく消えています。 Commitも、Stagingも、Working Treeの変更も、すべて消えました。
消えたように見えても、実は追える場合があります。
git reflog9a1b2c3 (HEAD -> training/taro-undo) HEAD@{0}: reset: moving to HEAD~1
5d4e6f7 HEAD@{1}: commit: Add hard reset training
9a1b2c3 HEAD@{2}: commit: Add reset training note
HEAD@{1} に、消したはずのCommitが残っています。
git reset --hard HEAD@{1}
git log --oneline戻ってきました。
reflogはHEADが移動した履歴です。reset --hardで失敗しても、 Commitさえしていればここから戻せることが多くあります。ただし過信は禁物です。
reflogの記録は永久ではなく(既定で90日)、 一度もCommitしていない変更はreflogにも残りません。 やらかしたと思ったら、追加の操作をする前にまずgit reflogを見てください。
git switch main
git branch -D training/<your-name>-undogit revert <commit> 打ち消すCommitを足す。共有済みならこれ一択
git reset --soft HEAD~1 Commitを取り消す。変更は残る
git reset --hard HEAD~1 Commitも変更も捨てる ⚠️
git reflog やらかしたときに最初に見るもの
判断基準はひとつです。
そのCommitを、すでに他の人が持っているか? Yes →
revert/ No →resetも使ってよい
自分のIssueで、実習7のチェックを付けてください。 すべての実習が終わったら、Issueの最終チェックを埋めてCloseしてください。お疲れさまでした。