Git 将多个孤立分支合并为一个分支

Git 将多个孤立分支合并为一个分支,git,Git,我有一个包含多个存储库的目录,它如下所示: folder |- repo1 | |- .git | |- File1.txt |- repo2 | |- .git | |- File2.txt |- repo3 | |- .git | |- File3 我想将它们合并到一个git存储库中,我通过 按照指示 在这些说明之后,我有以下结构: folder |- .git |- repo1 | |- File1.txt |- repo2 | |- File2.txt |- repo3

我有一个包含多个存储库的目录,它如下所示:

folder
|- repo1
|  |- .git
|  |- File1.txt
|- repo2
|  |- .git
|  |- File2.txt
|- repo3
|  |- .git
|  |- File3
我想将它们合并到一个git存储库中,我通过 按照指示

在这些说明之后,我有以下结构:

folder
|- .git
|- repo1
|  |- File1.txt
|- repo2
|  |- File2.txt
|- repo3
|  |- File3
这很好。 但现在我有了历史上的主要分支(来自repo1)和两个孤立分支:

* Merge repo3
|\
| * Add third file
* Merge repo2
|\ 
| * Add second file
* Add first file
我想要的是这样的东西

* Merge repo 3
* Add third file
* Merge repo 2
* Add second file
* Add first file
甚至更好

* Add third file
* Add second file
* Add first file.
这样的事情可能吗?怎么做


有关VonC提供的答案的更多详细信息

我从以下几点开始:

$ git log --graph
*   commit 888bb0d7a81a40f8b42da7ad3f02103e898f5c1f
|\  Merge: cf85078 eab1269
| | Author: Bojan Delic <...>
| | Date:   Sun Oct 6 13:12:36 2013 +0200
| |
| |     Merge repo3
| |
| * commit eab1269be53929450c34c30416820c13a8058678
|   Author: Bojan Delic <...>
|   Date:   Sun Oct 6 13:07:39 2013 +0200
|
|       Add third file
|
*   commit cf85078ca96d52f2277ad7e4c6f45b04a38cf7ee
|\  Merge: 92fa311 42333f8
| | Author: Bojan Delic <...>
| | Date:   Sun Oct 6 13:12:33 2013 +0200
| |
| |     Merge repo2
| |
| * commit 42333f8589e20d29e5e444d5e16ff1a5d63b8288
|   Author: Bojan Delic <...>
|   Date:   Sun Oct 6 13:07:09 2013 +0200
|
|       Add second file
|
* commit 92fa3113507548a62407431188c308685f72865d
  Author: Bojan Delic <...>
  Date:   Sun Oct 6 13:06:39 2013 +0200

      Add first file
之后:

$ git log --graph
*   commit 888bb0d7a81a40f8b42da7ad3f02103e898f5c1f
|\  Merge: cf85078 eab1269
| | Author: Bojan Delic <...>
| | Date:   Sun Oct 6 13:12:36 2013 +0200
| |
| |     Merge repo3
| |
| * commit eab1269be53929450c34c30416820c13a8058678
|   Author: Bojan Delic <...>
|   Date:   Sun Oct 6 13:07:39 2013 +0200
|
|       Add third file
|
*   commit cf85078ca96d52f2277ad7e4c6f45b04a38cf7ee
|\  Merge: 92fa311 42333f8
| | Author: Bojan Delic <...>
| | Date:   Sun Oct 6 13:12:33 2013 +0200
| |
| |     Merge repo2
| |
| * commit 42333f8589e20d29e5e444d5e16ff1a5d63b8288
|   Author: Bojan Delic <...>
|   Date:   Sun Oct 6 13:07:09 2013 +0200
|
|       Add second file
|
* commit 92fa3113507548a62407431188c308685f72865d
  Author: Bojan Delic <...>
  Date:   Sun Oct 6 13:06:39 2013 +0200

      Add first file

$ git branch -a
  branch2
  branch3
* master
$git日志--图形
*提交888bb0d7a81a40f8b42da7ad3f02103e898f5c1f
|\合并:cf85078 eab1269
|作者:Bojan Delic
||日期:2013年10月6日星期日13:12:36+0200
| |
||合并报告3
| |
|*提交eab1269be53929450c34c30416820c13a8058678
|作者:Bojan Delic
|日期:星期日10月6日13:07:39 2013+0200
|
|添加第三个文件
|
*提交cf85078ca96d52f2277ad7e4c6f45b04a38cf7ee
|\合并:92FA31142333F8
|作者:Bojan Delic
||日期:2013年10月6日星期日13:12:33+0200
| |
||合并报告2
| |
|*提交42333F8589E20D29E544D5E16FF1A5D63B8288
|作者:Bojan Delic
|日期:2013年10月6日星期日13:07:09+0200
|
|添加第二个文件
|
*提交92fa3113507548a62407431188c308685f72865d
作者:Bojan Delic
日期:星期日10月6日13:06:39 2013+0200
添加第一个文件
$git分行-a
分支2
分支3
*主人

您可以在当前的
主机上重新设置两个孤立分支的基础(从
repo1


但是,在你的情况下(在问题中编辑后),有。。。无事可做:

这两个孤立分支已合并到
master

这就是为什么rebase只会将它们快速转发到
master
。。。因为它们已经合并到
master

您可以安全地忽略
eab1269
42333f
:如果它们没有被标记或分支引用,它们将被垃圾收集。
例如,尝试克隆您的repo并查看这些提交是否仍然存在(如果是,请在该克隆上尝试
git-gc--aggressive--prune=now


注意:git 2.9(2016年6月)将允许您合并孤立分支(仅使用
--允许不相关的历史记录
选项:

git merge --allow-unrelated-histories a b

也许我不明白,但是没有branch2,只有
master
HEAD
,它们指向commit
Merge repo3
。如果我添加指向commit
add third file
的分支,并按照您的建议进行重基和合并,新分支将移动到
Merge repo3
commit,但孤立分支仍然存在ns。@del boy你说有两个孤立分支。所以我把它们称为“
branch2
”和“
branch3
”。git branch-v
返回什么?是的,我很遗憾有两个孤立分支,因为我发现了这个术语,但除了master之外,没有真正的git分支指向任何地方,指向头部。
gitbranch-v
仅返回
*master 888bb0d Merge repo3
@del boy然后您可以从找到的两个悬垂分支中的SHA1轻松创建这些分支。
git checkout-b branch2 SHA1
@del boy分支是分支(分离、孤立或处于任何其他状态):它有一个头。孤立分支只是一个分支,其第一次提交没有任何父级(不是来自另一个分支),如中所述。如果使用术语“分支”,则表示您知道该分支的头SHA1。
git checkout branch2
git rebase master
git checkout master
git merge branch2 # fast-forward master to branch2

git checkout branch3
git rebase master
git checkout master
git merge branch3 # fast-forward master to branch3
git merge --allow-unrelated-histories a b