由于 master/main 更改,如何更新我的 GitHub 镜像?

CTM*_*ser 5 git branch rename github

我几年前镜像了一个 GitHub 项目。该项目参与了“master”到“main”分支的重大更名。我有一段时间没碰我的叉子了,我的叉子里有一根树枝,还有我的叉子的本地副本。但是当源项目使用“master”时,我的分支和特殊分支是基于的!如何将我的 fork 转换为使用“main”,包括同步到源的“main”?

tor*_*rek 5

Git 中的分支名称没有实际意义,可以随时更改。因此,有些工作(尽管这只是简单的部分)就是输入您自己的克隆并将其重命名mastermain.

\n
\n

包括同步到源的“主”?

\n
\n

我们将其留到最后。

\n

术语说明

\n

GitHub 上的“分叉”本质上是具有一些额外功能的克隆。从这里开始,我将使用术语“fork”来指代 GitHub 克隆,并使用术语“克隆”或“您的克隆”来指代本地克隆。

\n

假设您还没有克隆的说明

\n

(这些说明适用于其他人:您提到您已经有一个本地克隆。)

\n

GitHub 不提供直接重命名分支的方法,因此如果您想重命名分支中的分支,您必须首先将其克隆到本地计算机:

\n
git clone --no-checkout <url>\n
Run Code Online (Sandbox Code Playgroud)\n

