【问题标题】:Git rebase one branch on top of another branchGit rebase 一个分支在另一个分支之上
【发布时间】:2017-02-21 22:01:30
【问题描述】:

在我的 git 存储库中,我有一个 Master 分支。其中一个远程开发人员创建了一个分支Branch1,并在上面进行了一堆提交。我从Branch1 分支,创建了一个名为Branch2 (git 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 ?非常需要帮助,非常感谢,如果我可以创建分支的备份,万一我搞砸了,那就太好了

【问题讨论】:

标签: git rebase


【解决方案1】:

首先备份你当前的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 上的撇号表示重新定位的Branch2 中的每个提交提交 4 之后实际上是一次重写。

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

git push --force origin Branch2

强制推送可能会给使用 Branch2 的其他任何人带来问题,因此在执行此操作时应小心。

【讨论】:

  • 如果有合并冲突怎么办?当我执行git rebase Branch1 时,它们会出现吗?我假设任何冲突都应该阻止合并,然后我可以在合并分支之前修复它们
  • @newkid101 你当然可以有合并冲突,因为来自Branch2 的每个提交都被重新应用。只需解决所有问题,然后输入git rebase --continue
  • 在哪里提交我在Branch2 中所做的更改?也是在rebase期间吗?
  • 以下是您的选择:如果您想要更改,请在每个文件上执行 git add 然后提交。如果您想要任何更改,您可以通过git reset --hard 将它们丢弃。如果您不确定,可以git stash 稍后再担心。仅当您确定您并不真正想要更改时,才使用重置选项。
  • 我当然想要更改。在我做一个变基之前我会做一个git commit -m "commit message"
【解决方案2】:

git rebase branch1 branch2 将分支branch2 重新定位到branch1。从操作上讲,这意味着仅包含在 branch2(而不是 branch1)中的任何提交都将在 branch1 之上重播,同时移动 branch2 指针。请参阅git rebase --help 了解更多信息,包括此操作的图表。

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

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

【讨论】:

  • 警告:git rebase -i branch1 branch2 会自动检出 branch2,然后修改 branch2 中的提交。 branch1 保持不变。
【解决方案3】:

我想在 branch1 之上重新调整我的更改(从本地 branch2)。

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,使用不同的变基点。

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

    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

【讨论】:

    【解决方案4】:

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

    如果您喜欢使用本地副本,可以执行以下操作:

    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
    

    【讨论】:

      猜你喜欢
      • 2018-06-22
      • 2021-05-09
      • 1970-01-01
      • 2012-07-01
      • 2011-05-27
      • 2011-06-22
      • 1970-01-01
      • 2016-03-25
      • 2022-11-09
      相关资源
      最近更新 更多