Can I rebase a Git branch without modifying my working copy?

后端 未结 7 1984
南旧
南旧 2020-12-08 09:16

Suppose I have my \"master\" branch checked out. I\'ve committed some production changes to \"master\", and now I want to rebase my \"experimental\" branch onto the latest m

7条回答
  •  北海茫月
    2020-12-08 10:08

    Update, since git 2.5 this answer is superseded by the in-built mechanism "worktree" which is basically the same. See above answer: https://stackoverflow.com/a/12481546/1499102

    Similar to creating a clone of your repository, I find that it's much tidier to make use of multiple workdirs to do things like this. Also a clone will use a lot of disk space, this will use almost none.

    https://github.com/git/git/blob/master/contrib/workdir/git-new-workdir

    You create a new workdir like this:

    git-new-workdir project-dir new-workdir branch
    

    Then you can treat that as if it was a clone except that fetches and commits in your original workdir will be reflected here (although not on the working branch without recheckout). The only exception to this is if you have submodules as those are done separately for each workdir by default. Frankly I've never looked in to that because I try and avoid submodules.

    So basically just:

    cd new-workdir
    git checkout experimental
    git rebase master
    

    Not exactly a single command, but pretty simple.

    An advantage of this approach (like the clone approach) over the stash approach below is that if you have code currently executing (or otherwise being used by some processes) from your working directory, it isn't interrupted.


    The other option which isn't mentioned here is to do it in your current working directory, but stash your changes so that you can then instantly restore your working directory state.

    # current branch is master (with changes to working state)
    git stash -u
    git checkout experimental
    git rebase master
    git checkout master
    git stash pop
    

    Make sure to use stash -u if you have any new files as otherwise they will not be stashed. Again, not one step, but pretty clean and simple.

提交回复
热议问题