【问题标题】:GitHub advises "Force pushing can corrupt your pull request." Why?GitHub 建议“强制推送会破坏你的拉取请求。”为什么?
【发布时间】:2018-10-12 10:14:25
【问题描述】:

在https://help.github.com/articles/about-pull-requests/,GitHub 上有一条注释阅读:

注意:处理拉取请求时,请记住以下几点:

[...]

  • 将提交推送到拉取请求时,不要强制推送。强制推送可能会破坏您的拉取请求。

我不明白其中的原因——过去我经常将修改后的提交强制推送到具有相关开放 PR 的分支,但从未见过任何分支或 PR UI 损坏问题。

我知道强制推送会使与同一分支机构的同事合作变得更加困难 - 但对我来说,这并不真正符合“损坏的分支”或“损坏的 PR”的定义。

谁能解释一下 GitHub 的意思?

【问题讨论】:

  • 我猜你可以强制推送 GitHub 不知道如何与拉取请求集成的东西,例如强制推送拉取请求中的所有提交。
  • 如果只剩下基础分支上也可用的提交,GitHub 将自动关闭 PR。

标签: git github push collaboration


【解决方案1】:

强制推送可能破坏你的拉取请求。并非总是如此。

当发生真正的强制推送时,原始拉取请求会丢失一个或多个提交,而更新的拉取请求可能会也可能不会带来一个或多个新提交。如果丢失的提交引入的更改未包含在新的拉取请求中,则文件的内容已损坏。如果更改保留,但包括作者/提交者姓名、电子邮件或日期在内的信息是伪造的,我们也可以说拉取请求已损坏。这些是版本控制系统中重要的事情。但是,如果您打算这样做,这不是问题。有时需要改写历史。

在你的情况下,我猜只有提交消息被修改并且没有任何重要的东西丢失,我相信只要你知道后果,做强制推送是正确的事情。但是如果一个人不小心或鲁莽地这样做,那将是一个问题,尤其是当拉取请求包含来自其他贡献者的未合并提交时。

当你真的需要强制推送的时候,你可以随时创建一个新的拉取请求,这样更安全,避免烦人的问题

【讨论】:

  • 我猜你的论点是“如果你的本地分支被破坏,强制推送会将这种破坏传播到服务器”,但是我仍然发现 GitHub 的措辞具有误导性:你的本地更改是罪魁祸首,而不是力推本身。
  • 我认为他的意思是,实际的公关可能会被强制推送搞砸。例如,如果已请求更改某些代码行,则如果在强制推送后相关提交不再可用,则这些引用可能会丢失,因为 GitHub 在其垃圾收集时不会跟踪哪些提交是 PR 的引用一边。
  • 鉴于 PR #1234 指向分支名称foo,可以使用git checkout foo,用git tag PR-foo(或git tag PR-1234)备份它然后是git push --tags,然后再执行git push --force。这应该保留 pull-request code cmets 或 change requests 引用的提交。 – 我还没有尝试过,但是我也被这种历史丢失所困扰,使 code-cmets 引用不再存在的提交。
猜你喜欢
  • 2017-02-02
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 2017-11-07
  • 2016-07-28
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多