Hg: How to do a rebase like git's rebase

后端 未结 5 1578
小鲜肉
小鲜肉 2020-11-29 14:58

In Git I can do this:

1. Start working on new feature:
$ git co -b newfeature-123  # (a local feature development branch)
do a few commits (M, N, O)

master A---B         


        
5条回答
  •  被撕碎了的回忆
    2020-11-29 15:44

    VonC has the answer you're looking for, the Rebase Extension. It is, however, worth spending a second or two thinking about why neither mq nor rebase are enabled by default in mercurial: because mercurial is all about indelible changesets. When I work in the manner you're describing, which is nearly daily, here's the pattern I take:

    1. Start working on a new feature:
    $ hg clone mainline-repo newfeature-123
    do a few commits (M, N, O)
    
    master A---B---C
                    \
    newfeature-123   M---N---O
    
    2. Pull new changes from upstream mainline:
    $ hg pull
    
    master A---B---C---D---E---F
                    \
    newfeature-123   M---N---O
    
    3. merge master into my clone so that my new feature 
    can be developed against the latest upstream changes:
    (from newfeature-123)
    $ hg merge F
    
    master A---B---C---D---E---F
                    \           \
    newfeature-123   M---N---O---P
    

    and that's really all that's necessary. I end up with a newfeature-123 clone I can easily push back to the mainline when I'm happy with it. Most importantly, however, I never changed history. Someone can look at my csets and see what they were originally coded against and how I reacted to changes in the mainline throughout my work. Not everyone thinks that has value, but I'm a firm believer that it's the job of source control to show us not what we wished had happened, but what actually happened -- every deadend and every refactor should leave an indelible trace, and rebasing and other history editing techniques hide that.

    Now go pick VonC's answer while I put my soapbox away. :)

提交回复
热议问题