間違いを取り消す

間違いは起きる

Bazaarは下記で説明されるような間違いから簡単にリカバーできるように設計されています。

プロジェクトのリビジョンの履歴をドロップする

思いがけず間違ったツリーをバージョン管理下に置いたとしても、 .bzr ディレクトリを削除するだけで済みます。

ファイルもしくはディレクトリの登録を解除する

バージョン管理下に置きたくないファイルを思いがけず add コマンドで登録しても、 それを忘れるようにBazaarにそれを忘れさせるために remove コマンドを使用できます。

remove は修正されたファイルが削除されないよに 安全に物事を行う ために設計されています。たとえば:

bzr add foo.html
(oops - didn't mean that)
bzr remove foo.html

このコマンドは修正されたもしくは未知のファイルについてはエラーを出力します。 ファイルを維持したいのであれば、 --keep オプションを使います。 代わりに、ファイルを削除したいのであれば、 --force オプションを使います:

bzr add foo.html
(oops - didn't mean that)
bzr remove --keep foo.html
(foo.html はディスクには残るけれども、bzrには登録されない)

一方で、未変更の TODO ファイルは登録が解除されエラー出力なしでディスクから削除されます:

bzr add TODO
bzr commit -m "added TODO"
(hack, hack, hack - but don't change TODO)
bzr remove TODO
(TODO ファイルは削除される)

注: IDEもしくはオペレーティングシステムのファイルマネージャーを利用してファイルを削除する場合、 commit コマンドはそれを削除されるものとして暗黙のうちに扱います。

最後のコミット以降の変更を取り消す

バージョン管理ツールを使う理由の1つは作業をしている間にツリーのステータスを楽に調べられることです。 最新の commit 以降の変更を廃棄することを決心したら、使うコマンドは revert です:

bzr revert

事前の警告として、 実際にすべてが本当に廃棄されたことを確認するために bzr statusbzr diff を最初に使うことはよい習慣です。

最後のコミット以降のファイルへの変更を取り消す

最後のコミット以降の特定のファイルの変更を取り消したいが、ツリーの他のすべての変更を維持したい場合、 ファイルの名前を引数として revert に渡します:

bzr revert foo.py

最後のコミットを取り消す

意図しないコミットをしてしまったら、取り消すために uncommit コマンドを使います:

bzr uncommit

revert とは異なり、 uncommit は作業のツリーの内容をそのままにします。 意図せずに間違ったエラーメッセージをコミットしてしまった場合、これは本当に重宝します:

bzr commit -m "Fix bug #11"
(damn - wrong bug number)
bzr uncommit
bzr commit -m "Fix bug #1"

コミットを取り消す別の理由は1つもしくは複数のファイルの追加を忘れたからというものです 。 これを避けるために、未知のファイルがツリーの中で見つかるとコミットがエラーになるように commitcommit --strict のエイリアスにする人もいます。

注: merge コマンドは次の章まで紹介しませんが、 uncommit で追加するマージをリストアすることは無意味です。 (uncommit の後で bzr status を実行するとこれらが表示されます) merge は履歴の前の方の指定したコミットだけを効率良く取り消すためにも使われます。 merge に関する詳細な情報は 次の章の 変更をマージする とBazaarのユーザーリファレンスを参照してください。

複数のコミットを取り消す

複数のコミットを取り消すためには -r オプションを使います:

bzr uncommit -r -3

これを行うための理由が本当にいくつかの変更を破棄したいのであるなら、 uncommit は作業ツリーを変更しないことを覚えておいてください: タスクを完了させることと同じようにおそらく revert コマンドを実行する必要があります。 しかし多くの場合、履歴をそのままにしておき、最新のよい状態の内容を反映する 新しいリビジョンを追加する方が間違いなくベターです。

過去のバージョンの状態に戻す

望まない変更を行ったが、コードがユーザーに公開されているのでコミットの取り消しが合理的ではない場合、 作業ツリーを望む状態に戻すために revert を利用できます:

% bzr commit "Fix bug #5"
Committed revision 20.
(release the code)
(hmm - bad fix)
bzr revert -r 19
bzr commit -m "Backout fix for bug #5"

この作業によってツリー全体をリビジョン19の状態に変更します。 それ以降は新しいコミットをしていなければおそらくこれがあなたのしたい唯一のことです。 そうであれば、 revert はこれらをきれいに消去します。 この場合、わるい修正を取り消す代わりに リバースチェリーピッキング を使う方がよいでしょう。

注: 19のような絶対的なリビジョン番号の代わりに、 負の数を使ってチップ(-1)と相対的なリビジョンを指定できます:

bzr revert -r -2

タグを訂正する

早まってタグを定義したのなら、 tag コマンドの --force オプションを使って再定義します:

bzr tag 2.0-beta-1
(oops, we're not yet ready for that)
(make more commits to include more fixes)
bzr tag 2.0-beta-1 --force

タグをクリアする

タグを定義したが使いたくないのであれば、削除するために、 tag コマンドの --delete オプションを使うことができます:

bzr tag 2.0-beta-4
(oops, we're not releasing a 4th beta)
bzr tag 2.0-beta-4 --delete