Undoing mistakes ================ Mistakes happen --------------- Bazaar has been designed to make it easy to recover from mistakes as explained below. Dropping the revision history for a project ------------------------------------------- If you accidently put the wrong tree under version control, simply delete the ``.bzr`` directory. Deregistering a file or directory --------------------------------- If you accidently register a file using ``add`` that you don't want version controlled, you can use the ``remove`` command to tell Bazaar to forget about it. ``remove`` has been designed to *Do the Safe Thing* in that it will not delete a modified file. For example:: bzr add foo.html (oops - didn't mean that) bzr remove foo.html This will complain about the file being modified or unknown. If you want to keep the file, use the ``--keep`` option. Alternatively, if you want to remove the file, use the ``--force`` option. For example:: bzr add foo.html (oops - didn't mean that) bzr remove --keep foo.html (foo.html left on disk) On the other hand, the ``TODO`` file is deregistered and removed from disk without complaint in this example:: bzr add TODO bzr commit -m "added TODO" (hack, hack, hack - but don't change TODO) bzr remove TODO (TODO file deleted) Note: If you delete a file using your file manager, IDE or via an operating system command, the ``commit`` command will implicitly treat it as removed. Undoing changes since the last commit ------------------------------------- One of the reasons for using a version control tool is that it lets you easily checkpoint good tree states while working. If you decide that the changes you have made since the last ``commit`` ought to be thrown away, the command to use is ``revert`` like this:: bzr revert As a precaution, it is good practice to use ``bzr status`` and ``bzr diff`` first to check that everything being thrown away really ought to be. Undoing changes to a file since the last commit ----------------------------------------------- If you want to undo changes to a particular file since the last commit but keep all the other changes in the tree, pass the filename as an argument to ``revert`` like this:: bzr revert foo.py Undoing the last commit ----------------------- If you make a commit and really didn't mean to, use the ``uncommit`` command to undo it like this:: bzr uncommit Unlike ``revert``, ``uncommit`` leaves the content of your working tree exactly as it is. That's really handy if you make a commit and accidently provide the wrong error message. For example:: bzr commit -m "Fix bug #11" (damn - wrong bug number) bzr uncommit bzr commit -m "Fix bug #1" Another common reason for undoing a commit is because you forgot to add one or more files. Some users like to alias ``commit`` to ``commit --strict`` so that commits fail if unknown files are found in the tree. Note: While the ``merge`` command is not introduced until the next chapter, it is worth noting now that ``uncommit`` restores any pending merges. (Running ``bzr status`` after ``uncommit`` will show these.) ``merge`` can also be used to effectively undo just a selected commit earlier in history. For more information on ``merge``, see `Merging changes`_ in the next chapter and the Bazaar User Reference. Undoing multiple commits ------------------------ You can use the -r option to undo several commits like this:: bzr uncommit -r -3 If your reason for doing this is that you really want to back out several changes, then be sure to remember that ``uncommit`` does not change your working tree: you'll probably need to run the ``revert`` command as well to complete the task. In many cases though, it's arguably better to leave your history alone and add a new revision reflecting the content of the last good state. Reverting to the state of an earlier version -------------------------------------------- If you make an unwanted change but it doesn't make sense to uncommit it (because that code has been released to users say), you can use ``revert`` to take your working tree back to the desired state. For example:: % bzr commit "Fix bug #5" Committed revision 20. (release the code) (hmm - bad fix) bzr revert -r 20 bzr commit -m "Backout fix for bug #5" Correcting a tag ---------------- If you have defined a tag prematurely, use the ``--force`` option of the ``tag`` command to redefine it. For example:: bzr tag 2.0-beta-1 (oops, we're not yet ready for that) bzr tag 2.0-beta-1 --force Clearing a tag -------------- If you have defined a tag and no longer want it defined, use the ``--delete`` option of the ``tag`` command to remove it. For example:: bzr tag 2.0-beta-4 (oops, we're not releasing a 4th beta) bzr tag 2.0-beta-4 --delete