Rebase a branch without checking it out
I checked the source code and unfortunately it looks like it always checks out the base commit so unfortunately I think the only way you could do this would be to clone the repo into another directory, rebase it there and then push the changes back into the original repo, and finally delete it.
Note that cloning a local repo to elsewhere on the same file system uses hardlinks for the files under .git
so it's not actually as slow as you'd think.
Edit: actually a better alternative is to use a worktree, something like this:
cd <your repo>
git worktree add ../tmp <branch to rebase>
cd ../tmp
git rebase master
cd -
git worktree remove tmp
Note that you can only have a branch checked out in one worktree at a time.
This sounds like a good use case for git cherry-pick
. Instead of checking out the branch and rebasing it onto your current branch, you can stay on the current branch and cherry-pick commits from the old branch.
If the branch you're cherry-picking from only consists of a single commit, you can even refer to it by its branch name, eg:
git cherry-pick old-branch
ie. take the most recent commit from old-branch and apply the changes to create a new commit (preserving the commit message, author, etc) on your current branch.
Going through the same right now I learned git rebase
allows you to specify two branches in one go, essentially making it git rebase <remote> <local>
, eg.
git rebase origin/master dev
This performs a more efficient rebase where your files don't get all re-written (which is the case if you checkout the branch first). You still need to resolve merge conflicts first and you end up with a repository where your local dev
branch is checked out.