git - 使用和 merge 外部 Git 存储库的最佳实践

标签 git merge repository

我在我们的内部 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 的代码的点是“相等的”( B3A5_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 , B5B6 .

也许我可以从 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/

相关文章:

android - 使用 git 进行可复制的 Android 构建,并进行快进 merge

git - 如何更改remove+add以在git历史记录中移动

gitignore - 致命的 : no files added

git reset --hard,它将如何影响我的提交和分支?

java - 从许多 jar 文件创建合并的可执行 Jar(在类路径中使用)

r - 如何根据R中的相似值合并两个数据帧

gitosis 询问密码

R 如何以类似辫子的方式合并数据帧

android - 如何从 Maven JCenter 中删除我的库?

java - 在 Gradle 中获取 POM 父级