在 gerrit 中使用 -f push 后很少有提交丢失

Few commits are missing after using -f push in gerrit

我使用以下命令删除了不小心推入我们的 gerrit 项目之一的较大文件。

1. Clone the project
2. git filter-branch --force --index-filter \
  'git rm --cached --ignore-unmatch path/to/heavy.file' \
  --prune-empty --tag-name-filter cat -- --all
3) git push origin --force --all

现在一些提交 missing/gone 来自我们的远程项目 master 分支。那么现在我如何恢复我强行推送的提交(或者)我如何恢复丢失的提交?

git log 没有显示我推送的提交。请帮我解决这个问题。提前致谢。

从评论中,我们知道发生这种情况的原因是因为在您克隆到您强制推回重写的回购之间的 4 小时内,master 上出现了 22 个新提交。

要取回这 22 次提交:

  1. 锁定 master 分支,以便在您修复它时没有其他人提交它。 (回想起来,您也可以在之前的重写过程中通过锁定来避免这个问题。)
  2. 在重写代码库之前,请记下 master 之前的提示。我们称该提交为 M1.
  3. 找到之前 master 缺少 22 次提交的新提示提交 ID。听起来您已经从 gerrit 中找到了它。之前获取过的任何人也会拥有它,并且创建最后一次提交的人(或事物)也会知道它。我们称该提交为 M2.
  4. 在您重写的回购协议中,结账大师:git checkout master
  5. 现在挑选 22 次提交的范围:git cherry-pick M1..M2
  6. 现在推出你重写的提交:git push

请注意,您不必在最后一步强制推送 master。如果您确实必须强制推送,则意味着您在第一步中的 Lock 不起作用,并且有人再次添加了新的提交。您可以将本地 master 重置为新提示,并重复这些步骤,或者获取然后 git rebase origin/master 其中 应该 在最新的基础上重写您的 22 次提交master 再一次。最后,您可以再次 git push 而不用强制,您会知道自己已经完全更新了。

提示:任何时候你计划强制推送一个共享分支,最好的做法是通知你的团队,然后锁定分支,这样就没有人可以提交它。