如何在拉取请求中压缩提交

Posted

技术标签:

【中文标题】如何在拉取请求中压缩提交【英文标题】:How to squash commits in a Pull request 【发布时间】:2021-05-11 08:03:20 【问题描述】:

我有一个关于开源存储库的拉取请求,其中包含一个提交,例如commit a。现在有人要求我更改该提交中的一些代码。 如果我在我的 android Studio 中打开该分支并更改请求的代码,然后如果我再次提交,将会有两次提交。我想更改代码并且在我的拉取请求中只有一个提交。

我尝试过的事情:

我尝试将 HEAD 重置为 git reset HEAD~2 --soft 的初始提交 然后是git commit -a -m "combined commit message",但是当我将此分支推送到我的远程存储库时,会出现一个弹出窗口,上面写着"This branch has conflicts with the remote branch which need to be resolved",带有选项mergerebase。我知道那是什么意思。这是因为我正在更改远程分支中的相同代码。所以我想rebase。然后有一个收到的 commit a。然后我再次运行git reset HEAD~2 --soft 并再次运行git commit -a -m "I have received the commit and I am combining these two commits again",但是当我再次推送它时,会出现相同的弹出窗口。

有什么帮助吗?如何更改相同的代码并在该拉取请求中仍然有一个提交?

【问题讨论】:

为什么不按原样保留分支,并在合并时压缩? @jonrsharpe 我知道贡献者可以从他们身边“挤压和合并”,但他们仍然希望我从我身边挤压。该怎么做? 这能回答你的问题吗? Squash my last X commits together using Git 已经试过了。发生冲突。 你是说当你推的时候?当然有,你正在改变历史。 【参考方案1】:

更改代码后,您可以运行 git commit --amend 然后 force push 对您的 fork/branch 进行更改。然后,修改和强制推送将接受更改,但仅在您的 fork/branch 中将其显示为相同的提交。

注意:如果使用 github,更改将在 pull request (PR) 中获取,但会有一个日志说明您在 PR 中强制推送(根据我的经验,维护者的回购协议,我提交的 PR 从未真正指出或提出任何担忧)。

git commit --amend

您无需在此处进行更改。因此,只需将其与相同的消息一起保存,除非您实际上还想更改提交消息。然后强制推送:

git push -f

这将用您的新更改覆盖现有提交(如果在上一步中更改,则新提交消息)

注意:标准且广受欢迎的git force push PSA(公共安全公告)适用 - 谨慎使用强制推送。但是,如果您已经测试过您的代码并且它可以工作,那么您应该没问题。

【讨论】:

以上是关于如何在拉取请求中压缩提交的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Git 中压缩提交?

推送后如何在git中压缩提交?

如何在 Django 中压缩 JSON 请求?

如何在 GitHub 上恢复拉取请求提交

Git-TFS - 如何在拉取请求被批准之前确保分支是最新的?

在拉取请求时重命名分支