(例如,url其中 是ssh://git@github.com/name/repo.gitgit@github.com:name/repo.git或 之一)在您自己的计算机上创建本地克隆。https://github.com/name/repo.git您需要为该机器安装 Git。注意:我们正在使用,--no-checkout以便您的新克隆还没有分支。您拥有所有提交,但没有分支

\n

输入您刚刚制作的克隆:

\n
cd repo\n
Run Code Online (Sandbox Code Playgroud)\n

例如。您的克隆将有一个远程跟踪名称 ,origin/master您可以使用它在 GitHub 克隆中创建新名称:

\n
git push origin origin/master:main\n
Run Code Online (Sandbox Code Playgroud)\n

现在,您的 GitHub 分支对于同一提交有两个不同的名称:bothmastermain. master您现在可以通过 Web 界面或命令行删除 GitHub fork :

\n
git push origin --delete master\n
Run Code Online (Sandbox Code Playgroud)\n

由于我们使用 创建了这个克隆--no-checkout,所以我们现在可以运行:

\n
git checkout main\n
Run Code Online (Sandbox Code Playgroud)\n

在本地创建分支名称main,并将origin/mainset 作为其上游。

\n

假设您确实本地克隆的说明

\n

您的本地克隆可能已经有一个master. 让我们确保它与您的 fork 是最新的:

\n
cd my-local-clone\ngit fetch origin                  # if needed\ngit checkout master               # if needed\ngit rebase origin/master          # if needed\ngit branch -m master main\n
Run Code Online (Sandbox Code Playgroud)\n

现在我们只需要在 GitHub 上创建名称main,与上面的示例相同\xe2\x80\x94,但我们将使用本地名称main来执行此操作,因为它有点短:

\n
git push -u origin main && git push origin --delete master\n
Run Code Online (Sandbox Code Playgroud)\n

我们可以使用该-u选项来更新本地main引用,这完成了除了删除fork 中的origin/main名称之外的所有操作(请参阅上面的脚注 1),因此我们使用单独的步骤来完成此操作。master

\n

现在,您可能想要使用 GitHub 的 Web 界面来更改分支中的主分支名称

\n

我不确定 GitHub 是否有任何智能功能可以在您删除 name 时自动执行此操作master。我的猜测是他们没有。(我还没有用我的任何叉子尝试过。) 这个网页也暗示他们没有。 您需要进入设置页面并选择main作为默认分支。

\n

git remote set-head完成此操作后,使用它来更新本地克隆并不是一个坏主意:

\n
git remote set-head origin --auto\n
Run Code Online (Sandbox Code Playgroud)\n

这将使您origin/HEAD反映新的origin/main设置。

\n

(所有这些都是可选的,它们只是让一些非致命但奇怪的错误情况消失。)

\n

更新你的分叉

\n

现在是时候更新你自己的 fork 了。这是最困难的部分,因为:

\n
\n

我有一段时间没碰我的叉子了,我的叉子里有一根树枝......

\n
\n

您必须在此处准确决定要更新的内容以及更新方式。要记住的关键是 Git不关心分支名称。它只关心提交。使用git log --graph或某些提交图查看器来查看提交及其彼此之间的关系。

\n

您需要一个位于 fork\xe2\x80\x94 上游的 fork 名称(您在创建 GitHub 分支时使用的 GitHub 克隆)。其标准名称是upstream. (我认为这个名称有点令人困惑,因为每个分支也可以有一个上游集,并且谈论分支 X 的上游设置并谈论名为上游的远程设备上的内容有点奇怪,但我们现在就这样吧。)

\n

您可能已经有这个名称了。使用git remotegit remote -v查看现有的远程名称。假设您只有并且origin打算添加upstream,使用git remote add创建upstream

\n
git remote add upstream <url>\n
Run Code Online (Sandbox Code Playgroud)\n

其中url是他们的 fork 的 GitHub URL。然后运行:

\n
git fetch upstream\n
Run Code Online (Sandbox Code Playgroud)\n

从他们那里获取任何新的提交,并upstream/main在克隆中创建您自己的名称和其他远程跟踪名称。

\n

您现在可以合并、快进、变基或以其他方式更新您的main. 如果您还没有独自一人main

\n
git checkout main    # or git switch main\n
Run Code Online (Sandbox Code Playgroud)\n

现在运行git merge --ff-only upstream/main、 或git rebase upstream/main,或者您可能想在这里执行的任何操作。如果你想放弃你拥有的任何main(旧的master)提交,那么它们不\xe2\x80\x94可能没有任何这样的提交,在这种情况下,合并或变基都会做同样的事情,这将\xe2 \x80\x94你可以使用:

\n
git reset --hard upstream/main\n
Run Code Online (Sandbox Code Playgroud)\n

无论您使用其中哪一个,您自己的本地main名称现在都会标识与您相同的提交upstream/main:上游分支用其名称标识相同的提交main。现在您可以更新您的 GitHub 分支:

\n
git push origin main    # add --force if needed and desired\n
Run Code Online (Sandbox Code Playgroud)\n

--force仅当您在此过程中放弃某些提交时才需要该选项。

\n

然后,您必须对自己的分支机构做出同样的决定。您想保留您拥有而他们没有的任何承诺吗?他们是否有一个具有此名称的分支?如果有,它是否与您的同名分支相关?(每个存储库都有自己的分支名称,并且不要求以相同的方式使用它们。)

\n

假设他们没有删除任何提交\xe2\x80\x94如果有的话,你的Git现在会认为这些提交是你的提交,并尝试将它们用作你的分支的一部分\xe2\x80\x94你现在可以自行重新设置分支的基础,无论其名称是什么main

\n
git checkout xyzzy\ngit rebase main\n
Run Code Online (Sandbox Code Playgroud)\n

如果他们删除了一些提交,您可能需要git rebase --onto将这些提交排除在更新之外;请参阅其他 StackOverflow 问题以了解如何执行此操作。

\n

复制您的提交时可能会出现合并冲突,具体取决于他们更改了代码的程度。如果是这样,您必须解决它们。如果存在很多大冲突,我建议在开始变基操作之前,通过为旧的分支提示提交创建新的分支名称来保存原始提交集:

\n
git checkout xyzzy\ngit branch xyzzy.0\ngit rebase main\n
Run Code Online (Sandbox Code Playgroud)\n

完成变基后,您将拥有xyzzy.0(之前出现的原始提交)和xyzzy(新的和改进的提交副本)。如果在变基过程中出现问题,现在可以相对容易地返回并查看原始提交。

\n

无论哪种方式,您现在都可以使用:

\n
git push -f origin branch\n
Run Code Online (Sandbox Code Playgroud)\n

将新提交发送到您的 GitHub 分支并使您的 GitHub 分支 Git 存储库使用该名称branch来标识来自变基的新的和改进的提交。由您决定是否branch.0也在您的分叉上创建名称,以保留对原始提交的访问权限。

\n

  • 无价之宝。抱歉我只能投一次票。 (2认同)