簡體   English   中英

由於主/主更改,如何更新我的 GitHub 鏡像?

[英]How do I update my GitHub mirror due to the master/main change?

幾年前我鏡像了一個 GitHub 項目。 本項目參與了“master”到“main”分支的大改名。 我已經有一段時間沒有碰我的叉子了,我的叉子里有一個分支,還有一個我的叉子的本地副本。 但是當源項目使用“master”時,我的 fork 和特殊分支是基於 off 的! 如何將我的 fork 轉換為使用“main”,包括同步到源的“main”?

分支名稱在 Git 中沒有實際意義,可以隨時更改。 所以一些工作,雖然這只是簡單的部分,只是輸入你自己的克隆並將它們的master重命名為main

包括同步到源的“主要”?

我們將把它留到最后。

術語說明

GitHub 上的“分叉”本質上是具有一些額外功能的克隆。 從這里開始,我將使用術語“fork”來指代 GitHub 克隆,使用術語“克隆”或“您的克隆”來指代本地克隆。

假設您還沒有克隆的說明

(這些說明適用於其他人:您提到您已經有一個本地克隆。)

GitHub 不提供直接重命名分支的方法,所以如果你想在你的 fork 中重命名一個分支,你必須首先將它克隆到你自己的本地機器上:

git clone --no-checkout <url>

(其中urlssh://git@github.com/name/repo.gitgit@github.com:name/repo.githttps://github.com/name/repo.git之一) 在您自己的機器上進行本地克隆。 你需要為那台機器安裝 Git。 注意:我們正在使用--no-checkout以便您的新克隆還沒有分支。 你有所有的提交沒有分支

輸入您剛剛制作的克隆:

cd repo

例如。 您的克隆將有一個遠程跟蹤名稱origin/master ,您可以使用它在您的 GitHub 克隆中創建一個新名稱:

git push origin origin/master:main

您的 GitHub fork 現在對於同一個提交有兩個不同的名稱: mastermain 您現在可以通過 Web 界面或命令行刪除 GitHub fork 的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 ,這完成了除了刪除 fork 中的名稱master之外的所有事情(參見上面的腳注 1),因此我們通過一個單獨的步驟來完成。

現在,您可能想要使用 GitHub 的 Web 界面來更改分支中的主分支名稱

我不確定 GitHub 是否有任何智能功能可以在您刪除名稱master時自動執行此操作。 我的猜測是他們沒有。 (我還沒有用我的任何叉子嘗試過。) 這個網頁也暗示他們沒有。 您需要進入設置頁面並選擇main作為默認分支。

一旦你這樣做了,使用git remote set-head來更新你的本地克隆並不是一個壞主意:

git remote set-head origin --auto

這將使您的origin/HEAD反映新的origin/main設置。

(所有這些都是可選的,它們只會使一些非致命但奇怪的錯誤情況消失。)

更新你的叉子

現在是更新你自己的 fork 的時候了。 這是困難的部分,因為:

好久沒碰我的叉子了,我的叉子里有一根樹枝……

您必須在此處准確決定要更新的內容以及方式。 要記住的關鍵是 Git不關心分支名稱 它只關心commits 使用git log --graph或某些 commit-graph-viewer 來查看提交及其相互之間的關系。

您需要為您的 fork 上游的 fork 命名 - 您在創建 GitHub fork 時使用的 GitHub 克隆。 這個的標准名稱是upstream (我覺得這個名字有點混亂,因為每個分支也可以有一個上游集,談論分支 X 的上游設置以及談論名為上游的遠程上的內容有點奇怪,但讓我們運行它目前。)

您可能已經為此有了一個名稱。 使用git remotegit remote -v查看您現有的遠程名稱。 假設您只有origin並且要添加upstream ,請使用git remote add創建upstream

git remote add upstream <url>

其中url是他們 fork 的 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 操作之前,通過為舊的分支提示提交創建一個新的分支名稱來保存原始提交集:

git checkout xyzzy
git branch xyzzy.0
git rebase main

完成 rebase 后,您將擁有xyzzy.0 (您之前出現的原始提交)和xyzzy (您的新的和改進的提交副本)。 如果在 rebase 期間出現問題,現在返回並查看原始提交相對容易。

無論哪種方式,您現在都可以使用:

git push -f origin branch

將新提交發送到您的 GitHub fork 並使您的 GitHub fork Git 存儲庫使用名稱branch來識別來自 rebase 的新的和改進的提交。 是否branch.0您的 fork 上創建名稱branch.0由您決定,以保持對原始提交的訪問。

如果源仍然相同,您可以重命名本地分支以繼續使用 Github 上的版本。

  1. 確保你在master分支

git checkout master

  1. 重命名分支

git branch -m main

然后,你就可以用繼續工作,像以前一樣,但與main分支而非master

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM