我已经阅读了多个类似的SO问题,但没有找到一个足够接近我的问题。
我有两个基于相同初始代码A
的离线存储库。这些存储库已经各自发展:
存储库foo
位于/home/foo/git/
:
o--o--o A2
/
A--o--o--o master
\
o A1
位于 /home/bar/git/
的代码库 bar
:
o--------o--o A2
/ \
A--o--o--o master o--o--o A3
\
o--o--o A1
这个想法是将bar
的所有内容导入到一个名为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)
对于 bar
* [9] (A2)
| * [c] (HEAD, A3)
| * [b]
| * [a]
|/
* [8]
* [7]
| * [3] (A1)
| * [2]
| | * [6] (master)
| |/
|/|
* | [5]
|/
* [1]
* [0] (A)
Svlasov的解决方案:
然后我尝试应用svlasov的解决方案。
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)
结果并不是我们期望的那样。此外,我们需要手动进行合并。我们能否自动完成它?