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

new*_*101 40 git rebase

在我的git repo中,我有一个Master分支.其中一个远程开发人员创建了一个分支,Branch1并在其上进行了一系列提交.我分支Branch1,创建一个名为Branch2(git checkout -b Branch2 Branch1)的新分支,以便Branch2头部在最后一次提交时添加到Branch1:(看起来像这样)

Master---
         \
          Branch1--commit1--commit2
                                   \
                                    Branch2 (my local branch) 
Run Code Online (Sandbox Code Playgroud)

Branch1有过一些变化.另一个开发者压缩了他的提交,然后添加了一些提交.与此同时,香港专业教育学院在我的分支机构中进行了一系列更改但尚未提交任何内容 目前的结构如下:

  Master---
             \
             Branch1--squashed commit1,2--commit3--commit4
                                       \
                                        Branch2 (my local branch)
Run Code Online (Sandbox Code Playgroud)

现在我想要改变我的变化Branch1.我对如何解决这个问题感到非常困惑.我知道第一步是使用git add .和提交我的更改git commit -m "message".但是我会推吗?用git push origin Branch2?还是git push origin Branch2 Branch1?非常需要帮助,非常感谢,如果我可以创建一个如何创建我的分支的备份,这将是伟大的,以防万一我搞砸了

Tim*_*sen 46

首先备份你的当前Branch2:

# from Branch2
git checkout -b Branch2_backup
Run Code Online (Sandbox Code Playgroud)

然后重新Branch2开始Branch1:

# from Branch2
git fetch origin           # update all tracking branches, including Branch1
git rebase origin/Branch1  # rebase on latest Branch1
Run Code Online (Sandbox Code Playgroud)

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

master --
         \
          1 -- 2 -- 3 -- 4 -- Branch2'
Run Code Online (Sandbox Code Playgroud)

在上图中,撇号on Branch2表示提交4 Branch2 之后 rebased中的每个提交实际上都是重写.

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

git push --force origin Branch2
Run Code Online (Sandbox Code Playgroud)

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


dka*_*sak 16

git rebase branch1 branch2将完全重订下的变化branch2branch1.

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

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

  • 警告:`git rebase -i branch1 branch2` 会自动检出 branch2,然后修改 branch2 中的提交。branch1 保持不变。 (3认同)

ken*_*orb 5

我想branch2branch1.

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.
Run Code Online (Sandbox Code Playgroud)

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

故障排除

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

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

    git checkout branch2 -f # and start again.
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果遇到冲突,则需要修复它们,使用不同的变基点。

  • 如果您想逐步手动进行变基,请使用樱桃采摘。例如

    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.
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果您的变基在运行后在交互式列表上显示太多提交git rebase branch1 -i,您可以在更改之前给定特定提交开始变基,例如git rebase pr3v1ios.