Reverting Your Changes in Kiln


Follow

Overview

While working with changesets in Kiln you have three options for reverting your changes. Depending on the repository you use, git or Mercurial, the commands you will use will be different. To make the explanation simple and use common wording, we grouped these three options in the following concepts:


Information

 

Start Over

If you want to scrap your local changes and want to get back to your last good commit use the following commands:

 

git git reset --hard
mercurial hg update --clean

 

Any uncommitted files will be reset, letting you start coding again with a clean slate.

 

Back to the top


Undo

If you find a bug in a changeset that’s buried in your repository history, you want to undo that changeset by applying a new commit that’s the exact opposite of the old changeset.

 

git git revert <changeset ID>
mercurial hg backout <changeset ID>

 

To get the changeset ID, grab it from the URL in Kiln or from git log or hg log at the command line. Both commands work similar, except that with Mercurial, you also have to commit after you run backout.

One of the advantages of undoing a changeset versus modifying your repository’s history (by using Remove) is that the “undo changeset” becomes a part of your repository history. You make a mistake. You fix the mistake. It’s all tracked in version control. This is preferable to modifying (removing) history, which isn’t tracked.

Make sure you’re committing granular changesets. Meaning, if you have 3 different bugs to fix, each bug fix should be its own changeset. That way, if you need to undo one changeset, you can undo one without affecting the others.

 

Back to the top


Remove

Removing changesets from your repository should be considered only as a last resort because it changes the history of your modifications. If you simply wish to Undo the effects of a changeset, use git revert or hg backout instead (see Undo above).

The most common reason to remove a changeset from your history is that it contains sensitive information, e.g. passwords, tokens, etc. 

When modifying the history of a changeset by removing some modifications, it is recommended that the removal should be done in all repositories where the given changeset has been pushed.

 

Removal - using Kiln Web Interface

Changesets can be removed directly from within Kiln by Stripping Changesets using Kiln's Web Interface. After the strip completes, make sure to perform the same strip locally or reclone the repository.

 

Removal - using git or Mercurial commands

Git and Mercurial don’t have exact equivalents of the strip in Kiln. Mercurial’s command is the same, but git is different.

Note the ^ in the git command, which indicates the parent of the specified changeset.

In Mercurial, you’re saying “remove this changeset and all its descendants”.

In git, because you’re targeting the parent of the changeset, you’re saying, “remove all the history of the descendants of the *parent* of the specified changeset”. Because of this, you could end up removing multiple branches if the changeset's parent has multiple lines of descendants.

 

git git reset --hard <changeset ID>^
mercurial hg strip <changeset ID>

 

For example, let’s say you wish to remove the following changeset (marked with the tag Adam). Let's say this changeset has the following IDs:

  • in Mercurial the changeset ID is ace5a7f8b03e and
  • in git the changeset ID is 0733de811a74

Kiln_Reverting_Changes_1_Changeset-to-remove-300x197.png

 

In the screenshots below, the parts of the DAG outlined in blue for each image is the part that would be removed.

In Mercurial you remove only the changeset and its descendants:

hg strip ace5a7f8b03e

Kiln_Reverting_Changes_2_hg-strip-300x197.png

 

In git you remove all descendants of the parent (not just the given changeset):

git reset --hard 0733de811a74^

Kiln_Reverting_Changes_3_git-reset-300x197.png

 

NOTE: You can also use git reset --hard changesetId~1, which is the same as git reset --hard changesetId^. If you’re using Windows command prompt, the ^ character won’t work. Consider switching to Powershell or use ~1.

 

Back to the top


Related Articles

 

Back to the top