paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

gitのbranchにcheckoutしたらcommitが消えたから復旧

例の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勉強しないとな。