GIT - 切换到另一个远程分支(不丢失提交记录)

3
我已经从一个repo克隆了一个项目,例如:https://github.com/test1/project.git 这是另一个repo的克隆,有很多变化(+1000次提交),然后我在本地项目中添加了+200次提交。
现在,我想切换到主要的repo。https://github.com/main/project.git 我不想失去我的更改,但我想删除本地项目中test:project的所有提交并切换到main:project,而不会丢失自己的提交和更改。
怎么做最好?

真实例子:

我从中制作了一个克隆

https://github.com/ElunaLuaEngine/ElunaTrinityWotlk

然后我在本地项目中进行了自己的更改和提交。

现在我想要切换到:

https://github.com/TrinityCore/TrinityCore/tree/3.3.5

保留我的提交,移除所有来自ElunaTrinityWotlk的提交,我不想将ElunaTrinityWotlk的提交合并到TrinityCore中,我只想切换到TrinityCore分支,并将自己的提交与其合并。 ElunaTrinityWotlk是从TrinityCore克隆出来添加一些新功能的...看看ElunaTrinityWotlk的提交,我不再需要ElunaTrinityWotlk的功能,希望切换到TrinityCore分支3.3.5,只需要将我的更改与TrinityCore合并并移除ElunaTrinityWotlk的提交。

enter image description here

2个回答

3

您需要创建2个分支

  1. 带有Eluna的分支
  2. 带有TrinityCore的分支

然后您需要使用git cherry-pick从Eluna分支到TrinityCore分支,最简单的方法是通过一些GUI工具如gitkraken中的一个按钮来完成。在这种情况下,您只需切换到TC分支,然后点击提交您在Eluna分支上进行的更改并选择cherry-pick。如果在控制台中操作,则需要在TC分支中使用以下命令:

git cherry-pick -x *hash of commit in Eluna branch*

1

好的,当你说你想要“切换到主repo”时,我脑海中有几个可能的意思。但这不是其中之一。

天啊...这太高级了...

好的,这是可能的,但不会很简单。备份以防搞砸,这样你可以再试一次。嗯,其实并不需要,但对于这样的事情,小心一点总比后悔好。

简而言之:从Trinity再创建另一个GitHub repo;在本地的单个repo中,从Eluna和Trinity repos中获取提交;从Eluna提交树中选择你的提交并将其移到Trinity树中;将更改推回Trinity repo。

更详细的步骤:

如果你使用Windows,我建议使用TortoiseGit。那是我的首选武器,既易于使用又高级。如果你不在Windows上,或者你有另一个更熟悉的工具,你也可以使用它。最终这一切都可以在命令行中完成——只是更加繁琐。

所以,这里有几个步骤。

首先,你的github仓库是从Eluna分叉出来的,这样不行。创建另一个仓库,从Trinity分叉出来。暂时保留第一个仓库,以防出现问题需要重新开始。
然后,进入本地电脑上的本地副本,其中包含所有更改。确保所有更改都推送到基于Eluna的github仓库中。这是一种预防措施,以免丢失工作。还要检查是否有本地修改。为了更加安全,也要清理所有未版本化的文件。让它看起来像是一个完全没有修改的新克隆仓库。
或者,只需在不同的文件夹中再次克隆基于Eluna的github仓库即可。重新开始。
无论如何,下一步-标记一些内容。特别是要标记自己最新的提交,以免丢失。
然后-引入Trinity。在本地repo中,创建另一个远程并将其指向基于Trinity的github repo。从该远程获取更改。不要拉!获取
现在,您的本地副本将具有来自基于Eluna和基于Trinity的github仓库的提交混合,并且每个提交都有自己的远程。

接下来,从Trinity提交中创建一个新的分支,然后将你自己的提交移动到这个分支上。

现在就是难点了。你需要做的是挑选你自己的提交,并将它们移到你的新分支上。按顺序挑选提交,从最早的开始。在TortoiseGIT中,你可以选择多个提交并一次性挑选它们。

有时候,你会遇到合并提交,这些提交是你拉取最新的Eluna版本并将其合并到你自己的代码中产生的。不要挑选这些提交。那样只会带着整个Eluna项目。只挑选你自己的提交。

很可能会出现合并冲突,或者你已经编辑了一些Eluna中不存在但Trinity中存在的代码。在这种情况下,祝你好运!你需要手动找出如何正确地挑选那个提交。

最终,经过几个小时(或几分钟、几天,取决于你的工作量),你所有的提交都被挑选到了最新的Trinity提交之上。太棒了!

现在检查一下项目是否仍然正常工作。在这么长时间的挑选之后,你可能会漏掉一些东西。修复它们并提交这些更改。

最终,您将拥有一个基于Trinity提交的新分支,其中还包含所有您挑选的提交和其他更改。将其推送到您的Trinity github仓库。完成了!
清除本地副本并重新克隆您基于Trinity的github仓库以获得干净的状态。

现在请检查问题,我认为现在已经清楚了,谢谢。 - Amin.MasterkinG
2
@Amin.MasterkinG - 好的,已更新答案。请查看。 - Vilx-
1
@Amin.MasterkinG - 嗯,是什么让你改变了复选框呢? :) - Vilx-
1
both answer are - Amin.MasterkinG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接