user264304 Asked:2020-08-21 21:42:21 +0000 UTC2020-08-21 21:42:21 +0000 UTC 2020-08-21 21:42:21 +0000 UTC 如何使另一个存储库成为当前存储库的分支? 772 如何使另一个存储库成为当前存储库的分支? git 3 个回答 Voted Best Answer user181100 2020-08-22T04:56:55Z2020-08-22T04:56:55Z 首先,您需要在某个地方同时从两个存储库中提取提交,因为您希望获得两个历史记录的组合。按照您的图纸,我们将使用数字提交在存储库中工作,并将第二个连接到它: 在名称下添加一个带有提交字母的存储库作为“远程源”(remote)letters(您自己可以选择其他内容,没关系): git remote add letters путь/к/другому/репозиторию 从那里拖动提交/分支/标签/任何东西: git fetch letters 从第二个存储库的分支base开始创建并更改为新分支:master git checkout -b base letters/master # Ветки ж master в обеих? master 打开当前仓库的分支历史,找到你想要分支的提交: git log master 假设它的哈希以abcdef. 这些都是准备工作。现在咒语: git rebase --root --onto abcdef 重新链接提交 ( rebase)... ...从电流到基准 ( --root)... ...到带有哈希abcdef( --onto abcdef) 的提交。 结果,我们有: [1 ]---[2 ]---[3 ]---[4 ]---[5 ] (master) \ \ \[А']---[Б']---[В']---[Г'] (base) 一切都和图片一样。除了...文字提交哈希。改变它们的分支也会改变它们的哈希值。这就是为什么它们用破折号标记的原因,因为这些不是 100% 的原始提交。除了祖先(如果您没有遇到冲突),他们将拥有相同的一切。 PS:我绝对不明白为什么这两个故事需要在基础上联系起来,尽管你可能知道得更好。Git 可以在同一个存储库中处理不相关的分支。 当对 github 上关闭的仓库数量进行计费时,有些人通过在一个仓库中收集多个项目的分支来节省资金。它奏效了。对于那些同时需要多个项目的人,在新的 Git(2.5+?)的帮助下,可以使用git worktree add. 就这样。 0andriy 2020-08-23T03:01:25Z2020-08-23T03:01:25Z (我从评论中删除) 正如尼克沃林金正确指出的那样,在您的版本中,没有解决方案。您需要选择a)一个公共基础,然后A-G的更改将分别转到A'-G',或者b)保存更改,然后分支将按照您自己“从上方”注意到的方式连接。 我选择选项b)作为优先事项,原因如下: 变化保持不变; 您可以继续开发旧项目并在必要时“注入”新项目; rebase,因此为简洁起见,我们将调用选项a),对于已发布的存储库来说通常是不好的做法(这里该术语的严重性取决于您)。 现在说到重点。选项b)或merge在三个命令中完成: git checkout -b <имя новой ветки> <хеш комита №2> git fetch <URL репозитория №2> <имя ветки в репозитории №2> git merge --allow-unrelated-histories FETCH_HEAD 在执行之前,您需要确保您位于存储库 #1 的正确分支中。 第三行有一个特殊的选项来避免错误:fatal: refusing to merge unrelated histories ,这里有更详细的描述。 如果在第三阶段发生冲突,则必须以您认为合适的方式自行解决。 结果将是<имя новой ветки>存储库 #1 中的一个分支。 aleksandr barakin 2020-08-22T00:23:07Z2020-08-22T00:23:07Z 当然,有很多解决方案。例如,您可以使用format-patch命令及其对am。 例子。 在目录中,0我们有一个具有以下历史记录的存储库: $ git log --one-line a3d5387 5 2b7f19f 4 e1d8018 3 3e1fa25 2 7e8bd8d 1 并在目录中1- 用这个: $ git log --one-line 5ea5e2c d d42991a c f980223 b cff9df9 a 我们希望a b c d来自第二个存储库的提交“附加”到2来自第一个存储库的提交。 首先,您需要将所有提交作为补丁文件获取: $ cd /путь/к/хранилищу/1 $ git format-patch --stdout --root cff9df9 > patch $ git format-patch --stdout cff9df9..HEAD >> patch 需要两个命令patch才能将“root”提交到文件中a 其次,使用am存储库中的命令应用它们0,在那里创建一个新分支后,从提交分支2: $ cd /путь/к/хранилищу/0 $ git checkout -b new 3e1fa25 $ git am /путь/к/хранилищу/1/patch Applying: a Applying: b Applying: c Applying: d 如果没有冲突,存储0将如下所示: $ git log --oneline --all --decorate --graph * 20b6b2f (HEAD -> new) d * 8dedddf c * 6ddec5e b * cb7a798 a | * a3d5387 (master) 5 | * 2b7f19f 4 | * e1d8018 3 |/ * 3e1fa25 2 * 7e8bd8d 1 当然,对于“附加”提交,哈希和已经变得不同,但其他一切——内容、日期、作者——都已经到位。
首先,您需要在某个地方同时从两个存储库中提取提交,因为您希望获得两个历史记录的组合。按照您的图纸,我们将使用数字提交在存储库中工作,并将第二个连接到它:
在名称下添加一个带有提交字母的存储库作为“远程源”(remote)
letters(您自己可以选择其他内容,没关系):从那里拖动提交/分支/标签/任何东西:
从第二个存储库的分支
base开始创建并更改为新分支:mastermaster打开当前仓库的分支历史,找到你想要分支的提交:假设它的哈希以
abcdef.这些都是准备工作。现在咒语:
rebase)...--root)...abcdef(--onto abcdef) 的提交。结果,我们有:
一切都和图片一样。除了...文字提交哈希。改变它们的分支也会改变它们的哈希值。这就是为什么它们用破折号标记的原因,因为这些不是 100% 的原始提交。除了祖先(如果您没有遇到冲突),他们将拥有相同的一切。
PS:我绝对不明白为什么这两个故事需要在基础上联系起来,尽管你可能知道得更好。Git 可以在同一个存储库中处理不相关的分支。
当对 github 上关闭的仓库数量进行计费时,有些人通过在一个仓库中收集多个项目的分支来节省资金。它奏效了。对于那些同时需要多个项目的人,在新的 Git(2.5+?)的帮助下,可以使用
git worktree add. 就这样。(我从评论中删除)
正如尼克沃林金正确指出的那样,在您的版本中,没有解决方案。您需要选择a)一个公共基础,然后A-G的更改将分别转到A'-G',或者b)保存更改,然后分支将按照您自己“从上方”注意到的方式连接。
我选择选项b)作为优先事项,原因如下:
rebase,因此为简洁起见,我们将调用选项a),对于已发布的存储库来说通常是不好的做法(这里该术语的严重性取决于您)。现在说到重点。选项b)或
merge在三个命令中完成:在执行之前,您需要确保您位于存储库 #1 的正确分支中。
第三行有一个特殊的选项来避免错误:fatal: refusing to merge unrelated histories ,这里有更详细的描述。
如果在第三阶段发生冲突,则必须以您认为合适的方式自行解决。
结果将是
<имя новой ветки>存储库 #1 中的一个分支。当然,有很多解决方案。例如,您可以使用format-patch命令及其对am。
例子。
在目录中,
0我们有一个具有以下历史记录的存储库:并在目录中
1- 用这个:我们希望
a b c d来自第二个存储库的提交“附加”到2来自第一个存储库的提交。首先,您需要将所有提交作为补丁文件获取:
需要两个命令
patch才能将“root”提交到文件中a其次,使用
am存储库中的命令应用它们0,在那里创建一个新分支后,从提交分支2:如果没有冲突,存储
0将如下所示:当然,对于“附加”提交,哈希和已经变得不同,但其他一切——内容、日期、作者——都已经到位。