git checkoutでハマった事とその解決法

Dec 7, 2015   #git  #failure-story  #advent-calendar 

この記事は、モバイルファクトリー Advent Calendar 2015 7日目の記事です。

git checkoutコマンドでひやっとした事と、元に戻した方法についてです。

やりたかった事

現在編集中のブランチで不具合が発見され、過去のいつからその不具合が発現していたのか調べたい場合git checkoutを使い状態を過去に戻して、 問題ないことが確認できたら現在最新コミットに戻る。

やってしまった事

リポジトリの状態は以下の通り。

➜  mf-ac git:(master) git log --oneline 
d88275d newest commit
7783d3a second commit
1f90f06 first commit    # この時の動作検証がしたい

git checkoutで過去の状態に戻します。

➜  mf-ac git:(master) git stash 
Saved working directory and index state WIP on master: d88275d newest commit
HEAD is now at d88275d newest commit
➜  mf-ac git:(master) git checkout 1f90f06
Note: checking out '1f90f06'.
(中略)
HEAD is now at 1f90f06... first commit
➜  mf-ac git:(1f90f06) cat README.md  # first commitの状態に戻っている
first commit

この状態で十分な動作検証を行った後、最新状態へ戻そうと最新コミットのサムプリントをしらべようとします。

➜  mf-ac git:(1f90f06) git log --oneline
1f90f06 first commit

すると、リポジトリの状態が過去に戻っているため、git logコマンドではfirst commitのときの情報しか取得できなくなっています。

Team Foundation Serverを使用していたときは、過去の特定バージョンを取得した後でも再度最新版を取得すればよかったのですが、 gitでは最新コミットのサムプリントを取得して元に戻す事ができず、過去数日の苦労が水の泡となるのでは?とものすごく焦りました。

焦りながらも検索してたどり着いたのがこちらのページ

このコマンドを実行すると、作業ディレクトリはコミット a1e8fb5 と全く同じ状態になります。この状態で、プロジェクトの現在の状態に影響を与えることなく、ファイルの閲覧、プロジェクトのコンパイル、テストラン、さらにはファイルの編集さえも可能となります。この状態で行われた操作はリポジトリには一切保存されません。開発を続けるにはプロジェクトの「現在の」状態に戻らなければなりません:

git checkout master

なるほど。
ということでmaster(最新のブランチ名)に再度checkoutすることで解決しそうです。

➜  mf-ac git:(1f90f06) git checkout master
Previous HEAD position was 1f90f06... first commit
Switched to branch 'master'
➜  mf-ac git:(master) cat README.md 
first commit
second commit
newest commit
➜  mf-ac git:(master) git log --oneline
d88275d newest commit
7783d3a second commit
1f90f06 first commit

コミットの状態も最新に戻り

➜  mf-ac git:(master) git stash pop
On branch master
(中略)
Dropped refs/stash@{0} (4bb7959462db9a332eb153686d4ecce8517b8140)

stashしておいた変更も無事取得できました。

追記

「それgit log masterでできるよ」と @mihyaeru21さんに社内slackで指摘して頂きました。

git logはオプションが多く多機能なので、やりたいことがあったら必ず調べる事が大事ですね。

さいごに

gitを普段使用している人にとっては当然の話だったかもしれませんが、GUIベースのバージョン管理ツールになれていた身としては、肝を冷やす経験でした。 gitは管理しやすい反面、コマンドを適切に使いこなさないと痛い目を見る場合は多く感じます。

チーム開発を円滑に行うため、コマンドが手に馴染むくらい使い込んでいかないとダメだなぁと感じました。

明日は@rymizukiさんです!

このエントリーをはてなブックマークに追加
スポンサーリンク
スポンサーリンク