【问题标题】:Change branch base改变分支基地
【发布时间】:2012-06-01 16:19:10
【问题描述】:

我有一棵这样的树:

(commit 1) - master
                \-- (commit 2) - (commit 3) - demo
                                                \-- (commit 4) - (commit 5) - PRO

我必须将 PRO 分支移到 master

(commit 1) - master
                |-- (commit 2) - (commit 3) - demo
                \-- (commit 4) - (commit 5) - PRO

我尝试了来自 PRO 分支的 git rebase master,但没有任何反应。

澄清:我在 master 工作,然后我不得不制作一个产品演示(git checkout -b demo 和一些提交)。然后,我错误地从 demo 创建了另一个分支(git checkout -b PRO 和一些提交),现在我需要将 PRO 分支移动到 master 并保持 demo 完好无损。最后,demo 和 PRO 都将从 master 挂起。

【问题讨论】:

标签: git


【解决方案1】:

假设 newBase 是您要将提交移至的分支,oldBase 是您分支的旧基础,您可以使用 --onto

git rebase --onto newBase oldBase feature/branch

鉴于你的情况:

git checkout PRO # Just to be clear which branch to be on.
git rebase --onto master demo PRO

基本上,您将所有从demoPRO 的提交,并将它们重新定位到master 提交。

【讨论】:

  • 如果情况相反,这也是要走的路吗? ==我从master第二个分支结帐-b,但我想从第一个分支开始。所以我做了git rebase --onto first-branch second-branch second-branch,但我不明白语法
  • @Fla 在这种情况下,它将是 git rebase --onto first-branch master second-branch
  • 我在--onto 上读到了这个guide,他们的写作方式帮助了我git rebase --onto newBase oldBase feature/branch
  • @PhilipRego 这是不正确的。 origin/newBase 是分支的名称,就像我的示例中的 newBase 一样。这仅取决于您是要重新定位到本地存储库中存在的分支 (newBase),还是远程存储库 (origin/newBase) 中存在的分支。
  • @PhilipRego 这些不是独立的东西。 newBase 是本地分支的名称,origin/newBase 是远程分支的名称。你想要哪一个取决于你要基于什么。不是一种有效,一种无效,而是它们基于不同的事物。最初的问题从未提及遥控器,因此在我的示例中使用遥控器与所提出的问题不匹配。
【解决方案2】:

我会尽量做到通用。首先,确保您在所需的分支上:

git checkout current-branch

然后使用以下命令(其中new-base-branch 是您想要成为新基地的分支,current-base-branch 是您当前基地的分支。)

git rebase --onto new-base-branch current-base-branch

如果你没有冲突,那就太好了——你已经完成了。如果您这样做(在大多数情况下),请继续阅读。

可能会出现冲突,您必须手动解决它们。 Git 现在尝试在 current-branchcurrent-base-branchnew-base-branch 之间进行“三向合并”。大致上这就是 git 在内部的工作方式:

  1. Git 将首先在 new-base-branch 之上重新设置 current-base-branch。可能会有冲突;您必须手动解决。完成后,您通常会执行git add .git rebase --continue。它将为此创建一个新的临时提交temp-commit-hash

  2. 在此之后,Git 现在会将您的 current-branch 重新定位在 temp-commit-hash 之上。可能会有进一步的冲突,您将不得不再次手动解决它们。完成后,您再次使用git add .git rebase --continue 继续,之后您已成功将current-branch 重新定位到new-base-branch 之上。


注意:如果你开始搞砸了,那么你可以在 rebase 过程中随时git rebase --abort 并回到起点。

【讨论】:

  • 发布的rebase 命令只给了我“致命:无效的上游'current-base-branch'”。另外,为什么还要告诉 GIT 当前分支的当前父分支是什么——它不应该已经知道了吗?
  • @ARK 简单解释。谢谢你。为我工作。
【解决方案3】:

结帐到PRO 分支,复制此分支的最旧 (commit4) 和最新 (commit5) 提交哈希并粘贴到其他位置:

$ git checkout PRO
$ git log            # see the commit history
# copy the oldest & latest commit-hash 

删除PRO 分支(为安全起见保留备份)。从master 创建并结帐到新的PRO 分支:

$ git branch PRO.bac    # create a new branch PRO.bac = PRO as backup

$ git checkout master
$ git branch -D PRO     # delete the local PRO branch
$ git checkout -b PRO   # create and checkout to a new 'PRO' branch from 'master'

将先前PRO 分支的提交范围取(cherry-pick)到新的PRO 分支:

$ git cherry-pick commit4^..commit5   # cherry-pick range of commits
# note the '^' after commit4

现在,如果一切正常,则强制 (-f) 推送到 remote PRO 分支并删除本地 PRO.bac 分支:

$ git log                  # check the commit history

$ git push -f origin HEAD  # replace the remote PRO by local PRO branch history
# git branch -D PRO.bac    # delete local PRO.bac branch

【讨论】:

  • 请注意,您应该更新您的代码,备份并删除原始代码,您可以改为:git branch -m PRO PRO.bac — 对分支进行简单的重命名。
【解决方案4】:

我有一个稍微不同的方法,使用 reset 和 stash,避免删除和重新创建分支以及消除切换分支的需要:

$ git checkout PRO
$ git reset commit4 # This will set PROs HEAD to be at commit 4, and leave the modified commit 5 files in ur working index
$ git stash save -m "Commit message"
$ git reset commit3
$ git stash save -m "Commit message"
$ git reset master --hard
$ git stash pop
$ git stash pop
$ git push --force # force if its already been push remotely

通过在逐个提交的基础上重置分支,您基本上只是一次倒回该分支的历史提交。

【讨论】:

  • 第4行“commit”和“3”之间的空格要不要去掉?
【解决方案5】:

我知道这个问题已经很老了,但如果它对某人有帮助,请分享。

我的情况相同,我从不同的基础分支提出 PR,并且更改基础分支和变基显示 200 多个文件冲突。

即使解决它也会显示我不想要的旧提交。所以我做的是

  1. 从本地删除分支
  2. 创建同名的新分支,确保这次选择正确的基础分支
  3. Cherry-pick 提交 ID(如果有)

终于跑到命令下面了

git push origin +branchName:branchName

您也可以在上面使用-f 代替+。 上面的命令将我的分支置于一个状态,而不影响我的拉取请求。

【讨论】:

    【解决方案6】:
    git branch --set-upstream-to another_branch
    

    【讨论】:

    • 这没有回答问题。请检查问题中的提交图,它询问如何移动分支PRO,以便它从旧的master 分支而不是demo 分支。这个命令只是改变了远程分支。
    • 这破坏了我的环境,因为我很匆忙。为什么它显示为第一个响应?
    猜你喜欢
    • 2021-11-04
    • 2016-09-20
    • 2018-01-07
    • 2023-01-03
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 2011-04-12
    相关资源
    最近更新 更多