簡體   English   中英

如何將開發分支帶入從功能分支克隆的遠程倉庫?

[英]How to bring dev branch into remote repo that was cloned off a feature branch?

我在遠程存儲庫中創建了一個新分支,該分支使用以下功能從功能分支中克隆出來:

git clone <url> --branch <feature-branch-name> --single-branch <repo-name>

我現在需要合並來自我的dev分支的最新更改,但是我無法將它克隆到我現有的本地存儲庫中,並且當我執行git branch時我無法看到它。

關於我將如何做到這一點的任何想法?

我嘗試使用標准方式和使用--branch dev --single-branch方法定期克隆到現有目錄,但沒有運氣。

更新,找到了這個簡單的替代方案

創建一個新的原點

git remote add *NewOriginName* *repositoryURL*

然后創建一個新的孤立分支

git checkout --orphan *myNewBranch*

這個新分支將沒有提交,但是你開始使用的分支中的所有文件,所以你可能想要刪除這個新分支上的所有文件,然后

git pull *NewOriginName* *branchOfInterestOnRepo* --allow-unrelated-histories

就是這樣,您可能需要一個新的提交,具體取決於您留在新孤兒分支上的文件


這聽起來像一個子模塊

https://git-scm.com/book/en/v2/Git-Tools-Submodules

但是如果你不想保留以前的提交,你可以從你需要的提交中下載文件

如果您更喜歡使用控制台,方式將是

git clone -b <branchname> --single-branch <remote-repo-url>

這不會創建分支,這將獲取活動分支上的文件,在一個新目錄中,該目錄具有存儲庫中分支的名稱

您將希望取消單分支化您的存儲庫。 你有兩條明顯的路徑到 go 到這里。 一種選擇是撤消單分支方面:請參閱如何“撤消”--single-branch 克隆? (這將是該問題的重復)。 另一個要求您閱讀git remote文檔,特別注意帶有--add子選項的set-branches子命令。

完成此操作后,運行git fetch ,然后運行git checkout branch-namegit switch branch-name Git 將創建新分支。 或者,使用遠程跟蹤名稱origin/ branch-name 有關遠程跟蹤名稱的更多信息,請參見下文。

背景(可選閱讀,但一個好主意)

重要的是要意識到您在這里的基本假設是微妙的錯誤:

我的遠程存儲庫...已從功能分支克隆 [並且] 我無法將 [ dev ] 克隆到我現有的本地存儲庫中

這里嵌入的錯誤假設是git clone命令不會克隆分支 Git 的git clone命令是一種方便的命令,是運行其他六個命令的簡寫。 這六個其他命令中有五個是 Git 命令。 為了說明,這里有六個命令,按照它們運行的順序:

  1. mkdir (或您的操作系統的等效項):創建一個新的空目錄或文件夾(無論您喜歡哪個術語)。 其余命令在這個新目錄中運行,盡管git clone完成后,您還必須自己移動到這個新文件夾中。 (當您告訴git clone它應該使用現有的空目錄時,會跳過此命令的一種模式。)

  2. git init :這將創建一個新的空存儲庫,沒有提交。 沒有提交的存儲庫不能有任何分支,因此它也沒有分支。

  3. git remote add origin url :這會將 Git 調用的遠程添加到空存儲庫。 遙控器只是一個簡短的名稱——這里是origin ——它可以容納一些東西。 它擁有的主要內容是 URL,但它還擁有未來git fetch命令的指令。

    git remote add子命令可以采用-t選項來指定感興趣的特定分支名稱。 git clone--single-branch選項添加了這個-t選項。 git remote add子命令也可以使用除origin以外的名稱。在git clone中使用-o可以做到這一點,但我們假設您沒有使用-o因此使用名稱origin 。)

  4. git clone-c選項暗示的任何其他git config命令。 (這些-c選項必須在命令行 arguments 中的正確位置:一些-c選項由git前端而不是clone命令處理。)如果您沒有使用這些選項, git clone期間不會執行任何操作一步,因為沒有什么可做的。

  5. git fetch origin (或通過-o提供的其他名稱):這從另一個 Git 獲得提交,該 Git 響應您提供的 URL。 這不會在您的存儲庫中創建任何分支名稱。 此時,您的新存儲庫中仍然沒有分支

  6. git checkout :這會在您的新存儲庫中創建一個分支 它創建的分支是您使用-b選項提供的分支。 如果您沒有提供-b選項,它將創建名稱由其他 Git 推薦的分支。

    如果您使用-n--no-checkout選項, git clone跳過此步驟。

因此,無論您是否使用--single-branchgit clone的第 6 步只會創建一個分支。 您在這個新存儲庫中只有一個分支! 一個正常的克隆從源存儲庫復制所有提交,並且沒有任何分支,然后 Git 創建一個分支作為最后一步。

