如何在新分支上将git存储库导入另一个存储库

时间:2015-03-13 08:01:34

标签: git

我已经在SO上阅读了多个类似的问题,但我找不到一个与我的问题足够接近的问题。

我有两个基于相同初始代码A的脱机存储库。这些存储库已经自行发展:

存储库foo位于/home/foo/git/

        o--o--o A2
       /
A--o--o--o master 
    \
     o A1

存储库bar位于/home/bar/git/

        o--------o--o A2
       /          \
A--o--o--o master  o--o--o A3
    \
     o--o--o A1

我们的想法是将bar的所有foo导入到名为B的新分支bar上的foo

在工作之后,它应该在 o--o--o A2 / A--o--o--o master \ \ o--o--o B2 \ o A1 / \ B--o--o B4 o--o--o B3 \ o--o--o B1

上看起来像这样
foo

这样做的简单方法是什么?

实施例

首先,我们要像上面一样创建bar#!/usr/bin/env bash DUMMY=dummy commit () { openssl rand -hex 3 >> $DUMMY git commit -m "$1" . } # Create foo mkdir foo && cd $_ && git init touch dummy && git add $DUMMY git commit -m "0" . git branch A commit 1 git checkout -b A1 commit 2 git checkout master commit 3 commit 4 git checkout head~1 -b A2 commit 5 commit 6 commit 7 # Create bar cd .. mkdir bar && cd $_ && git init touch dummy && git add $DUMMY git commit -m "0" . git branch A commit 1 git checkout -b A1 commit 2 && commit 3 commit 4 git checkout master commit 5 && commit 6 git checkout head~1 -b A2 commit 7 && commit 8 && commit 9 git checkout head~1 -b A3 commit a && commit b && commit c # Show foo and bar cd ../foo echo "foo:" git log --all --graph --abbrev-commit --decorate --date=relative --format=format:'[%s]%d' cd ../bar echo "bar:" git log --all --graph --abbrev-commit --decorate --date=relative --format=format:'[%s]%d'

初始化示例:

foo

给出了* [7] (HEAD, A2) * [6] * [5] | * [2] (A1) | | * [4] (master) | |/ |/| * | [3] |/ * [1] * [0] (A)

* [9] (A2)
| * [c] (HEAD, A3)
| * [b]
| * [a]
|/
* [8]
* [7]
| * [3] (A1)
| * [2]
| | * [6] (master)
| |/
|/|
* | [5]
|/
* [1]
* [0] (A)

对于酒吧

cd ../bar
git remote add foo ../foo
git push foo A:B
git push foo A1:B1
git push foo A2:B2
git push foo A3:B3

* [9] (B2)
| * [c] (B3)
| * [b]
| * [a]
|/
* [8]
* [7]
* [5]
| * [3] (B1)
| * [2]
|/
* [1]
* [0] (B)
* [7] (HEAD, A2)
* [6]
* [5]
| * [2] (A1)
| | * [4] (master)
| |/
|/|
* | [3]
|/
* [1]
* [0] (A)

Svlasov的解决方案:

然后我尝试应用svlasov

的解决方案
{{1}}

结果并不是真正的预期。此外,我们需要手动合并。我们可以自动完成吗?

1 个答案:

答案 0 :(得分:1)

这应该这样做:

cd /home/bar/git/
git remote add foo /home/foo/git/
git push foo A1:B1
git push foo A2:B2
git push foo A3:B3

             o----o--o A1
            /      \
bar: o--o--o        o--o--o A2
         \
          o--o--o A3

           +

           o--o--o A1
          /
foo: o--o--o--o A2
       \
        o A3

          |
          V

             o--o--o A1
            /
foo: o--o--o--o A2
      \  \        o--o--o B1
       \  o A3   /    \
        o--o----o      o--o--o B2
         \
          o--o--o B3

使用您的具体示例

这是我的bar

enter image description here

这就是我推动分支的方式:

git remote add foo ~/foo
git push foo origin:bar-origin
git push foo bar1:bar1
git push foo bar2:bar2
git push foo bar3:bar3
# I forgot to push master :(

之后我的foo

enter image description here

bar图表是可识别的。一个更通用的解决方案是遍历所有分支并为每个新分支名称添加一些前缀,就像我对bar-origin所做的那样,但我更喜欢手动完成总控制。