GIT - 来自同一分支的拉取请求带来提交历史

GIT - Pull requests from the same branch bring over history of commits

这是我的一个存储库中的设置:

我们所做的每项更改都经过以下步骤。 假设我必须更改 readme.md.

  1. 我从默认的 b运行ch (staging) 创建了一个新的 b运行ch,我们称它为 patch-readme
  2. 我在 patch-readme 中进行了所有需要的更改。
  3. 当我对我的更改感到满意时,我会创建一个 PR 到 staging
  4. 我合并(挤压和合并)PR,然后删除 patch-readme
    • (注意:此时多个开发人员可以按照前面的步骤推送到 staging b运行ch)
  5. staging b运行ch 然后部署到登台服务器。
  6. 如果我对暂存服务器中的更改感到满意,我会创建一个从 stagingmaster 的新 PR。
  7. 然后我审查更改并合并(压缩和合并)拉取请求。
  8. 此时我将 master 合并回 staging。我这样做是因为如果 staging 的下一个 PR 对 readme.md 文件进行了更改,当我创建从 stagingmaster 的新 PR 时,我会遇到冲突在那个文件上。所以为了避免冲突,我在每次合并 PR 后合并回 master

这个工作流有问题,基本上从 stagingmaster 的每个拉取请求都引入了几个月前的提交,这意味着存储库中出现了混乱(例如,如果有提交引用一个问题,该问题将有一个很长的引用列表,每个新创建的 PR 都有一个)。

现在,我不明白的是,有时(我还没弄明白是在什么情况下)历史会被清除。今天这件事发生在我身上,因为开发人员在合并 PR 后忘记从 master 更新,我不得不修复一些冲突,在修复冲突后新的 PR 有一个干净的历史记录。我试图复制这种情况,但它似乎并没有这样做。

我看过 rebase,所以我在将 PR 从 staging 合并到 master 之后尝试了一些方法,而不是合并回 master I 运行 a git rebase master 而在 staging b运行ch 上。这没有用,master 的下一个 PR 仍然有以前的历史记录。

有用的是,我没有为 master 创建 PR,而是 运行

git checkout master
git rebase staging

在这种情况下,我什么都不用做,下一次 PR 历史就干净了。但这没有多大意义,因为我们需要丢弃 PR。我们正在使用 PR 进行代码审查。

我做错了什么?从 stagingmaster 的 PR 中,我怎样才能每次都有一个干净的历史记录?

请注意,我们的开发人员通常只使用 Github 桌面 Github 网络界面 .因为我们是一个小团队,所以每个人都可以创建 PR 并将其合并到 stagingmaster

我找到了发生这种情况的原因。我们正在使用 GitHub 网络 UI 合并 PR。

基本上每个发送到暂存区的 PR 都与 "Squash and merge" 合并。 从 staging 到 master 的 PR 以同样的方式合并。

通过使用 "Merge commit" 而不是 "Squash and merge",暂存中的每个提交也会出现在 master 中(而不是使用 squash 的单个提交)。

所以,现在为了保持历史干净,我们正在执行从功能分支到暂存的 "Squash and merge",同时我们正在执行从暂存到主分支的 "Merge commit"。

希望这对其他人有帮助。