--single-branch所做的只是一件事,但有幾個效果。 這是因為git fetch的工作方式。 在第 5 步,當git fetch運行時,fetch 命令連接到另一個 Git 及其存儲庫。 另一個 Git 列出了它的所有分支名稱和其他名稱。 1您的 Git 可以選擇注意所有這些名稱,或者只注意其中的一些名稱(例如,僅一個分支名稱)。 Each of these names also lists a raw commit hash ID, and it's these hash IDs —not the names.—that Git needs, They are how Git finds commits, and other important objects. 它們是您的存儲庫克隆另一個存儲庫的方式。

在任何情況下,在獲得適當的提交和其他對象后,您的 Git 現在會采用他們的 Git分支名稱——他們列出的那些讓你的 Git找到提交——並更改它們 您的 Git 將它們或它們的某些選定子集(例如其中一個)存儲在您自己的存儲庫中作為遠程跟蹤名稱

--single-branch選項告訴您的fetch留下指令以僅創建或更新與 Git 中的一個分支名稱對應的一個遠程跟蹤名稱。 當然,默認設置是每次都為另一個 Git 列出的每個分支創建或更新一個遠程跟蹤名稱。 如果您使用git remote添加更多分支名稱,則每個git fetch將創建或更新每個名稱,前提是其他 Git 在每個提取中列出它們。 因此,通過撤消單分支或添加更多名稱,您可以獲得自己的 Git 以創建更多遠程跟蹤名稱。


1此處的數據在具有數萬個分支和標簽名稱的某些存儲庫中可能非常大(大約為兆字節),因此在最新的 Git 通信協議中可以限制它。 較舊的 Gits 總是得到所有東西,對於非單分支 Git,默認值是得到所有東西,所以它仍然可以正常工作,但這確實意味着如果你的機器和服務器都有更新的 Git 版本,單分支模式在今天的某些特殊情況下非常有用。


分支名稱和遠程跟蹤名稱

分支名稱是您自己編寫的名稱,對您應該有一些意義。 這只是存儲一 (1) 個提交的 hash ID。 根據定義,這一次提交是分支上的最新提交 這允許 Git 找到該提交,並且在 Git 中的提交允許 Git 在 Z0BCC70105AD277B663 中找到更多提交通過找到最后一個,Git 可以找到 go 與該分支的所有提交。

(這意味着分支這個詞是模棱兩可的:它是指名稱,例如devmain還是其他什么?還是指以最新的提交結尾的提交集合?答案是一個,兩者,或兩者都不是,取決於誰說的以及他們說這句話時的意思。另請參閱我們所說的“分支”到底是什么意思?

遠程跟蹤名稱由遠程名稱 - origin - 加上一個斜線,后跟原始分支名稱組成。 2這些名稱與分支名稱一樣,允許 Git查找提交。 但它們實際上並不是分支名稱。 您可以區分,因為:

git checkout somebranch

告訴您您現在“在”分支上,並且git branchgit status告訴您您現在on branch somebranch (使用git status的確切短語)。 但:

git checkout origin/somebranch

告訴您您現在處於 Git 所謂的分離 HEAD模式,並且git branchgit status表明您不再在任何分支上。 (此模式適用於查看提交,但不適合繼續進行新工作。要退出此模式,請使用您的一個分支的名稱運行git checkout ,如git branch的 Z78E6221F6393D136566 所示。)

當您要求 Git 切換到名為B的分支時,Git 首先檢查您是否一個名為B的分支。 如果你這樣做了,Git 會切換到它。 3但如果不是,就在說“我不能切換到那個,因為它不存在”之前,checkout 或 switch 命令(無論你使用哪個)都會查看是否有一些明顯的origin/ B可以用來創建B 如果是這樣, Git 命令將使用origin/ B創建B4然后切換到它。 這實際上是git clone的第 6 步的工作原理。


2從技術上講,這些遠程跟蹤名稱位於單獨的命名空間中。 遠程跟蹤名稱的完整拼寫以refs/remotes/開頭,而分支名稱的完整拼寫以refs/heads/開頭。 Git 通常會剝離refs/remotes/refs/heads/部分。 奇怪的是,在git branch -a下,遠程跟蹤名稱僅列出了refs/剝離。

3這假設所述切換是可能的。 如果您處於“干凈”的 state 中,即沒有修改任何內容,則有可能。 即使沒有,有時也是可能的。 另請參閱當當前分支上有未提交的更改時簽出另一個分支

4事實上,任何遠程跟蹤名稱,即使它以origin/以外的其他名稱開頭,都可以在這里使用。 “使用”部分意味着您的新分支是使用存儲在您自己的存儲庫的遠程跟蹤名稱中的相同提交 hash ID創建的。

暫無
暫無

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

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