我已经阅读了很多,但合并和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 是我的存储库外存在的提交吗?
答案 0 :(得分:0)
据我了解,你只能在这种情况下合并。原因是你已经已经推动某些功能提交(我猜至少是F1)。 这意味着那些提交不能重新设定,否则你会弄乱整个事情。
(除非你想重新提交未被推送的提交 - 但这意味着将功能提交分解为两部分,这可能不太好取决于你的情况)
与计算中的所有内容一样,这取决于您的意图:
我使用rebase来清理我的本地提交,我尝试尽可能多地提交,这意味着它可能在某个时候非常混乱,所以我会在推送之前使用rebase来清理它。
所以我的经验法则是rebase用于严重的本地提交,需要清理。因此,如果您正在进行清理提交,请执行此操作。
如果将更多内容添加到您的方案中,
如果功能是由你自己开发的,那么我会使用rebase进行合并(因为在完成之前没有任何东西会被推送到中央仓库) - 这不是你的情况。
由于功能可能与不同的人发展,你可能必须推(就像你的情况),在这种情况下唯一的选择是合并。
我猜你的D3和D4更像是修补程序(希望尽早应用),然后有时候这样做的方法是将分支出来的表单开发名为hotfix,它的开发和功能都合并到。< / p>
答案 1 :(得分:0)
实际上,您可以执行merge
或rebase
。重新定位会永久更改分支历史记录,但会生成更清晰的日志。
从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
分支中的提交。这意味着,某人本可以提取这些提交,目前正在处理这些提交。如上所述进行变基,请注意您的提交F1
,F2
,F3
变为F1'
,F2'
,F3'
。这些是完全新的提交,尽管它们包含相同的更改。如果你现在将它们推送到你的遥控器,覆盖旧的历史记录,那些在旧提交之上工作的人在想要推动他们的工作时会遇到问题。
像这样的Rebase总是会引入新的提交。如果您已经推送了旧提交,Git将不允许您推送这些提交,除非您使用--force
选项。一般来说,rebase
仅对本地更改更安全,您可以确定没有人在其上工作,因此可以安全地修改其历史记录。
有关其他说明,请参阅this。
编辑:在评论中说明Tim Biegeleisen
,不需要合并或变更,因为您已经完成了所有更改。但是,如果你现在推动,你将不得不进行强制推动,因为你改写了你的&#39; Feature
分支历史记录,如果其他人可能已根据您的更改进行操作,则不建议这样做。