使用git更新共享的分叉存储库

时间:2016-09-19 16:11:47

标签: git github gitlab git-fork

考虑存储库A通过Gerrit管理的github存储库。 我克隆了存储库A,我从存储库A的主分支开始创建了一个新的分支。我在新的gitlab存储库B上推送了这个新分支。我是存储库B的管理员,我与其他开发人员共享它。开发人员不能推动这个分支,但我可以合并他们的拉取请求。 我在存储库B的主分支上合并了一些pull请求。因此,存储库B具有存储库A的初始提交和pull请求的新提交:B在A提交(b a)之上提交。

然后,我想用存储库A的新提交更新存储库B. 将这些提交称为+。

我看到两个选项:

  1. 如果我在B上合并A,结果是:a + b a。
  2. 如果我在A +上修改B,结果为:b a + a。
  3. 选项1:开发提交与外部提交混合。难以调试并突出差异。

    选项2:我必须强行对远程B进行更改。如果我没有弄错,后果可能是:  1.如果开发人员拉B并且他们对B的本地主人有承诺,他们将失去他们的本地变化;  2.在强制更新分支B后,开发人员可能在重新安置当地分支机构时遇到大麻烦。

    我应该如何避免任何问题?

1 个答案:

答案 0 :(得分:7)

如果我理解正确,你有一个(本地)存储库看起来像这样:

            A/master
               ↓
* -- * -- * -- a
                \
                 * -- * -- b
                           ↑
                       B/mybranch

现在,A已更新,所以看起来像这样:

                          A/master
                              ↓
* -- * -- * -- a -- * -- * -- a+
                \
                 * -- * -- b
                           ↑
                       B/mybranch

请注意,您有两个不在一条直线上的分支分支。因此,当您将a+ b a合并到A时,您会收到B,这是不正确的。你确实得到了合并,但这保留了历史:

                          A/master
                              ↓
* -- * -- * -- a -- * -- * -- a+
                \               \
                 * -- * -- b --- M
                                 ↑
                            B/mybranch

正如您所看到的,您仍然可以获得提交来源的信息:aa+之间的信息来自一个分支,ab之间的信息来自MA之间的信息。 {1}}来自另一个人。而A结合了那些分支。通常, this 正是解决此问题的正确方法。

这一点超过变基的好处 - 正如你所注意到的那样 - 是承诺保持原样。与任一存储库进行交互的所有用户都可以毫无问题地简单地提取这些更改。如果你重新设置任何提交,他们将不得不手动修复它(他们甚至可能没有意识到它,所以他们只会拉动并实际创建一个更复杂的提交更糟糕的历史记录)。

所以合并肯定更适合在这里工作。是的,历史不会像直线一样完美,但它恰当地传达了已发生的事情:有一条独立的分支开发线,然后根据上游存储库A的更改进行了更新。这些信息非常有用,因此保留它们是有意义的。特别是如果您有用户与这两个遥控器进行交互,他们肯定更愿意保持其存储库与两个遥控器兼容。

如果您不希望历史记录看起来像这样,并且不关心与B的兼容性,您还可以将 A/master ↓ * -- * -- * -- a -- * -- * -- a+ \ * -- * -- b -- [A] ↑ B/mybranch 的所有更改压缩到[A]上:

a

此处,a+是一个压扁的提交,它包含单个提交中AB之间的所有更改。您可以通过在压缩所有提交时将public function authenticate($token = false) { $id = $this->getPayload($token)->get('sub'); if (! $this->auth->byId($id)) { return false; } $user = $this->auth->user(); $user->roles = explode(",", $user->roles); return $user; } 重新定位到sudo /Applications/XAMPP/xamppfiles/bin/apachectl start sudo /Applications/XAMPP/xamppfiles/bin/mysql.server start 来获得此结果。在这种情况下,您应该在提交消息中清楚地说明这些更改的来源。