繁体   English   中英

git - 在分支上工作时重新绑定和合并

[英]git - rebase and merge when working on a branch

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

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

一开始,我想添加一个新功能,所以我从Develop分支一个功能

Develop D1----D2
               \     
Feature         F1

几天后,我在Feature中 推送了一些提交, Develop也是如此。

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

我发现功能需要更新Develop ,所以我决定将D 3和D 4应用到我的功能中

在我看来,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是存储在我的存储库之外的提交?

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

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


编辑以澄清评论中的更多内容

就像计算中的一切一样,这取决于你的意图:

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

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

如果将更多内容添加到您的场景中,

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

由于功能可能会与不同的人发展,您可能需要推送(就像您的情况一样),在这种情况下,唯一的选择是合并。

我猜你的D3和D4更像是修补程序(它想要尽早应用),然后有时候这样做的方法是将分支出来的表单开发称为hotfix,它的开发和功能都融合到了。

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

develop分支开始的示例


初始状态:

Develop*  D1----D2

CHECKOUT新feature分支:( git checkout -b feature

Develop  D1----D2
                \
Feature*         F1

临时:

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分支。

但事实上,日志变成了

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

我不认为这是正确的。 根据这个 ,日志应该是这样的

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

实际上,您的情况看起来与我上面提供的链接中的master-topic分支示例非常相似。

您已经在代码中实现了所需的功能:您可以更改主服务器以及Feature的更改。 现在的问题是与您的遥控器同步。

不要重新生成存储库外部的提交。

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

像这样的Rebase总是会引入新的提交。 如果您已经推送了旧提交,Git将不允许您推送这些提交,除非您使用--force选项。 在一般情况下,是比较安全的rebase仅局部变化,在这里你可以肯定没有人的作品在他们顶部和它的因此是安全的修改他们的历史。

请参阅此问题以获得其他解释。

编辑:正如Tim Biegeleisen在评论中所说,不需要合并或变更,因为您已经完成了所有更改。 但是,如果您现在推动,则必须执行强制推送,因为您重写了“ Feature分支历史记录”,如果其他人可能已根据您的更改进行操作,那么这是不可取的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM