繁体   English   中英

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 单词 HEAD(全部大写)的意思是“目前已签出的内容”。 确实,head 也可以表示分支提示,但即便如此,这也不是提出问题的最直接方式——这可能是您找不到答案的原因。

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

您可以使用git reset

git checkout branchA
git reset --hard branchB

或者您可以使用带有“force”选项的branch

git checkout branchB
git branch -f branchA

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

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

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

因此,为了使步骤BranchA指同一提交的BranchB确实还可以使用Git命令序列:

git checkout BranchA
git reset --hard BranchB

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

请注意,如果您已经将BranchABranchA远程,除非您使用“强制推送”,否则您可能会被拒绝推送更新的分支。

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

git push -f

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM