将现有github存储库的远程更改为新的github存储库,同时保留所有分支

k2fxgqgv  于 2023-01-15  发布在  Git
关注(0)|答案(1)|浏览(130)

让我首先说,我已经审查了类似的问题,但我认为这里的事实略有不同,在那些问题。
我正在Angular University上学习课程,从Angular Core Deep Dive开始。我的本地文件夹结构是Documents/Angular-University/Angular Core Deep Dive/angular-course。我在angular-course中创建了几个不同的分支。我已经推送了一些更改,我想我有一次推送时遇到了麻烦,但我没有多想。
今天我发现我的最后一次推送是在Angular University的官方Github repo,angular-university/angular-course上的Pull Request.我以为我曾经分叉了他们的repo来使用他们的启动代码,但我也认为我创建了自己的repo(我给他们发了邮件,请他们撤销Pull Request,因为我自己似乎无法取消它).
我现在要做的是创建我自己的repo,并将我的代码和我在不同分支上的所有更改推送到它。
我读到一个关于创建一个新文件夹并将当前repo文件夹中的所有文件移动到新文件夹的问题,但是当你在本地有多个分支时,这是如何工作的呢?我想我一开始就不明白不同分支中的不同代码是如何存储在你的本地机器上的。我在文件夹中只看到一组文件。
我不希望新的回购协议是一个分支的Angular 大学回购任何更多,所以我不知道如果这使事情复杂化。
任何帮助都很感激。

dwbf0jvd

dwbf0jvd1#

避免问题

避免推送到错误的分支或错误的目的地的最好方法是使用push的两个参数形式建立ALWAYS的习惯:

git push <repository> <refspec>

(其中refspec 99%的时候是分支名称),这样你就可以准确地指定你要推送的内容,以及你要推送的位置,没有任何惊喜的余地。

遥控器数量

现在,关于将您的代码与它所源自的上游源代码分离,没有必要这样做,通常保持血统的跟踪是有益的。
Git支持任意数量的remote与仓库关联,如果你总是通过显式指定远程目的地来推送,那么即使你有几十个其他潜在的远程目的地也没关系。
从git的Angular 来看,远程对象的名称没有任何特定的含义,但从心理Angular 来看,最好保持一致,使用origin作为要推送内容的远程,而不是在不同的存储库中使用不同的名称。我使用远程名称upstream作为fork的源存储库。如果添加其他fork,我通常使用userhandle(例如,从https://github.com/userhandle/...)作为远程名称。

示例

我有Michael的git-test存储库的一个分支,当我在本地克隆中运行git remote -v时,我得到

origin  git@github.com:hlovdal/git-test.git (fetch)
origin  git@github.com:hlovdal/git-test.git (push)
upstream        https://github.com/mhagger/git-test (fetch)
upstream        https://github.com/mhagger/git-test (push)

因此,每当我有一些分支,我一直在工作,并希望推到我的分叉,我运行git push origin documentation_update或类似的(如果我曾经想把东西直接推到他的仓库的命令将是git push upstream documentation_update,虽然我没有看到任何用例).
有了上游远程可用,我可以做的就是从上游项目中获取更新,并将其合并到我的分支中,例如。

git fetch upstream
git checkout master
git merge --ff upstream/master
git push origin master
git rebase master documentation_update

因此,将fork源代码作为远程通常是非常有益的,我不建议跳过这一步。

补救措施

现在回到你的情况与你的Angular 大学回购。假设如下:

考虑到这一点,那么就没有必要做像克隆fork那样激烈的事情,并从新的克隆重新开始。
由于您已经克隆了angular-university的repo,因此默认情况下它将以origin远程文件结束,例如,当您运行git remote -v时,它将显示

origin  https://github.com/angular-university (fetch)
origin  https://github.com/angular-university (push)

没问题,重新命名即可:

git remote rename origin upstream

然后加上叉子

git remote add origin git@github.com:apex2022/angular-course.git

现在,存储库的origin remote像您希望的那样指向您的for,并且您可以访问上游存储库进行更新。
如果您发现使用upstream遥控器会使gitk --all中的视图过于嘈杂,您可以随时使用git remote remove upstream删除它,当您想要它时,只需运行git remote add upstream https://github.com/angular-university
最后一件要检查的事情是,是否有任何分支设置为跟踪upstream而不是origin

git config -l | grep '^branch.*remote='

然后如果你想改变就运行

git branch --set-upstrem-to=origin/my_branch_name my_branch_name

1出于同样的原因,我从不运行参数少于两个的rebase(例如git rebase onto_ref branch_to_be_rebased,有时是三个:git rebase --onto onto_ref starting_ref branch_to_be_rebased)。

相关问题