问题
So I'm working on a project that sometimes has long build times, and the build is clobbered very often. If I have an older branch with some work going on (which has been committed, but is based on an older parent), running git checkout oldbranch
changes the working dir to represent all the old code, which makes me need to run a full build again.
However, usually I've only modified one or two files, and the rest don't need to be reset. What I'd like to do is to rebase this branch to the current master head, and preserve those changes to the files.
Basically, if a.rs
and b.rs
have been modified, then I need a way of making these changes base themselves onto the current head, without touching any files other than those two.
Is there a git-ish way of doing this? Currently I'm juggling patch files to do this.
回答1:
Clone the repo, make rebase in cloned copy, and push it back.
If you are inside your repo, it should be:
cd ..
git clone <name_of_your_repo_directory> tmp_repo
cd tmp_repo
git checkout origin/oldBranch
git rebase origin/master
git push -f origin HEAD:oldBranch
In tmp_repo origin
is name of your local repo, of course (the one you cloned).
Note: the effect will be such as doing
git checkout oldBranch
git rebase master
in your original repo, not as
git checkout oldBranch
git rebase origin/master
回答2:
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.
回答3:
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.
来源:https://stackoverflow.com/questions/22889837/rebase-a-branch-without-checking-it-out