git svn dcommit の実行途中で中断してしまって大変なことになった時の対処方法

金曜日の夕方に一週間分の仕事を git svn dcommit して帰ろうとして、ネットワークの不調とか何らかの理由で git svn dcommit が途中で失敗すると git status の結果が面白いことになってたりして軽くパニックします。(コミットしたはずの変更が、コミットされていない変更として大量にリストアップされたりします)

ちょっとやそっとの変更量なら、改めて clone してきてまっさらな状態のリポジトリで落ち着いて再度同じ変更をするなどの諦めもつくのですが、一週間分の仕事量となると絶望的です。
こまめに dcommit なり push なりしておけば良かったのでしょうが、今更それを悔いても後の祭り。サボったツケが回ってきた感じです。

わらにもすがる思いでぐぐってみたところ、解決策がありましたのでメモしておきます。


  1. .git/logs/HEAD を開く(もしくは git log -g でログを表示する)

  2. 自分がした「最後のコミット」を探す。
    「最後のコミット」は、コミットメッセージとか時刻(ただし .git/logs/HEAD を直接開いた場合は UNIX time)で探す。
    UNIX time を Human readable にするには Ruby なら Time.at()。

  3. 「最後のコミット」を見つけたら、そのハッシュを得る。
    .git/logs/HEAD を直接開いた場合は 2 カラム目の値。

  4. 「最後のコミットのハッシュ」が本当に最後のコミットの変更内容かどうかを念の為 git show <hash> で確かめる。

  5. git reset --hard <hash>

  6. git svn rebase

  7. git svn dcommit


一週間分の仕事が無駄にならずに済みました。

git svn dcommit はもうちょっとエラー時の再開が簡単になってくれているといいと思いました。



Pragmatic Guide to Git (Pragmatic Programmers)

Pragmatic Guide to Git (Pragmatic Programmers)