git documentation在几个地方提到not to rebase if the code has been pushed to a public repository this rebase strategy。但是,我在Googling my Git问题时已经在多个地方看到了{{3}}。
所述情况是在与其他开发人员合作时使用git pull
和--rebase
选项,以减少“污染日志”的合并提交量。甚至可以通过将branch.master.rebase
选项设置为true
来自动生成。
为什么这个策略被认为是安全的,看看精细文档在与其他开发人员合作时特别警告不要进行变基?
答案 0 :(得分:3)
我相信你误解了警告。
假设有一个尚未推送的本地提交A
,以及尚未提取的提交B
。通过运行git pull --rebase
,您将销毁提交A
,提取提交B
,重新创建提交{{1在A
之上。
由于提交B
是本地的,因此这是好的和安全的,而这正是rebase策略所暗示的。但是,文档告诉您不要这样做如果提交A
已被推送(例如)到另一个分支。在这种情况下,您将破坏公开提交,并重写公共历史。
答案 1 :(得分:3)
当您执行git pull --rebase
时,不要在任何地方推送任何东西。所以这很安全。
如果出现正常git pull
,则会发生以下情况:
A-B-C(master)
\
D(origin/master)
becomes
A-B-C-E(master)
\ /
D(origin/master)
使用合并提交“污染”。
如果您改为使用git pull --rebase
:
A-B-C(master)
\
D(origin/master)
becomes
A-B-D(origin/master)
\
E(master)
没有合并,更多线性历史。仍然没有推动,没有危险。您只重写了本地master
分支的历史记录。
master
和origin/master
分歧的原因是你还没有推动master
。这就是为什么与使用rebase的所有警告都没有矛盾。
答案 2 :(得分:1)
当你执行pull -rebase时,你可以在遥控器上重置你的提交。
你确实不应该做的事情就是你已经推送给主人的提交你自己的提交(交互式)。
如果您进行交互式变基,例如你压扁自己的提交,对于已经推送给主人的提交,你实际上是在摧毁"你的git存储库的历史。大多数git服务器都不允许你将这些提交推送到远程。
所以请注意,他们警告你的那个与完成拉动--rebase
完全不同答案 3 :(得分:1)
人们通常不希望重新绑定与其他人共享的提交,因为这会使他们更难以将旧提交与重组提交的重写提交同步。
请注意,这并不意味着团队成员无法将其工作与已重新定位的公开推送代码同步。 协调起来比较困难,特别是对于大型团队 。如果必须将基于旧公共提交的工作与相同的重新提交同步进行同步,则可以使用git rebase --onto
标志来执行此操作。 The official Linux Kernel git documentation for rebase
甚至表明了这一点。
所以基本上,如果你不相信其他人能够或知道如何将他们的工作与重新定位的公共提交同步,或者你不想为其他开发人员创建额外的工作, 不要推送已经公开推送的重新提交的提交 。
但请注意,我说 已经公开推送 。如果没有其他人拥有您要重新提交的提交副本,那么没有什么可担心的。 这就是为什么可以在您自己的本地提交中使用git pull --rebase
...只要您还没有与其他任何人分享这些本地提交。