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