git - 在分支

时间:2017-03-13 04:13:45

标签: git rebase

我已经阅读了很多,但合并和rebase仍然让我感到困惑。

我有2个分支 - 开发功能功能分支从 Develop 分支提交。我使用D x 来表示 Develop 的提交,并使用F x 来表示 Feature 的提交,其中x表示数字。

一开始,我想添加一个新功能,以便从开发

分支功能
Develop D1----D2
               \     
Feature         F1

几天后,我推送 功能中的一些提交,开发也是如此。

Develop D1----D2----D3----D4
               \
Feature         F1----F2----F3

我发现功能需要更新 Develop ,所以我决定应用D 3 和D 4 < / sub>进入我的功能

在我看来,rebase在这里是一个更好的选择,我的日志就像

Develop D1----D2----D3----D4
                           \
Feature                     F1----F2----F3

但实际上,日志变为

Develop D1----D2----D3----D4
               \
Feature         F1----F2----F3----D3----D4

现在是我的问题......我应该在这种情况下使用合并或变基吗?

我认为rebase在这里更好,但我在一些网站上找到了一个黄金法则,例如git-scm.com告诉不要重新存储存储库外存在的提交。

在我的情况下,D 3 和D 4 是我的存储库外存在的提交吗?

3 个答案:

答案 0 :(得分:0)

据我了解,你只能在这种情况下合并。原因是你已经已经推动某些功能提交(我猜至少是F1)。 这意味着那些提交不能重新设定,否则你会弄乱整个事情。

(除非你想重新提交未被推送的提交 - 但这意味着将功能提交分解为两部分,这可能不太好取决于你的情况)

编辑以澄清评论

与计算中的所有内容一样,这取决于您的意图:

我使用rebase来清理我的本地提交,我尝试尽可能多地提交,这意味着它可能在某个时候非常混乱,所以我会在推送之前使用rebase来清理它。

所以我的经验法则是rebase用于严重的本地提交,需要清理。因此,如果您正在进行清理提交,请执行此操作。

如果将更多内容添加到您的方案中,

如果功能是由你自己开发的,那么我会使用rebase进行合并(因为在完成之前没有任何东西会被推送到中央仓库) - 这不是你的情况。

由于功能可能与不同的人发展,你可能必须推(就像你的情况),在这种情况下唯一的选择是合并。

我猜你的D3和D4更像是修补程序(希望尽早应用),然后有时候这样做的方法是将分支出来的表单开发名为hotfix,它的开发和功能都合并到。< / p>

答案 1 :(得分:0)

实际上,您可以执行mergerebase。重新定位会永久更改分支历史记录,但会生成更清晰的日志。

develop分支

开始的示例

INITIAL STATE:

Develop*  D1----D2

结帐新的feature分支:(git checkout -b feature

Develop  D1----D2
                \
Feature*         F1

INTERIM:

Develop  D1----D2----D3----D4
                \
Feature*         F1----F2----F3

MERGE(git pull upstream develop):

Develop  D1----D2----D3---------D4
                                  \
Feature*         F1----F2----F3----[D3+D4]

介绍新的合并提交。

REBASE(git rebase upstream/develop

Develop  D1----D2----D3----D4
                            \
Feature*                     F1'----F2'----F3'

这会改变feature分支的历史记录,并更改SHA分支中所有提交的feature。这就是为什么推送remote的分支机构不推荐使用 rebase 的原因。

remotes/upstream/feature分支现在与local/feature不同,您将无法使用git push upstream feature更新远程分支。

要使用当前更改重新启动分支,请使用--force, -f标记

# Use with caution. Cannot be reverted.
git push upstream feature -f

通过此步骤,任何可能已拉/分支您的分支的用户现在基本上与您的分支分离,并且无法在不改变其本地历史记录的情况下推送到feature分支上游。

答案 2 :(得分:0)

  

但实际上,日志变为

Develop D1----D2----D3----D4
               \
Feature         F1----F2----F3----D3----D4

我不认为这是正确的。根据{{​​3}},日志应如下所示

Develop D1----D2----D3----D4
                           \
Feature                     F1'----F2'----F3'

事实上,您的情况与我上面提供的链接中的主要主题分支示例非常相似。

您已经在代码中实现了所需的内容:您的主人和Feature s&#39;变化。现在的问题是与遥控器同步。

  

不要重新定义存储库外部的提交。

您已经推送了Feature分支中的提交。这意味着,某人本可以提取这些提交,目前正在处理这些提交。如上所述进行变基,请注意您的提交F1F2F3变为F1'F2'F3'。这些是完全新的提交,尽管它们包含相同的更改。如果你现在将它们推送到你的遥控器,覆盖旧的历史记录,那些在旧提交之上工作的人在想要推动他们的工作时会遇到问题。

像这样的Rebase总是会引入新的提交。如果您已经推送了旧提交,Git将不允许您推送这些提交,除非您使用--force选项。一般来说,rebase仅对本地更改更安全,您可以确定没有人在其上工作,因此可以安全地修改其历史记录。

有关其他说明,请参阅this

编辑:在评论中说明Tim Biegeleisen,不需要合并或变更,因为您已经完成了所有更改。但是,如果你现在推动,你将不得不进行强制推动,因为你改写了你的&#39; Feature分支历史记录,如果其他人可能已根据您的更改进行操作,则不建议这样做。