コミットした変更を元に戻す

ある開発で Gitを使っています。その開発ではプロトタイプ毎にブランチを作っていたのですが、プロトタイプ1をお客様に評価して頂き、次のプロトタイプのプロトタイプ2を作る事になったのですが、うっかりしてプロトタイプ2のブランチを作らず、プロトタイプ2用のコードをプロトタイプ1のブランチにコミットしてしまいました(もちろんレポジトリーサーバーへのpushも) ^^);

http://git-scm.com/images/header.gif

後々の事もあるので、絶対にプロトタイプ1の最終形が取り出せる必要があります。しかしタグも付けてなかったのでピンチです。
いろいろと調べてみると、Git は reset や revertコマンドで変更を取り消せるようです。CodeReposのFAQ/Git に解りやすく書かれています。ありがとうございます。


さて回復手順ですが

レポジトリーのバックアップ

操作ミス等でレポジトリーがおかしくなってしまうと大変なので、レポジトリーサーバーへログインして レポジトリーを丸コピー。また、検証テスト用にもレポジトリーのコピーを作り、まずはそこで試してみまた。

作業

% git branch    -- 現在のブランチを確認
  master
* prototype1
% git branch prototype2 prototype1  -- プロトタイプ1からプロトタイプ2のブランチを作成
% git checkout prototype2   -- プロトタイプ2のブランチに切り換える
% git branch
  master
  prototype1
* prototype2
% ls ....     プロトタイプ2が最新のソースである事を確認
% git checkout prototype1   -- プロトタイプ1のブランチに切り換える
% git log                   --- 戻すコミットを探す
commit 44e9a001ded31980235b809a4f6ee5a3b1e48f19
Author: Yuumi Yoshida <yy@ey-office.com>
Date:   Fri Apr 3 16:05:08 2009 +0900

    変更記録1・・・・・・・

commit c43449f2f2e887b11d4b6bc8a24f24bab08d67ce
Author: Yuumi Yoshida <yy@ey-office.com>
Date:   Thu Apr 2 22:50:39 2009 +0900

    変更記録2・・・・・・・

commit 709f808db93be68aadb8d311679561c395bfda34
Author: Yuumi Yoshida <yy@ey-office.com>
Date:   Wed Apr 1 22:18:04 2009 +0900

    変更記録3・・・・・・・

 ....

% git reset --hard 709f808db93be68aadb8d311679561c395bfda34   -- 変更記録3のコミットに戻す
HEAD is now at 709f808 変更記録3・・・・・・・
% git log           --- 変更記録3のコミットに戻た事を確認
% ls ...            --- 変更記録3のコミットに戻た事を確認
% git push origin prototype1  --- レポジトリーサーバーへのpush
 ! [rejected]        prototype1 -> prototype1 (non-fast forward)    **エラーになります**
error: failed to push some refs to 'ssh://yuumi@ey-office.net/var/lib/git/products/boro.git'
% git push --force origin prototype1  --- forceオプションを付けてレポジトリーサーバーへのpush

 ** gitweb.cgi 等でレポジトリーサーバーのレポジトリーを確認

% git checkout prototype2   -- プロトタイプ2のブランチに切り換える
% git log           --- 最新の状態である事を確認
% ls ...            --- 最新の状態である事を確認


無事にプロトタイプ1のブランチとプロトタイプ2のブランチが出来ました ^^)