git - 将现有分支移动到新的子分支

时间:2018-02-08 12:14:33

标签: git rebase

我有以下情况:

                  F---G---H BranchB
                 /
A---B---C---D---E---I---J BranchA

我希望BranchA指向BranchB(提交H)并丢弃提交I和J,然后删除BranchB:

A---B---C---D---E---F---G---H BranchA

关于如何实现这一点的任何想法?

2 个答案:

答案 0 :(得分:0)

首先是一些术语:你可能会注意到我已经为你的标题提交了一个编辑,因为git这个单词HEAD(在所有大写字母中)意味着“目前已经检查了什么”。确实,头部也可能意味着分支提示,但即使这样,问题也不是最直接的方式 - 这可能就是您无法找到答案的原因。

因为一旦你知道你要求做的只是移动分支指向与另一个分支相同的提交,git docs应该指向正确的方向。

您可以使用git reset

git checkout branchA
git reset --hard branchB

或者您可以将branch与“force”选项一起使用

git checkout branchB
git branch -f branchA

“无法访问”的提交 - IJ - 仍然存在(暂时)。您可以使用reflog或其提交ID来访问它们。如果您认为有可能会让他们在路上,您可能会在上面贴上标签。如果不这样做,最终它们的reflog条目将过期,之后它们将被gc丢弃。

如果在推动分支后以这种方式移动分支,则必须使用“强制”选项让远程接受更新。这反过来意味着该仓库的任何其他用户必须采取恢复步骤。这相当于git rebase文档中描述的“上游rebase”,因此如果您的repo有其他用户,您应该查看该信息并确定它是否仍然值得做。 (通常,最佳做法是要求受影响的用户之间达成协议,以执行任何需要强制推送的操作。)

答案 1 :(得分:-1)

要将分支移动到其他提交,您可以使用git reset命令。

因此,使BranchA引用与BranchB相同的提交的步骤可以使用这个git命令序列:

git checkout BranchA
git reset --hard BranchB

这将移动分支指针以及使用BranchB中的文件(现在也是BranchA的文件)清理工作文件夹。

请注意,如果您已将BranchA推送到远程,则可能会拒绝推送更新的分支,除非您使用“force-push”。

使用强制推送时,确保您不会丢失远程提交,但这里是如何强制推送更新的BranchA分支:

git push -f