gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 14:18:48 24 4
gpt4 key购买 nike

我已经阅读了多个关于 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 导入名为 bar 的新分支 B 中的 foo :

作业完成后,它在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

简单的方法是什么?

示例

首先,我们要像上面那样创建 foobar:

初始化示例:

#!/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)

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)

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

最佳答案

应该这样做:

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

使用您的具体示例

这是我的:

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 所做的那样,但我更喜欢完全控制的更多手动工作。

关于git - 如何在新分支上将 git 存储库导入另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29027376/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com