こう 聞かれます
- 「間違えて
コミットした とき、 どう 戻しますか」 - 「git revert と git reset の
違いを 説明してください」 - 「main に push した
変更で 不具合が 出ました。 どう 戻しますか」
面接官が 見ている点
- 「もう push して
共有したか」で 戻し方を 分けられるか - revert は
履歴を 残したまま 打ち消す、 reset は 履歴その ものを 動かす、と 仕組みで話せるか - 消すつもりのない
作業まで 消す操作 ( --hard) の怖さを 分かっているか
短い答え
- push して
共有した あとなら、 git revert で、 間違えた コミットを 打ち消す新しい コミットを 足して 戻します。 - まだ
手元だけに ある コミットなら、 git reset で 履歴を 巻き戻して 作り直すことも できます。 - コミットする
前の 直しを 捨てるだけなら、 git restore で 作業ツリーの ファイルを 元に 戻します。
少し 詳しい答え
revert と reset を 並べて試す
前半で、-n は
ターミナル
git init -q -b main demo
cd demo
git config user.name Aya
git config user.email a@x.jp
echo "一行目" > note.txt
git add note.txt
git commit -q -m "一行目を書く"
echo "まちがい" >> note.txt
git commit -q -am "まちがいを足す"
git revert -n HEAD
git commit -q -m "まちがいを戻す"
git log --format=%s
cat note.txt
echo "下書き" >> note.txt
git commit -q -am "まだ共有していない"
git reset -q --soft HEAD~1
git log --format=%s
git status --shortまちがいを戻す
まちがいを足す
一行目を書く
一行目
まちがいを戻す
まちがいを足す
一行目を書く
M note.txtrevert のM の印)。
なぜ 共有した あとは revert か
reset で
reset の 3 つの強さ
--soft履歴だけを戻し、 直した 中身は ステージに残す --mixed(何も付けない とき) 履歴と ステージを 戻し、 直した 中身は 作業ツリーに残す --hard作業ツリーまで戻すので、 コミットしていない 直しは消える
reset でgit reflog で
作った
よく ある間違い
- 共有した main で reset して押し通すほかの
人の 履歴と ずれ、 作業を 失わせる おそれが あります。 共有した あとは revert を使います - 「revert すると
履歴から 消える」と言う revert は 打ち消す コミットを 足すだけで、 元の コミットは 履歴に残ります - 困ったら
すぐ reset --hardと答える コミットしていない直しまで 消えます。 何が 消えるかを 確かめてから 使う、と話します
深掘りの問い
- 「直前の
コミットの 文を 直したいだけなら」まだ push していなければ git commit --amendで作り直せる、と答えます - 「ステージに
載せた ファイルを 外すには」 git restore --stagedで外せて、 作業ツリーの 直しは 残る、と答えます - 「reset --hard で
消した コミットを 取り戻せますか」 git reflogで以前の 位置を 探し、 そこへ 戻れる ことが 多い、と 答えます。 コミットしていなかった 直しは 戻せない、とも添えます