由于主/主更改,我如何更新我的GitHub镜像? [英] How do I update my GitHub mirror due to the master/main change?
问题描述
我模仿了几年前GitHub的一个项目。本项目参与了主分店的更名仪式。我有一段时间没碰我的叉子了,我的叉子上有一根树枝,还有一把本地的叉子。但我的叉子和特殊分支是在源项目使用主分支时创建的!如何将分叉转换为使用";Main,&q;包括同步到源的&Quot;Main&Quot;?
推荐答案
分支名称在Git中没有实际意义,可以随时更改。因此,尽管这只是简单的部分,但部分工作是只输入您自己的克隆,并将它们的master
重命名为main
。
包括同步到源的&Quot;Main&Quot;?
我们将把它留到最后。
术语说明
GitHub上的A&fork";本质上是带有一些额外功能的克隆。从现在开始,我将使用术语&fork";来指代GitHub克隆,并使用术语&克隆&或您的克隆&来指代本地克隆。假定您还没有克隆的说明
(以下是针对其他人的说明:您提到您已经有一个本地克隆。)
GitHub不提供直接重命名分支的方法,因此如果要重命名分支中的分支,必须首先在本地将其克隆到您自己的计算机上:
git clone --no-checkout <url>
(其中url
是ssh://git@github.com/name/repo.git
、git@github.com:name/repo.git
或https://github.com/name/repo.git
之一)在您自己的计算机上创建本地克隆。对于这台机器,您需要安装Git。注意:我们使用--no-checkout
,因此您的新克隆还没有分支。您拥有所有提交和无分支。
输入您刚刚创建的克隆:
cd repo
例如。您的克隆将有一个远程跟踪名称origin/master
,您可以使用该名称在您的GitHub克隆中创建新名称:
git push origin origin/master:main
您的GitHub分支现在对同一提交有两个不同的名称:master
和main
。现在,您可以通过Web界面或命令行删除GitHub分支的master
:
git push origin --delete master
由于我们使用--no-checkout
创建了此克隆,现在我们只需运行:
git checkout main
在本地创建分支机构名称main
,并将origin/main
设置为其上游。
假定您确实具有本地克隆
的说明 您的本地克隆可能已经有master
。让我们确保您的叉子是最新的:
cd my-local-clone
git fetch origin # if needed
git checkout master # if needed
git rebase origin/master # if needed
git branch -m master main
现在我们只需要在GitHub上创建名称main
,与上面的示例相同-但我们将使用本地main
来完成该操作,因为这会稍微短一些:
git push -u origin main && git push origin --delete master
我们可以使用-u
选项将我们的本地main
更新为引用origin/main
,这将完成除删除分叉中的名称master
以外的所有操作(请参阅上面的脚注1),因此我们使用单独的步骤完成此操作。
现在,您可能希望使用GitHub的Web界面更改分支中的主分支名称
我不确定GitHub是否有什么智能功能可以在您删除名称master
时自动执行此操作。我的猜测是它们没有。(我还没有尝试过我的任何分支。)This web page also implies that they don't.您需要进入设置页面并选择main
作为默认分支。
完成此操作后,使用git remote set-head
更新本地克隆不失为一个好主意:
git remote set-head origin --auto
这将使您的origin/HEAD
反映新的origin/main
设置。
(所有这些都是可选的,它们只是让一些非致命但奇怪的错误案例消失了。)
更新叉子
现在是更新您自己的分支的时候了。这是最难的部分,因为:
您必须在此处准确决定要更新的内容以及更新方式。需要记住的关键是,Git不关心分支机构名称。它只关心提交。使用我有一段时间没碰过叉子了,叉子里有根树枝……
git log --graph
或某个提交图查看器来查看提交及其相互之间的关系。
您需要为您的fork上游的fork命名-您在制作giHub fork时使用的GitHub克隆。它的标准名称是upstream
。(我认为这个名称有点令人困惑,因为每个分支也可以有一个上游集,而且谈论分支X的上游设置以及名为upstream的远程服务器上的内容有点奇怪,但我们现在就用它来说明一下。)
您可能已经有了一个名称。使用git remote
或git remote -v
查看您现有的远程名称。假设您只有origin
并打算添加upstream
,则使用git remote add
创建upstream
:
git remote add upstream <url>
其中url
是其分支的GitHub URL。然后运行:
git fetch upstream
从它们获取任何新的提交,并在克隆中创建您自己的upstream/main
和其他远程跟踪名称。
main
。如果您还不是一个人main
:
git checkout main # or git switch main
现在运行git merge --ff-only upstream/main
或git rebase upstream/main
,或者您可能想在这里执行的任何操作。如果您想丢弃您拥有的任何main
(旧的master
)提交--可能没有任何这样的提交,在这种情况下,合并或重新基址都将执行与此相同的操作--您可以使用:
git reset --hard upstream/main
无论您使用其中的哪一个,您自己的本地main
名称现在都标识与您的upstream/main
相同的提交:上游分支使用其名称main
标识的相同提交。现在您可以更新您的GitHub分支:
git push origin main # add --force if needed and desired
如果要在此过程中丢弃某些提交,则只需要--force
选项。
然后,您必须对您自己的分支机构做出相同类型的决定。你想保留任何你有但他们没有的承诺吗?他们有没有这个名字的分支机构,如果有,它与你的这个名称的分支机构有关系吗?(每个存储库都有自己的分支名称,并且不要求以相同的方式使用它们。)
假设它们没有丢弃任何提交-如果它们丢弃了,您的Git现在会认为这些提交是您的提交,并尝试将它们用作分支的一部分-您现在可以根据自己的main
:
git checkout xyzzy
git rebase main
如果他们丢弃了一些提交,您可能需要git rebase --onto
以便将这些提交排除在您的更新之外;请参阅其他StackOverflow问题以了解如何做到这一点。
复制提交时可能会出现合并冲突,具体取决于它们更改代码的程度。如果是这样的话,你将不得不解决它们。如果有很多较大的冲突,我建议您在开始REBASE操作之前为旧的分支提示COMMIT创建一个新的分支名称来保存原始提交集:
git checkout xyzzy
git branch xyzzy.0
git rebase main
完成rebase后,您将拥有xyzzy.0
(原始提交与以前显示的一样)和xyzzy
(新的和改进的提交副本)。如果在重新建立基地的过程中出了问题,现在可以相对容易地回去查看您最初的提交。
无论哪种方式,您现在都可以使用:
git push -f origin branch
要将新提交发送到您的GitHub fork并使您的GitHub fork Git存储库使用名称branch
来标识来自rebase的新提交和改进的提交。是否也在您的分支上创建名称branch.0
,以保留对原始提交的访问权限,这由您自己决定。
这篇关于由于主/主更改,我如何更新我的GitHub镜像?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!