将多个孤立分支组合成一个分支

del*_*boy 7 git

我有一个包含多个存储库的目录,它看起来像这样:

folder
|- repo1
|  |- .git
|  |- File1.txt
|- repo2
|  |- .git
|  |- File2.txt
|- repo3
|  |- .git
|  |- File3
Run Code Online (Sandbox Code Playgroud)

我想将它们组合成单个git存储库,我按照这些说明进行了操作.

在这些指令之后,我有以下结构:

folder
|- .git
|- repo1
|  |- File1.txt
|- repo2
|  |- File2.txt
|- repo3
|  |- File3
Run Code Online (Sandbox Code Playgroud)

这很棒.但是现在我有主分支(来自repo1)和历史上的两个孤儿分支:

* Merge repo3
|\
| * Add third file
* Merge repo2
|\ 
| * Add second file
* Add first file
Run Code Online (Sandbox Code Playgroud)

我想得到的是这样的

* Merge repo 3
* Add third file
* Merge repo 2
* Add second file
* Add first file
Run Code Online (Sandbox Code Playgroud)

甚至更好

* Add third file
* Add second file
* Add first file.
Run Code Online (Sandbox Code Playgroud)

这样的事情可能吗?如何?


有关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
Run Code Online (Sandbox Code Playgroud)

然后我做:

$ git branch -v
* master 888bb0d Merge repo3
$ git checkout -b branch2 eab1269be53929450c34c30416820c13a8058678
$ git checkout -b branch3 42333f8589e20d29e5e444d5e16ff1a5d63b8288
$ git checkout branch2
Switched to branch 'branch2'
$ git rebase master
First, rewinding head to replay your work on top of it...
Fast-forwarded branch2 to master.
$ git checkout master
Switched to branch 'master'
$ git merge branch2
Already up-to-date.
$ git checkout branch3
Switched to branch 'branch3'
$ git rebase master
First, rewinding head to replay your work on top of it...
Fast-forwarded branch3 to master.
$ git checkout master
Switched to branch 'master'
$ git merge branch3
Already up-to-date.
Run Code Online (Sandbox Code Playgroud)

之后:

$ 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
Run Code Online (Sandbox Code Playgroud)

Von*_*onC 12

您可以在当前master(来自repo1)之上重新设置两个孤立分支

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
Run Code Online (Sandbox Code Playgroud)

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

那两个孤儿分支已经合并成了master.
这就是为什么一个rebase只能将它们快进到master......因为它们已经合并到了master.
您可以放心地忽略eab126942333f:如果它们没有被标记或分支引用,它们将被垃圾收集.
例如,尝试克隆您的repo并查看这些提交是否仍然存在(如果是,请尝试git gc --aggressive --prune=now该克隆)


注意:git 2.9(2016年6月)将允许您合并孤立分支(仅使用选项提交d04aa7e--allow-unrelated-histories:

git merge --allow-unrelated-histories a b
Run Code Online (Sandbox Code Playgroud)