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

git - Move existing branch to new child branch

我有以下情况:

                  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

知道如何实现吗?

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

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

git checkout BranchA
git reset --hard BranchB

这将移动分支指针并使用来自 BranchB 的文件(现在也是 BranchA 的文件)清理您的工作文件夹。

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

使用强制推送时,请确保您不会丢失远程中的提交,但以下是强制推送更新后的 BranchA 分支的方法:

git push -f

首先是一些术语:您可能会注意到我已经提交了对您的标题的修改,因为对于 git 单词 HEAD(全部大写)表示 "what's checked out at the moment"。的确,head 也可以表示分支提示,但即便如此,它也不是提出问题的最直接方式 - 这可能就是您找不到答案的原因。

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

您可以使用git reset

git checkout branchA
git reset --hard branchB

或者您可以使用 branch 和 "force" 选项

git checkout branchB
git branch -f branchA

成为 "unreachable" - IJ 的提交 - 仍然存在(目前)。您可以使用 reflog 或他们的提交 ID 联系他们。如果您认为将来有可能需要它们,您可以给它们贴上标签。如果不这样做,最终它们的 reflog 条目将过期,之后它们将被 gc.

丢弃。

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