如何将开发分支引入从功能分支克隆的远程仓库?

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>

这不会创建一个分支,这将在您的活动分支上获取文件,在一个新目录中,这个目录与存储库中的分支名称

您需要取消对存储库的单一分支化。你有两条明显的路要走。一种选择是撤消单个分支方面:请参阅 How do I "undo" a --single-branch clone? (for which this would be a duplicate of that question). The other requires that you read the git remote documentation,特别注意 set-branches 子命令及其 --add 子选项。

完成此操作后,运行 git fetch,然后 git checkout <em>branch-name</em>git 切换 <em>branch-name</em>。 Git 将创建新分支。或者,使用 remote-tracking name origin/<em>branch-name</em>。有关远程跟踪名称的更多信息,请参见下文。

背景(可选阅读,但一个好主意)

重要的是要意识到你这里的基本假设是微妙的错误:

my remote repository ... was cloned off a feature branch [and] I'm unable to clone [dev] into my existing local repository

这里嵌入的错误假设是 git clone 命令不会克隆 分支 。 Git的git clone命令是一种方便的命令,shorthand用于运行宁六个其他命令。这六个其他命令中的五个是 Git 命令。为了便于说明,这里有六个命令,它们的顺序是 运行:

  1. mkdir(或您的 OS 的等效项):创建一个新的空目录或文件夹(您喜欢哪个术语)。其余命令在这个新目录中 运行,尽管一旦 git clone 完成,您也必须自己移动到这个新文件夹中。 (有一种模式会跳过此命令,当您告诉 git clone 它应该使用一个现有的空目录时。)

  2. git init:这会创建一个新的空存储库,没有提交。没有提交的仓库不能有任何分支,所以它也没有分支。

  3. git remote add origin <em>url</em>: 这个加了什么Git 调用 remote 到空存储库。遥控器只是一个简称——这里是 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 选项必须位于命令行参数中的正确位置:一些 -c 选项由 git 前端而不是 clone 命令处理。)如果您没有使用此类选项,git clone 在此步骤中不会执行任何操作,因为无事可做。

  5. git fetch origin(或通过 -o 提供的其他名称):这从另一个 Git 获得 commits,响应您提供的 URL 的那个。 这不会在您的存储库中创建任何分支名称。此时您的新存储库仍然没有分支

  6. git checkout:这 在您的新存储库中创建一个分支 。它创建的分支是您使用 -b 选项提供的分支。如果您没有提供 -b 选项,它会创建名称由另一个 Git.

    推荐的分支

    如果您使用 -n--no-checkout 选项,git clone 将跳过此步骤。

因此,无论您是否使用 --single-branchgit clone 的第 6 步都会创建 只有一个 分支。您在这个新存储库中只有一个分支!普通克隆从源存储库复制所有提交,以及分支的none,然后Git创建一个分支作为最后一步。

--single-branch所做的只是一件事,但有多种作用。这是因为 git fetch 的工作方式。在第 5 步,当 git fetch 运行s 时,fetch 命令连接到另一个 Git 及其存储库。另一个 Git 列出 all 其分支名称和其他名称。1 您的 Git 可以选择注意 所有 这些名称,或只是其中的几个(例如,只有一个分支名称)。这些名称中的每一个还列出了一个原始提交哈希 ID,Git 需要的是这些 哈希 ID——而不是名称!它们是 Git 查找提交和其他重要对象的方式,也是您的存储库克隆其他存储库的方式。

无论如何,在获得适当的提交和其他对象后,您的 Git 现在采用他们的 Git 的 分支 名称——他们列出来让您 Git 找到 提交 — 并 更改它们 。您的 Git 将它们(或它们的某些选定子集,例如它们中的一个)存储在您自己的存储库中,作为 远程跟踪名称

--single-branch 选项告诉您的 Git 留下指示 fetch 仅创建或更新对应于他们 [=280 中的一个分支名称的一个远程跟踪名称=].当然,默认设置是每次都为另一个 Git 列出的每个分支创建或更新远程跟踪名称。如果您使用 git remote 添加更多它们的分支名称,则每个 git fetch 将创建或更新这些名称中的每一个,前提是另一个 Git 在每次提取时列出它们。因此,通过取消单一分支或添加更多名称,您可以获得自己的 Git 以创建更多远程跟踪名称。


1这里的数据可能非常大——以兆字节为单位——在一些有数万个分支和标签名称的存储库中,因此有一种方法可以限制它采用最新的 Git 通信协议。较旧的 Gits 总是得到所有东西,默认情况下,对于非单分支 Git,是得到所有东西,所以它仍然可以正常工作,但这确实意味着如果你的机器和您的服务器有较新的 Git 版本,单分支模式在今天的某些特殊情况下非常有用。


分支名称和远程跟踪名称

一个分店名是你自己起的名字,应该对你有一定的意义。这只是存储一 (1) 次提交的哈希 ID。根据定义,这一提交是 分支上的最新提交 。这允许 Git 找到该提交,并且 Git 中的提交允许 Git 在 Git 中找到更多提交。通过找到 last 一个,Git 可以找到该分支的所有提交。

(这​​意味着 branch 这个词有歧义:它指的是 name,例如 dev 还是main 或其他什么?或者它指的是 由最新提交结束的提交集合? 答案是一个,两个,或都不是,取决于谁说的和什么他们说的时候是认真的。另见 What exactly do we mean by "branch"?)

远程跟踪名称由远程名称—origin—加一个斜杠,后跟原始分支名称组成。2这些名称,就像分支名称一样,允许 Git 到 find 提交。但它们实际上并不是 branch 名称。您可以分辨出不同之处,因为:

git checkout somebranch

告诉你你现在“在”树枝上,git branchgit status 告诉你你现在 on branch somebranch(使用 git status).但是:

git checkout origin/somebranch

告诉你现在处于 Git 所谓的 detached HEAD 模式,而 git branchgit status 表明你不是在 any 分支上更长。 (此模式适合 查看 提交,但留下来做新工作不是个好主意。要退出此模式,请 运行 git checkout 使用您的分支机构之一的名称,如 git branch 的输出所示。)

当您要求 Git 切换到名为 B 的分支时,Git 首先检查您是否 一个名为B的分支。如果你这样做,Git 切换到它。3 但如果不是,就在说“我不能切换到那个因为它不存在”之前,结帐或switch 命令(无论您使用哪个命令)都会查看是否有一些明显的 origin/<em>B</em> 可用于 createB。如果是这样,Git 命令将使用 origin/<em> <em>create</em> <em><code>B B,4 然后切换到它。这实际上就是 git clone 的第 6 步的工作原理。


2从技术上讲,这些远程跟踪名称位于单独的 namespace 中。远程跟踪名称的完整拼写以 refs/remotes/ 开头,而 分支 名称的完整拼写以 refs/heads/ 开头。 Git 通常会去掉 refs/remotes/refs/heads/ 部分。奇怪的是,在 git branch -a 下列出的远程跟踪名称只有 refs/ 被剥离。

3这假定所述切换是可能的。如果您处于“干净”状态,即没有修改任何内容,则有可能。即使不是,有时也是可能的。另见 Checkout another branch when there are uncommitted changes on the current branch

4事实上,任何远程跟踪名称,即使它以 origin/ 以外的其他名称开头,都可以在这里使用。 “使用”部分意味着您的新分支是使用存储在您自己的存储库的远程跟踪名称中的相同的提交哈希 ID 创建的。