GIT - 切换到另一个遥控器(没有丢失提交)

GIT - Switch to another remote (Without lose commits)

我从一个仓库中克隆了一个,例如: https://github.com/test1/project.git

这是另一个 repo 的克隆,有很多更改(+1000 次提交),然后我在我的本地项目中添加了 +200 次提交。

现在,我想切换到主仓库。 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,我只想切换到 [=17] =] 只合并我自己的提交。

ElunaTrinityWotlk 是 TrinityCore 的克隆,用于添加一些新功能...查看 ElunaTrinityWotlk 的提交,我不再需要 ElunaTrinityWotlk 功能想要切换到TrinityCore 分支 3.3.5,我只需要将我自己的更改与 TrinityCore 合并,删除 ElunaTrinityWotlk.

的提交

好吧,当你说你想要 "switch to the main repo" 时,我脑子里有好几件事是什么意思。这不是其中之一。

哎呀...这是高级...

好吧,这可能的,但不会简单。 做好备份以防万一你搞砸了,所以你可以再试一次。好吧,这真的不是必需的,但像这样的东西,安全总比后悔好。

TL; DR: 制作另一个 GitHub 从 Trinity 分叉出来的 repo;在本地,在单个存储库中,从 Eluna 和 Trinity 存储库获取提交;从 Eluna 提交树中挑选你的提交到 Trinity 树;推回 Trinity 存储库。

更详细:

如果您使用 Windows,我建议您使用 TortoiseGit。这是我选择的武器,它既易于使用又先进。如果您不在 Windows 中,或者您有另一个您更熟悉的工具,您可以使用它。最终这一切都可以在命令行中完成——只是比较乏味。

所以,这里有几个步骤。

首先,您自己的 github 存储库是从 Eluna 分叉而来的,所以这样不行。创建另一个从 Trinity 分叉出来的。暂时保留第一个,以备不时之需,以防您搞砸并需要重新开始。

然后,转到所有更改所在的本地计算机上的本地副本。确保将所有更改推送到基于 Eluna 的 github 存储库。这是一种预防措施,这样您就不会丢失工作。还要检查是否没有本地修改。为了额外的安全,还要清理所有未版本控制的文件。让它看起来像是一个没有任何修改的新克隆的 repo。

或者,只需在不同的文件夹中创建另一个基于 Eluna 的 github 存储库的克隆。重新开始。

无论如何,下一步 - 制作一些标签。特别是标记你自己的最新提交,这样你就不会丢失它。

然后 - 引入 Trinity。在您的本地存储库中,创建另一个遥控器并使其指向基于 Trinity 的 github 存储库。 从该远程获取 更改。别拉! FETCH.

现在您的本地副本将包含来自基于 Eluna 的存储库和基于 Trinity 的存储库的提交的混搭,并且每个都有自己的远程。

接下来,从 Trinity 提交创建一个新分支,您要在其上移动您自己的提交。

困难的部分来了。您需要做的是 cherry pick 您自己的提交,并将它们移动到您的新分支。 Cherry 按顺序挑选提交,从最旧的开始。在 TortoiseGIT 中,您可以 select 多次提交并一次性全部挑选出来。

时不时地,您会在拉取最新的 Eluna 版本并将其合并到您自己的代码中时进行合并提交。 不要樱桃采摘这些。这只会带来整个 Eluna 项目。只挑选你自己的提交。

很可能会出现合并冲突,或者您可能编辑了一些在 Eluna 中但不在 Trinity 中的代码。在那种情况下 - 祝你好运!您需要手动弄清楚如何正确挑选该提交。

最后,在几个小时(或几分钟或几天,具体取决于您在那里所做的事情)之后,您将在最新的 Trinity 提交之上精心挑选所有提交。呸!

现在检查该项目是否仍然有效。经过这么长时间的挑选,您很可能错过了一些东西。修复它并提交这些更改。

最后,您有一个基于 Trinity 提交的新分支,它现在还包含您所有精心挑选的提交和其他更改。将其推送到您的 Trinity github 存储库。大功告成!

擦除本地副本并重新克隆基于 Trinity 的 github 存储库以获得干净的状态。

你需要做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*