git push force分支是错误的吗?


11

当我在功能分支上工作时,我倾向于在使用我的工作进行审查并将其集成到主分支之前,使用交互式rebase清理分支中的提交

在开发功能期间,我想将我的中间工作推送到远程存储库作为备份措施。即,当我的硬盘崩溃时,我不想丢失整个功能分支。

但是,这导致这样一个事实,即git push --force在重新设置基准之后,我经常不得不对远程存储库执行“ a” 操作,这种操作通常不被接受。或如链接的github页面所说:

由于更改提交历史记录可能会使使用存储库的其他所有人感到困难,因此,当您已经将其推送到存储库时,对提交进行重新基准设置是不明智的做法。

是否有解决这一冲突的(通常被接受的)政策?

为什么这不是git的“重订黄金法则”那么重要吗?

我在这里的问题是要寻求一种解决方案,以解决要在远程存储库中备份您的工作重新部署工作之间的冲突,而另一个问题试图否认存在冲突,并问为什么有些人认为冲突根本存在,并因此问为什么不强制变基是“必要的”?



1
@gbjbaanb(如果您进行WIP提交),重新设置基准非常有用,可以避免在一天的工作中进行多次提交。我通常会提交一些小的更改,只是为了在需要时提供“撤消至我记得的状态”选项-其中大多数与回购的主要历史记录无关/有杂音(这就是为什么变基如此有用的原因)。
enderland '16

1
@gbjbaanb我认为这是意见问题。许多团队使用重新部署策略来保持其历史记录的清洁。
Chiel 10 Brinke

1
@enderland每个人都希望拥有美好的历史,它仍然是错误的(危险的)事情,如链接所示。Torvalds永远不会放进去,他应该允许提交被“压缩”在显示器上。
gbjbaanb

1
@gbjbaanb但是...他没有,所以我们必须处理我们拥有的东西。对我来说,在master分支上进行一次提交比在每个功能分支上进行30次以上的单独提交和增量提交要有用得多。但我想每个人的工作流程都会有所不同……
enderland

Answers:


5

问自己的关键问题:

  • 合并回master后,您是否保留远程分支?

如果在合并到master之后删除远程功能分支,则您已经失去了历史记录。假设您在合并/ PR之前先压缩/重新设置分支,那么您将丢失此历史记录。在这种情况下,您所需要执行的所有操作就是允许您使用github作为备份。

您希望保留历史记录而不是强制推送的情况是,如果您的远程分支在合并后仍然存在并且不仅存在了一段短暂的时间,而且仍然存在。

我想你是在问我是否保留未重新建立基础的分支?不,AFAIC。尽管如此,推强制它从理论上可能会导致其他用户的损失,而这些用户都被推到同一分支

听起来您有多个人同时推送到该分支。这意味着您确实关心分支的历史记录。

您可以为中间工作做的是创建该分支的派生。您可以执行此操作,然后在合并之前将所有提交重新设置为单个提交,因此,将它们合并到功能分支中时,您只有1个提交(具有整个分支的重新记录的历史记录)。


“合并回master之后,您保留远程分支吗?” 我想你是在问我是否保留未重新建立基础的分支?不,AFAIC。从理论上讲,强制推送仍然可能导致其他推送到同一分支的用户的提交丢失。
Chiel 10 Brinke

@ChieltenBrinke我对此做了一些编辑。仅供参考
-enderland

我认为分叉作为一种防止在强制推送时破坏提交的措施实际上是一个很好的建议。但是AFAIK并不是一个真正的git概念,您需要一个服务包装器来轻松实现此目的(例如github)。我对此是否正确?或者,也许我将您对“分叉”一词的使用误认为仅用于创建单独的分支?
Chiel 10 Brinke

@ChieltenBrinke很好,您可以通过多种方式完成同一件事。如果功能分支位于远程存储库上,则可以派生该存储库并拥有该分支的版本。然后在压缩提交后将该分支合并到您的远程分支中。或者,您可以只创建一个不同的本地分支(也许是featurebranch-local),然后在该分支上执行活动的dev,并根据需要进行任意数量的提交。一旦要合并,请压缩这些提交,然后将其合并到功能部件中。基本上只是在一个实际的临时分支中进行开发,然后压缩/合并到您的功能中。
enderland

假设因为不使用github而无法进行分叉存储库,那么我们将使用“私有” develop-feature分支。当然,私有性纯粹是由约定构成的,而不是由任何事物强制执行的,但是可以成为策略的一部分,特别是如果为此引入了某些分支命名约定的话。(也许我现在太着急了,也许不是:)结合起来--force-with-lease不会造成伤害,尽管不应该依赖,正如我在另一篇文章中指出的那样。
Chiel 10 Brinke

3

我在这里列出了一些我无法想到的可能性。

始终基于新分支

当分支混乱时some-feature,请将其重新建立在新分支上。例如

$ git checkout -b some-feature-rebase
$ git rebase -i master # etc..

然后进行some-feature-rebase了审查和整合。

问题:严格来说,这是一个很大的缺点,您需要为每个重新配置一个新分支。(例如,如果在代码审查后进行更改,则可能有多个基准)

利用 git push --force-with-lease

我刚刚了解的git push --force-with-lease替代品git push --force,其

拒绝更新分支,除非它是我们期望的状态;即没有人更新上游分支。

问题:这似乎在我们使用just的情况下直接改善了--force,但是仍然存在一些警告,尤其是当我用a git fetch代替a时git pull,它更新了本地上游分支,并欺骗--force-with-lease认为远程没有进行任何未合并的更改科。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.