間違いを取り消す
================

間違いは起きる
---------------

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 status`` と ``bzr 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つもしくは複数のファイルの追加を忘れたからというものです 。
これを避けるために、未知のファイルがツリーの中で見つかるとコミットがエラーになるように
``commit`` を ``commit --strict`` のエイリアスにする人もいます。

注: ``merge`` コマンドは次の章まで紹介しませんが、
``uncommit`` で追加するマージをリストアすることは無意味です。
(``uncommit`` の後で ``bzr status`` を実行するとこれらが表示されます)
``merge`` は履歴の前の方の指定したコミットだけを効率良く取り消すためにも使われます。
``merge`` に関する詳細な情報は
次の章の `変更をマージする <merging_changes.html>`_
と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`` はそれも消してしまいます。
その場合は、わるい修正を取り消す代わりに
`リバースチェリーピック <adv_merging.html#reverse-cherrypicking>`_
を使う方がよいでしょう。

注: 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

