やってしまった…。そういう経験、皆さんにもありますよね。
つい最近私にもとても困ったことがありました。実装中のブランチを誤って削除してしまい、実装内容がパーになってしまったのです。もう頭が真っ白になりますよね。
でも大丈夫です。消してしまったブランチは変更履歴から抽出して復活させることが可能なのです。
当記事の対象者としましては以下のとおりです。
- なくなった過去(削除してしまったブランチ)を取り戻したい方へ
- ある程度のGitコマンドを理解できている方へ
- Git初心者から中級者になりたい方へ
どうぞ最後までよろしくお願いいたします。
ブランチの削除する方法
要らなくなったブランチを削除したいとします。その際は以下のコマンドでブランチの削除を行います。
git branch -D 消したいブランチ名
とても簡単です。一瞬にしてブランチが消え去ります。
さて、消してしまったブランチですが、入力ミスや勘違いなどで消す予定はなかったブランチに対して行っとしたら…もちろんそのブランチ内の内容はすべて消えます。とても困った…。
過去の履歴を参照する方法
そもそもGitの利点は何でしょうか。バージョン管理だったり作業の履歴を残したりですよね。Gitはすべての変更履歴を遡れるので、過去の変更履歴を以下のコマンドで参照してみましょう。
git reflog
そうすると以下の様なレスポンスが返ってきます。操作をした順に履歴が表示されます。(HEAD@{ログ番号}のログ番号が0のものが最新の操作です。)
41324ab (HEAD -> master) HEAD@{0}: checkout: moving from test to master 4b2bf31 HEAD@{1}: commit: test 41324ab (HEAD -> master) HEAD@{2}: checkout: moving from master to test 41324ab (HEAD -> master) HEAD@{3}: commit (initial): first commit
内容としては、以下の操作をやっておりました。
HEAD@{3} … masterブランチにコミット
HEAD@{2} … masterブランチからtestブランチへ移動
HEAD@{1} … testブランチにコミット
HEAD@{0} … testブランチからmasterブランチへ移動
履歴から復元する方法
先程の履歴にありましたtestブランチを誤って削除してしまい実装中の内容を失ったとします。
testブランチに最後にコミットした履歴は 4b2bf31 HEAD@{1}: commit: test です。
最後にコミットした内容がtestブランチの最終形態なので、この状態を戻せれば実装中の内容をすべて取り戻すことができます。
その際は以下のコマンドでブランチを復活させてください。
git branch ブランチ名 HEAD@{ログ番号}
とても簡単です。一瞬にしてログ番号の時の状態を指定ブランチ名で作り上げます。
今回はtestブランチを誤って削除してしまい、testブランチの最終コミットはHEAD@{1}だったとします。この状態をtestブランチで復活させたいので…以下のコマンドで復活します。
git branch test HEAD@{1}
確認に git branch でブランチ一覧を表示させます。
git branch
以下の様なレスポンスがありました。testブランチは復活しております!無事実装中の内容も取り戻すことができました!
master * test
さいごに
いかがでしたでしょうか。削除する予定がなかったブランチを削除してしまった場合は焦らずこの方法を試してください。Gitの過去は必ず取り戻せます。
しかしながら、焦ってしまいこれ以外の方法で試しながら取り戻すことをやってしまうと、履歴も汚れてしまい修復することが難しくなっていきます。今Gitがどうなっているかをしっかり把握し、適切に修復できればと思います。それでは。