Git在另一个分支的顶部重新绑定一个分支

时间:2016-10-12 23:12:07

标签: git rebase

在我的git repo中,我有一个Master分支。其中一个远程开发人员创建了一个分支Branch1,并在其上进行了一系列提交。我从Branch1分支,创建了一个名为Branch2git checkout -b Branch2 Branch1)的新分支,以便Branch2头部在最后一次提交时添加到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?非常需要帮助,非常感谢,如果我可以创建一个如何创建我的分支的备份,那将是很好的,以防我搞砸了

4 个答案:

答案 0 :(得分:37)

首先备份您当前的Branch2

# from Branch2
git checkout -b Branch2_backup

然后在Branch2上重新Branch1

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

在rebase之后,您的分支结构应该如下所示:

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

在上图中,Branch2上的撇号表示在提交4之后重新定位Branch2 中的每个提交实际上都是重写。

请记住,您现在已经重写了Branch2的历史记录,如果分支已经发布,您将不得不强制将其推送到远程

git push --force origin Branch2

强制推送可能会导致其他任何人使用Branch2时出现问题,因此在执行此操作时应小心。

答案 1 :(得分:14)

git rebase branch1 branch2会将分支branch2重新定位到branch1。在操作上,这意味着只有branch2(而不是branch1)中包含的任何提交都将在branch1之上重播,并使用它们移动branch2指针。有关详细信息,请参阅git rebase --help,包括此操作的图表。

操作可能会产生一些冲突,然后您必须手动解决。编辑受影响的文件,合并内容并删除任何失败的帅哥。然后,使用git add <file>将文件标记为合并,然后使用git rebase --continue继续rebase。重复直到完成。

完成后,您无其他事可做。你不必推。但是,如果您希望将新更改镜像到其他存储库(例如,与其他存储库共享或在您的其他存储库中进行更改),请执行最终git push

答案 2 :(得分:3)

  

我想在branch2之上修改我的更改(来自本地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.

注意:如果分支在远程(例如origin)上,请在分支名称前加上origin/

疑难解答

  • 如果你卡在rebase的中间并且想要重新开始,请运行:

    rm -fr .git/rebase-merge # Abort a rebase-merge mode.
    git reset HEAD --hard    # Reset everything to the current HEAD.
    
  • 如果你在分离的分支上(运行:git branch并寻找星号),请运行:

    git checkout branch2 -f # and start again.
    
  • 如果您遇到冲突,则需要fix them,使用不同的变基点。

  • 如果您想逐步手动进行rebase,请使用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.
    
  • 如果您的rebase在运行git rebase branch1 -i后在交互式列表上显示过多提交,则可以在更改之前根据具体提交启动您的rebase,例如git rebase pr3v1ios

答案 3 :(得分:-1)

首先,您必须确保您对Branch1的引用是最新的(特别是因为它的历史记录已被修改)。

如果你喜欢和当地的copys一起工作,你可以这样做:

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