例のPayPay集計アプリを作っていた際にコードをまとめてロールバックをしようと思ってファイル名指定無しでcheckoutしてしまいました。
ブランチ名がハッシュの値になってしまったのですがこんなもんかと思いcommitを進めていました。
あるときgithubにpushしようと思って本来のブランチにcheckoutしたら進めていたぶんのcommitが消えてしまいました。
やばい!書き直し!?となったので早速ググりました。
事象
ターミナルのログが流れてしまったのでHistoryからの振り返りになります。
ディレクトリに3つのファイルがあります。
❯ ls
__pycache__ app.py main.py my.kv
これらをまとめて直前のcommitにロールバックしようと思って以下を打ちました。
git checkout cd40a80
これを実行してからファイルが戻んないなーと思って何回かgit log見ながら、
git checkout cd40a80 git status git checkout cd40a80 main.py my.kv app.py git checkout 517f9c7 main.py my.kv app.py git checkout 6003475 main.py my.kv app.py git checkout d7d7381 main.py app.py my.kv git checkout HEAD main.py app.py my.kv
いろいろコミット位置を変更しちゃったんですよね。
これで先日の処理を追加してpushしようかなとブランチに戻ったらコミットが消えてしまいました。
git checkout kivy
今のログからですが、
4889656 (HEAD -> kivy_local, origin/kivy, kivy) Changed for android path 9aaf0b8 Add exit button of top page cb67e4b Changed top page design 68f58db Changed button layout 06f4952 Add exit button a2a91b8 add return button 5d1f50c Change window size 9325935 import japanize_kivy c7d7f8f Successfully drew graph another screen b60900a Updated kivy garden matplotlib # ここから上のコミットが消えた d7d7381 Fixed path 6003475 Fixed import module name 517f9c7 Enable view plt.plot for Ubuntu desktop 613a809 Add matplotlib
という状況になりました。
復旧
ありがたいことにこの手の復旧もちゃんと方法がありました。 この辺を参考に復旧できました。
detached HEAD から脱出する方法を git の内部構造から探る #Git - Qiita
新しいブランチを切ってそれにcommitし直せばOK。
マージもして完了です。
git checkout kivy_local git branch kivy_local git merge kivy_local
こうなった原因はハッシュを指定してcheckoutしたことでブランチを参照していない状態でcommitを進めてしまっていた様です。
ファイルをロールバックする時に一編やろうと思ってファイル名の引数無しで実行してしまったんですね。
git checkout cd40a80 # これで全部戻ると思ってた git checkout main.py my.kv app.py # おとなしくこれで良かった
ブランチ名とハッシュ値を同じと思ってましたが別物の様です。 仕組み共々もっとgit勉強しないとな。