ある日、日常の中で仕事を進めていました。
WEB開発業務はタスクの画面切り替えも頻繁におこなうものです。
ふとターミナルに切り替え、コマンドを確認しようかと上カーソルを押し、なぜか?ふわっとEnter。 ← ここが悲劇の始まり
ん?今 git reset
って書いてた?まさかと確認すると、GitHubにプルリク(プルリクエスト)済のコミットでじゃあーりませんか!!
ガーン。
こんなケースありませんか?
一度プルリクに出したコミット群は触らぬが仏。もし、プルリク済みのコミットを取り消したい場合などはgit revert
を使います。これは先日記事にしました。
-
[Git]git revertをすべき時、そして作業の流れ
続きを見る
で、ここからどうするか?次の一手を考えます。
とりあえず、ぐぐってみる・・。でも、ヒットするのは「git reset
を元に戻す = とりま変更作業内容を復元」だけです。
ぐぬぬ・・。同じ言い回しになるんだけど、git reset --soft HEAD^
でファイル変更内容は保持しつつ、コミットだけを打ち消す、または、git reset
自体をgit reset
で取り消して作業内容の復元できるのはわかっておま。
わたくしは、コミット自体(コミットハッシュ)を元に戻したい。(結果、復元できるかわからんかった。テヘ)
git reflogコマンドでgit resetをしてしまったもの自体をリセットする
先ほどの話ですが、これはググると以外と出てきます。確かにgit reflog
でgit reset
した履歴も出ます(git log
で確認できないGit操作履歴を確認できるのがgit reflog
)。
実はこれ、git reset HEAD{番号}
とかやってみても、ファイルの変更履歴は復活できます。ですが、コミットのハッシュ値は新たに作り変えられる模様。(なので、結果的にgit reset
したものはプッシュする時にリモートブランチものと整合性がとれなくなってしまい、git push origin ブランチ名
時にエラー or 警告が出る。※git未熟練の人だと強引にプッシュしたい病になる。そう禁じ手のforceプッシュなのである。 ← これやったらあかんやつ。プルリクしたブランチがぶっこわれる)
ここで、詰んだので、次の一手で答えを出しました。
A. プルリクをクローズし、新たにプルリクを立て直す。
これが結果的に遠回りのようだけど、近道だと思います。(悟空かw)
でも、ここで実験してみたくなります。
Q. git reset --hard
でもしかして、resetをしたこと自体を完全にresetできるのでゎ?
ならば、「元の戻す」という観点から考えれば、「都合よくコミットハッシュを含め、復活させることができるのではないか?」と思ったのです。
やってみたことはない。でも、やれば現状の作業内容も全て破棄される・・(この時、リセットした作業内容以外にも作業したものがあった)
えい、やー(きんに君風)
結果: えーと、全部消えましたw
ということで、リポジトリ上のプルリクをクローズし、一旦、整合性のとれなくなったリモートブランチを削除。
その後、再度、作業変更したものをコミットしなおし(新規プルリクなので、コミットハッシュ値が変わっても何ら問題なくなった)、再度新たにプッシュとプルリクを作成することで、レビューしてもらえることになりました。(※ブランチ名は連番などに変えておくのが吉です。レビュー側からすると、同じブランチ名でプッシュされると勘違い&事故を起こしやすいので)
コミットハッシュ自体が復活できるやつないかなあ・・(しってたら教えてください)
得た経験値: git resetは元に戻すといっても、コミットハッシュ値は元に戻ってくれない
git reset
には気をつけよう。というお話をしつつ、新たな対処記事を書きました。