Git 将一个分支重定基于另一个分支之上

在我的 Git 回购,我有一个 Master分行。其中一个远程开发人员创建了一个分支 Branch1,并对其进行了大量提交。我从 Branch1分支,创建了一个名为 Branch2(git checkout -b Branch2 Branch1)的新分支,这样 Branch2 head 就是添加到 Branch1的最后一个提交: (看起来像这样)

Master---
\
Branch1--commit1--commit2
\
Branch2 (my local branch)

Branch1发生了许多变化。另一个开发人员压制了他的提交,然后又添加了一些提交。与此同时,我的分支有一些变化,但还没有提交任何东西。目前的结构是这样的:

  Master---
\
Branch1--squashed commit1,2--commit3--commit4
\
Branch2 (my local branch)

现在,我想要重新基础上的 Branch1的变化。我完全不知道该怎么办。我知道第一步将是使用 git add .git commit -m "message"提交我的更改。那我要不要用力?使用 git push origin Branch2?还是 git push origin Branch2 Branch1?非常需要帮助,非常感谢,如果我可以一些如何创建我的分支备份,这将是伟大的万一我搞砸了一些事情

159169 次浏览

First backup your current Branch2:

# from Branch2
git checkout -b Branch2_backup

Then rebase Branch2 on Branch1:

# from Branch2
git fetch origin           # update all tracking branches, including Branch1
git rebase origin/Branch1  # rebase on latest Branch1

After the rebase your branch structure should look like this:

master --
\
1 -- 2 -- 3 -- 4 -- Branch2'

In the diagram above, the apostrophe on Branch2 indicates that every commit in the rebased Branch2 after commit 4 is actually a rewrite.

Keep in mind that you have now rewritten the history of Branch2 and if the branch is already published you will have to force push it to the remote via

git push --force origin Branch2

Force pushing can cause problems for anyone else using Branch2 so you should be careful when doing this.

git rebase branch1 branch2 will rebase branch branch2 onto branch1. Operationally, this means any commits which are contained only in branch2 (and not in branch1) will be replayed on top of branch1, moving the branch2 pointer with them. See git rebase --help for more information, including diagrams of this operation.

The operation might produce some conflicts which then you'll have to resolve manually. Edit the affected files, merging content and removing any failed hunks. Afterwards, mark the files as merged using git add <file> and then continue the rebase using git rebase --continue. Repeat until it is done.

Once done, you have nothing else to do. You don't have to push. However if you wish to mirror your new changes to some other repository (for instance, to share it with others or to have those changes in another repository of yours), do a final git push.

First of all, you have to make sure your reference to Branch1 is up to date (specialy since it's history has been modified).

If you like to work with local copys, you cand do something like this:

git push origin Branch2 # this ensures you have at least one copy in your remote
git fetch origin
git checkout Branch1
git reset --hard origin/Branch1
git checkout Branch2
git rebase Branch1 # solve conflicts ... and check that everything is ok
git push -f origin Branch2

I want to rebase my changes (from local branch2) on top of branch1.

git checkout branch2   # Go to your local branch. Use -f to force the checkout.
git reset HEAD --hard  # Drop all non-committed changes.
git rebase branch1     # Rebase on top of branch1. Use -i for an interactive list.

Note: If a branch is on the remote such as origin, prefix the branch name with origin/.

Troubleshooting

  • If you got stuck in the middle of rebase and you want to start over, run:

    rm -fr .git/rebase-merge # Abort a rebase-merge mode.
    git reset HEAD --hard    # Reset everything to the current HEAD.
    
  • If you're on the detached branch (run: git branch and look for the star symbol), run:

    git checkout branch2 -f # and start again.
    
  • If you get conflicts, you need to fix them, use different rebasing point.

  • If you'd like to do rebase manually step by step, use cherry-picking. E.g.

    git reflog              # Note hashes of for your commits.
    git checkout master     # Go to your base branch.
    git cherry-pick C0MM1T1 # Cherry pick first commit based on its hash.
    # Go to the next one or solve the conflicts.
    git cherry-pick C0MM1T2 # Cherry pick another commit and so on.
    
  • If your rebase showing too many commits on the interactive list after running git rebase branch1 -i, you can start your rebase given the specific commit just before your changes, e.g. git rebase pr3v1ios.