簡體   English   中英

Git 在原項目中添加一個fork的分支

[英]Git add a branch of a fork to the original project

我不知道是否有可能做這樣的事情。

我會用一個例子來解釋我的意思。

例如,我在 github 上有一個存儲庫。

一個用戶進來並 fork 我的存儲庫,創建一個新分支,然后進行更改。

我想在本地執行此操作,因此在我的電腦上,在與帶有我的分支的原始存儲庫相同的存儲庫中,添加用戶的分支,而無需克隆存儲庫。

有沒有辦法添加/下載該分支並將其添加到我的存儲庫中,以便我可以嘗試一下?

有沒有辦法添加/下載該分支並將其添加到我的存儲庫中,以便我可以嘗試一下?

當然,首先,將 遠程添加到指向 fork 的本地存儲庫。 例如,如果您的存儲庫被命名為example並且我已經分叉了它,您將運行:

git remote add larsks https://github.com/larsks/example

該命令創建了一個名為larsks的遠程,指向我的 fork(您可以為遠程命名任何您想要的名稱,但我通常使用 github 用戶名)。 現在,更新該遠程的本地緩存:

git remote update

現在您可以看到該分支中的分支並在本地檢查它們。 要訪問我的main分支,您將運行:

git checkout larsks/main

或者訪問我的feature1分支:

git checkout larsks/feature1

等等注意,上面的命令會讓你進入一個“分離的頭”state; 要查看基於其中一個分支的本地分支,您可能會運行以下命令:

git checkout -b feature1 larsks/feature1

TL;博士

  • 運行git remote add
  • 運行git fetch
  • 利潤!

底線是您需要復制他們的提交 您不需要復制他們的“分支”,除非“分支”一詞的意思是“有問題的提交集”。

...無需克隆存儲庫

復制提交的行為“克隆”。 或者是嗎? 這個詞的定義並不那么明確:當我們克隆一個存儲庫時,我們復制了它的所有提交——或者至少,我們想要復制的所有提交:那些我們關心並且對我們來說是新的提交。

另一方面, git clone命令意味着:

  • 創建一個新的空存儲庫;
  • 添加一個遠程(一個短名稱,我們將通過它聯系其他一些 Git 存儲庫,將來可能會重復);
  • 復制他們的提交;
  • 創建一個初始分支名稱,因為沒有分支名稱的工作並不有趣。

(Git 實際上根本不需要任何分支名稱,但請參閱“不好玩”。)因此您不想運行git clone ,因為您不希望此處的第 1 步:您想使用現有的存儲庫。 但是您確實需要第 2 步和第 3 步,然后您可能需要也可能不需要最后一步的變化。

幸運的是,我們有:

  • git remote add : this is how we add a remote to a repository, and in fact, git clone essentially uses git remote add to set up origin so that you can run git fetch origin ;
  • git fetch remote :這是我們復制一些其他存儲庫的提交的方式,或者至少是那些我們覺得有趣並且對我們來說是新的提交。

git pull命令,如果你使用它——我建議避免使用它,特別是如果你是 Git 新手——包括運行git fetch ,然后運行第二個 Z0BCC70105AD279503E31FE7B3F47-B665 提交命令。 將其拆分為兩個單獨的命令,以便您學習和理解這兩個步驟中的每一個,從而獲利(參見 TL;DR 部分)。

git fetch命令調用一個特定的遠程,使用在git remote add期間保存的 URL 。 你的 Git 軟件和他們的 Git 軟件——“他們”是在那個 URL 上回答的人——相反,以確定你有哪些提交以及他們有哪些提交。 然后您的 Git 軟件下載提交。 當我們運行git clone時,所有的提交對我們來說都是新的,所以我們得到了它們,但是當我們運行git fetch時,我們得到一個更有限的集合,它運行得更快。

一旦您擁有多個遙控器,事情就會變得比只有一個時要復雜一些。 git fetch命令需要知道使用哪個遙控器 如果你在沒有任何 arguments 的情況下運行它,它會猜測。 如果一切都失敗了,它只是猜測origin ,這是遠程的標准名字。

運行git remote update告訴您的 Git 軟件運行git fetch所有遠程。 更准確地說,它從一組定義的遙控器或一組中獲取,但這里的默認值是“全部”。 您可以對git fetch --all :這里的--all表示所有遙控器

至於分支名稱:Git 使用這些來幫助您(和 Git)找到自己的提交。 當您從其他存儲庫獲取時,Git 在您自己的存儲庫中創建或更新名稱,我稱之為遠程跟蹤名稱 這些不是分支名稱——盡管 Git 稱它們為遠程跟蹤分支名稱,但它們的工作方式與分支名稱的工作方式不同。 但是,如果您要進行自己的任何新提交,您將需要一個。

當你運行時,例如:

git checkout foobranch    # or git switch foobranch

並且在的分支集中沒有名為foobranch的分支,您自己的 Git 軟件會——如果你在此處添加--no-guess會抱怨沒有foobranch ,然后失敗。 但是,如果您讓 Git 使用--guess (這是默認設置),您的 Git 將掃描您的遠程跟蹤名稱,以查找origin/foobranch以及 - 如果有remote2 - remote2/foobranch等等。 如果它恰好找到一個匹配項,它將“猜測”您的意思是使用遠程跟蹤名稱找到的提交創建一個名稱為foobranch的新分支

一旦你有兩個遙控器,這種猜測模式就會停止工作。 請注意這一點。

暫無
暫無

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

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