I made a big oops, and could use some help undoing it.
We have two repositories-a fairly stable repository, and a repository we're working on changes in. I just made a defect fix in our stable repository, and was moving it up to the working repository. I pulled from the stable repository, merged, then accidentally pushed to the stable repository.
The stable repository now looks like this:
*merge
| \
| \
| *b
*a |
| /
*c
where a
is the commit that should be the tip of the stable repository, b
is all the stuff that we've done in the development repository, and c
is the point we branched the development repository.
How do I go about making it back to:
*a
|
*c
(I know I can't really make changes go away, I'm just looking for a functional structure...)
I've read some things that make me think that hg backout
is the command I need, but I'm not exactly sure what it does.
hg rollback
reverts the last transaction, so you'd be left with unfinished merge, which you have to use hg update -C
to get out.
If you don't want *b (you have it in another clone), then enable the built-in MQ extension and run hg strip -r <*b>
. It will get rid of *b and *merge. By default it saves a backup in case you change your mind again.
UPDATE (per @Rudi's comment: sorry I missed the "already pushed" part)
Since the merge is already pushed out, NEVER EVER do what I suggested earlier. Hate emails from fellow developers would have been the best outcome.
Do this instead:
hg up -r<*merge>
hg revert -r<*a> -a
hg ci -m "undo unintended merge"
Or you could be more kosher:
hg up -r<*merge>
hg backout -r<*merge> --parent<*a>