Can I squash commits in Mercurial?

后端 未结 8 1712
时光说笑
时光说笑 2020-11-30 20:13

I have a pair of commits that should really be just one. If I was using git, I would use:

git rebase -i 

and then

8条回答
  •  渐次进展
    2020-11-30 20:50

    If you are reading this answer, you can forget every other option mentioned in this answer and use the fold command from the evolve extension.

    evolve is an extension of mercurial which helps us in having safe mutable history, it's still experimental though. You can use it by cloning it from its repo and adding it in your .hgrc like this.

    [extensions]
    evolve = ~/evolve/hgext/evolve.py
    

    Assuming that you cloned evolve repo in your home directory. Now you are good to go. You can also look for help by hg help fold.

    Fold Command

    You tell fold to squash/fold a linear chain of commits which is not broken. What fold does is, it creates a new changeset which contains changes from all the changesets and mark all those commits as obsolete. You can have a more deep view into this at docs.

    Now suppose you have the following history.

    a -> b -> c -> d -> e -> f -> g
    

    You want to squash e, f and g. You can do

    hg up g
    hg fold -r e
    

    The result will be

    a -> b -> c -> d -> h
    

    where h is the changeset which contains changes from all the three commits e, f and g.

    You can also fold changesets from the middle of the history, i.e. not necessarily you have to pick a chain which includes the tip. Suppose you want to fold b, c and d. You can do

    hg up d
    hg fold -r b
    hg evolve --all
    

    This will result in

    a -> i -> j
    

    where i is the folded changeset of b, c, d and j is the same changeset as h. Evolve user guide is a must read.

提交回复
热议问题