我在我们的内部 Git 存储库中有这个内部项目 A
,
我必须从外部 Git 存储库中的外部库中添加和调整大部分代码 B
.
我没有添加 B 的全部历史记录,我只是在一次提交中添加了所有当前代码(我们称之为 B3
)(我们称之为 A5_B3'
)
带有明确引用 B3
的提交消息.
然后我删除了额外提交中不需要的所有内容,并在下一次提交中根据我的需要调整了代码。
A1 - A2 - A3 - A4 - A5_B3' - A6 - A7
/*
B1 - B2 - B3
"/*" = copy/cherry-pick/... (no 'real' reference/merge-point)
几个月后(以及对 A
的大量提交),我需要来自外部 Git 存储库的一些更新 B
.
我添加了远程 B,当然没有检测到共同祖先,因为 B 是在中间添加的,没有历史记录。
然而,我发现了一个 description to line up the two SHA's using a graft
,
所以我可以排列来自 B
的代码的点是“相等的”( B3
和 A5_B3'
)。
我什至设法 merge 了 B
中的更改至 A
在我的本地存储库 ( A18_B6'
) 中:
A1 - A2 - A3 - A4 - A5_B3' - A6 - A7 - ... - A17 - A18_B6'
/* /
B1 - B2 - B3 - B4 - B5 - B6
但事实证明,我无法将此 merge 推送到我的远程存储库 A
.
(编辑:我得到的错误是 [remote rejected] master -> master (n/a (unpacker error))
。)
考虑一下,这可能是合理的,因为我的远程远程存储库不知道 B
,
所以它可能不知道如何/在哪里找到/添加 B4
, B5
和 B6
.
也许我可以从 B
中挑选更改( B4
, B5
, B6
) 并将它们添加到 A17
.
但是这样就没有来自 B
的明确 merge ,虽然 - 当然 - 我可能会调整提交消息。
(我知道,从我开始的 B3
没有明确的 merge ,我会回到那个。)
A1 - A2 - A3 - A4 - A5_B3' - A6 - A7 - ... - A17 - A18_B4' - A19_B5' - A20_B6'
/* /* /* /*
B1 - B2 - B3 - B4 - B5 - B6
我现在能想出的唯一“解决方案”是添加一个单独的“A_B
” -分支'来自A5
(使用明确引用 B
的分支名称),
从 B
中挑选更改( B4
, B5
, B6
) 在该分支中,并将该分支 merge 到 A
中时不时地。
A1 - A2 - A3 - A4 - A5_B3' - A6 - A7 - ... - A17 - A18_B6'
/ /
AB3' - AB4' - AB5' - AB6'
/* /* /* /*
B1 - B2 - B3 - B4 - B5 - B6
与此同时,还添加了来自另一个外部 Git 存储库的另一个外部库的一小部分代码 C
.
这可能会得到错误修复,所以它甚至可能会加倍麻烦......
我的问题是:
- 如果我们可以重新开始,添加(部分)B(和 C)的最佳实践是什么
- 鉴于目前的情况,是否有比这个更好的解决方案'
A_B
-branch' with cherry-picks
(很抱歉,如果这是重复的。我试图寻找类似的东西。 我找到了很多关于将项目/ fork 与“完整”的共同历史 merge 的答案。 我找到了一些关于需要单一 merge 的类似项目的答案。 但我想我以后可能需要引入更多的错误修复。 但是,我可能缺少正确的 Git 术语/关键字来搜索。)
最佳答案
首先,您的错误与 merge 无关。我从来没有遇到过这样的错误,并且在没有进一步上下文的情况下,这是我能找到的最好的:git: can't push (unpacker error) related to permission issues
你不能推送到“服务器”(git 没有服务器,真的)由于历史重写或者如果你的历史比服务器旧。就这样。如果您从服务器 pull ,成功 merge ,然后推送,全部“自动”(没有其他人接触服务器),它将正常工作。
因此,如果我处于您的位置,并且遇到了这个问题,那么在重新开始时,我会检查那个问题是什么,然后继续前进。 您的 merge 策略没有任何问题。
此外,避免 cherry-pick 。根据我的经验,这通常是一件坏事,因为它不会保存它的来源(也许有一种我不知道的方式)。但有时,很少见,它很有用。然后,我在它的提交中写下“cherry picked”,甚至添加 where from(同样,也许有更好的方法,但因为我很少这样做,所以我不太在意)。有一件事是肯定的:如果你做太多的 cherry-pick ,你就做错了 git。返回basics .
关于git - 使用和 merge 外部 Git 存储库的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17231037/