【问题标题】:How to convert pushed regular merge into squash-merge in git?如何将推送的常规合并转换为 git 中的 squash-merge?
【发布时间】:2021-09-28 03:38:45
【问题描述】:

我不小心将使用 regular commit 的 20 个提交从 feature branch 合并到 main 分支。有没有办法恢复它并使其成为squash and merge?目的是使main 分支干净。我在feature branch 中的 20 个提交应该只有一个提交。

【问题讨论】:

  • 您已经推送main 了吗?如果是,您是否有权强制推送main?如果仍然是,您的团队是否有关于何时允许您强制推送main 以及如果您这样做了如何通知其他人的政策? (有多少人在使用这个 repo 并且可能会受到它的影响?)
  • 是的,我已经推送到基础分支。这是我们自己的回购。最新的提交只是我的合并提交。小组中的每个人都注意到了这一点,所以我们想先弄清楚这一点。

标签: git github git-merge git-commit


【解决方案1】:

首先,免责声明。 Git 的标准经验法则是:

不要强行推送共享分支,因为它会弄乱其他人。

但是,如果您愿意承担后果,那么经验法则当然可以有例外,就您而言,这听起来像:

小组中的每个人都注意到了这一点,所以我们想先弄清楚这一点。

所以解决这个问题的方法相当简单:

# tell everyone you are going to rewrite the main branch
git checkout main
git pull main
# look at main and make sure other people didn't add more commits after yours
git reset --hard <last-good-commit-id-before-your-feature-branch>
git merge feature-branch --squash
# at this point a single squashed commit is staged and ready to be committed
git commit -m "Merge and squash feature branch"
# now replace the remote main branch with your copy
git push --force-with-lease
# now tell everyone it is fixed and they can resume work

注意:您询问了“revert”,但在 Git 中,“revert”一词的意思是创建一个新的提交来撤消先前的现有提交。这将使历史保持不变并改变功能。您实际上想要相反的结果,因为您想保持功能不变并更改历史记录。要更改历史记录,您需要“重写”提交,在这种情况下包括向后重置以删除提交,并重新创建新的提交。

旁注:您可能需要考虑在main 上设置分支策略,并使用拉取请求合并到main。然后(让我们希望)审查您的代码的人会在您的 PR 中看到很多提交,并可以告诉您先压缩它们。或者,您可以设置一个 squash 合并策略,以便在 PR 完成时自动发生。

【讨论】:

  • 作为一个信息点,您可以在 GitHub 中配置您的存储库,以便可以进行 Squash And Merge。
  • 非常感谢!这正是我要问的。
猜你喜欢
  • 2017-03-28
  • 1970-01-01
  • 2013-10-03
  • 2016-12-30
  • 2016-07-26
  • 1970-01-01
  • 2019-04-13
  • 2019-08-19
  • 2012-11-08
相关资源
最近更新 更多