Git で取り消すとは何か
Git で取り消すとは、間違った変更を、他の作業を失わずに元へ戻すことです。戻したい対象は、編集中のファイル、ステージ、コミットのどれかで、使うコマンドが変わります。
予定表に、間違った時刻を書いてしまったとします。まだ保存前か、もう共有したかで、安全な戻し方は違います。
このレッスンのゴール
メモ
作業を失わずに、間違いを取り消す方法を選ぶことができる。
大事な言葉
| ことば | いみ | れい |
|---|---|---|
| restore | 編集中のファイルや、ステージの内容を、記録した版に戻す | git restore notes.txt |
| revert | あるコミットを打ち消す、新しいコミットを作る | git revert HEAD |
| reset | ブランチの先頭を、前のコミットへ動かす。履歴が書き換わる | git reset --soft HEAD~1 |
| reflog | HEAD が動いた記録。手元だけに残る | git reflog |
| HEAD~1 | 今のコミットの、1つ前のコミット |
学生が入力するセルは、このプレビューでは空白です。
状況ごとの、安全な取り消し方
| 状況 | コマンド | 履歴は |
|---|---|---|
| 編集した、まだ add していない | git restore ファイル | 変わらない |
| add した、まだ commit していない | git restore --staged ファイル | 変わらない |
| commit した、まだ push していない | git reset --soft HEAD~1 | 書き換わる |
| commit して、もう push した | git revert HEAD | 新しいコミットが増える |
学生が入力するセルは、このプレビューでは空白です。
練習用の予定表を用意する
小さなリポジトリに、予定を1行書いて、最初のコミットをします。名前をまだ教えていないなら、レッスン1の2行を先に打ってください。
リポジトリを作る
git init -q -b main notesここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
予定を書く
printf "meeting 10:00\n" > notes/notes.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ステージに置く
git -C notes add notes.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
最初のコミット
git -C notes commit -q -m "予定を始める"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
git restore は編集を捨てる
間違った時刻 99:99 を書いてしまいました。まだ add していないので、git restore で、最後のコミットの版に戻せます。
捨てた編集は、Git にも残りません。戻す前に、本当に要らないかを確かめましょう。
間違った編集をする
printf "meeting 99:99\n" > notes/notes.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
編集を捨てる
git -C notes restore notes.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ファイルを読む
cat notes/notes.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
git revert は、打ち消すコミットを足す
今度は、パスワードの行をうっかり commit しました。もし push 済みなら、履歴を書き換えてはいけません。
git revert HEAD は、直前のコミットを打ち消す、新しいコミットを作ります。元のコミットは履歴に残ります。
パスワードの行を足す
printf "password=abc\n" >> notes/notes.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
うっかりコミットする
git -C notes commit -q -am "パスワードを足す"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
打ち消す
git -C notes revert --no-edit HEADここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
履歴を読む
git -C notes --no-pager log --format="%s"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
reset は履歴を巻き戻し、reflog は救う
git reset --hard HEAD~1 は、先頭のコミットを履歴から外し、ファイルもそのコミットの前に戻します。手元だけのコミットなら、使えます。
消えたように見えても、git reflog に記録が残ります。HEAD@{1} は、HEAD が1回前にいた場所です。
予定を足す
printf "meeting 11:00\n" >> notes/notes.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
予定をコミットする
git -C notes commit -q -am "予定を足す"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
1つ前に巻き戻す
git -C notes reset --hard HEAD~1ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
HEAD の動きを読む
git -C notes --no-pager reflog --format="%gs"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
消えたコミットを戻す
git -C notes reset --hard 'HEAD@{1}'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
push 済みのコミットに reset を使う人がいます。他の人の履歴とずれて、push が拒否されます。push 済みなら revert、手元だけなら reset と覚えましょう。