The problem
Suppose you want to combine two commits in Mercurial. However, they are not consecutive. What to do? histedit
to the rescue!
Suppose hg log
shows that your last 4 revisions are the following:
1
2
3
4
3: more stuff on Y
2: stuff on X
1: stuff on Y
0: stuff on Z
And suppose you want to squash what you commited on Y into a single revision, like this:
1
2
3
2: stuff + more stuff on Y
1: stuff on X
0: stuff on Z
Reorder revisions
The first step is to reorder the revision history in order to make the revisions to be squashed become consecutive (stuff on Y
and more stuff on Y
):
1
hg histedit
Select the revision you want to move (1: stuff on Y
) and move it down (press capital J
). Why down? Well, hg log
is reverse chronological so the latest revision on top, while hg histedit
is chronological so the latest revision is at the bottom. Confusing, I know. Just commit (press c
) and now your hg log
should show the reordered revisions:
1
2
3
4
3: more stuff on Y
2: stuff on Y
1: stuff on X
0: stuff on Z
Squash the two commits
Since the revisions on Y are now consecutive, we can finally “fold” them (they might have called it “squash”, it would have been more intuitive). However, we must tell Mercurial from which revision to start: we want revision number 2 in the log above, since it is the one on top of which the other one will be “folded”:
1
hg histedit 2
Then select revision 3 (more stuff on Y
) and select “fold” (press f
). Commit (press c
) and edit the commit message (e.g., stuff + more stuff on Y
) and you should now have the hg log
that you wanted all along:
1
2
3
2: stuff + more stuff on Y
1: stuff on X
0: stuff on Z
Comments powered by Disqus.