问题
Is there a way to rebase a single commit from a branch onto another branch?
I have this branch structure:
-- -- -- -- -- (Master)
\
-- -- -- -- -- XX (Feature-branch)
All I want to do is to rebase the last commit of Feature-branch
onto master and rollback Feature-branch
one commit.
-- -- -- -- -- XX (Master)
\
-- -- -- -- -- (Feature-branch)
How do I do that?
回答1:
You can cherry-pick XX to master.
git checkout master
git cherry-pick <commit ID of XX>
And remove the last commit from the feature branch with git reset.
git checkout Feature-branch
git reset --hard HEAD^
回答2:
git rebase --onto master branch~1 branch
This says "rebase the range of commits between last-before-branch and branch (that is, XX commit) on the tip of master branch"
After this operation branch
tip is moved on commit XX
, so you want to set it back with
git checkout branch
git reset --hard branch@{1}^
Which says "reset the branch tip to the commit before its previous state"
So a cherry pick is a simpler solution...
回答3:
It's pretty simple to do actually. The solution is to do an interactive rebase and "drop" all of the commits you don't want to include in the rebase.
git rebase -i <target_branch>
where target_branch
is the branch you want to rebase on to
Then you will edit the file that is opened and pick
the commits you do want and drop
(or d
for short) all the commits you don't want to bring along.
回答4:
@Charles response is correct. Anyway I ended up using this so many times, most of all to rebase specific config on a project
* a8f9182 (HEAD -> production) production configuration | * daa18b7 (pre) preproduction configuration |/ | * d365f5f (local) local configuration |/ * 27d2835 (dev) amazing new feature that will save the world * | 56d2467 (master) boring state of the art for project |/
that I create a new command for it:
$ cat ~/bin/git-rebaseshot COMMIT=$1 DEST=${2:-HEAD} git rebase ${COMMIT}^ ${COMMIT} --onto $DEST
normally you want to autocomplete branch names for that command, so add it sourcing this function (adding to .bashrc or .profile):
_git_rebaseshot () { __gitcomp_nl "$(__git_refs)" }
git autocomplete will search for it
you can use this command like this:
# rebase config on prepro on actual HEAD
$ git rebaseshot prepro
# rebase config on local onto dev
$ git rebaseshot local dev
# rebase production config on master
$ git rebaseshot pro master
When you divide features correctly, possibities are endless.
* a8f9182 (HEAD -> postgres) BBDD config * a8f9182 (local) local config * a8f9182 (debug) log level config * a8f9182 (dev) new feature |
I guess this is what quilt people like to do.
this command will work anyway with whatever sha/ref you provide:
$ git rebaseshot <Feature branch> master
$ git rebaseshot <commit of XX> master
来源:https://stackoverflow.com/questions/14635672/rebase-a-single-git-commit