安全的强制推送流程?

4
我听说强制推送(git push -f)是一种应该尽量避免的危险做法。即便如此,在一个小团队共享私有repo的情况下,有什么安全的操作步骤呢?我想应该是这样的:
  1. 请求团队成员在我完成前不要进行push操作。
  2. 执行fetch命令。
  3. 必要时更新分支历史(amend、rebase等)。
  4. 执行force push命令。
  5. 通知他们我已经完成了。
  6. 他们需要执行___操作来获取和整合新的分支历史,而不会丢失任何信息。
请问有人能够完善这个流程或者提供更好的方案吗?我想找到最简单可靠的操作步骤。

这也取决于你所说的“安全”是什么意思。如果你正在更改/删除已经发送给客户的代码,以至于现在无法再次生成该代码,则真正没有安全的方法来执行此操作。 - Mort
@Mort 我想特别询问关于强制推送方面的问题,而不是一般性地询问关于变基的问题。据我所知,当你强制推送时,有可能会覆盖其他人的推送,导致代码丢失或者至少难以恢复。我想了解如何避免这种情况。也许只需要解决最简单的情况:我想修改我的最后一次提交,但在推送之前忘记了这样做,而其他人已经拉取了代码。 - MarredCheese
3个回答

11

git push --force-with-lease 可能是一个有用的工具。但它将作为哪个整体流程的一部分呢? - MarredCheese
1
Git 提供了轻量级分支,可以经常使用。你的工作应该在一个私有分支中完成,这个分支可以自由地被你修改 - 最好使用 --force-with-lease,以防需要强制推送时出现问题。当在公共分支上工作时,我只需要强制推送一次,当其他开发人员强制推送他们的工作覆盖了其他人的提交时。然后整个团队被要求重新基于他们的工作进行操作。当我忘记将更改添加到公共分支时,我只需创建一个新的提交。当我想从公共分支中删除更改/提交时,我会做一个还原提交。 - jbialobr
强制推送会让整个团队额外工作,有可能导致提交丢失。 - jbialobr
我建议先进行一次干运行:git push -n --force-with-lease - Bolesław Denk

2
以下方法看起来有些脆弱,但只要所有其他团队成员在所述分支上没有任何本地提交,它就可以工作。
您向该分支添加代码并强制推送它(在您的问题中的步骤1-5):
"最初的回答"
git checkout feature
# Add code
git push --force-with-lease

你的团队中其他开发人员应该按照以下步骤进行(第6步):

最初的回答:

git fetch
git branch -D feature
git checkout feature

执行完此命令后,所有团队成员将与您拥有相同的代码分支。
如果他们有任何未推送的提交,这些提交将会丢失!请注意!

0

看起来你知道自己在做什么,为什么这样做是不安全的。让我补充两点:

  1. 他们强制获取/拉取 (git fetch/pull -f)。

  2. 他们仔细验证已经推送的任何代码都没有丢失。如果有东西丢失了,他们使用参考日志 (git reflog) 来恢复丢失的提交,并将它们 cherry-pick/rebase 到当前分支。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接