GIT - 来自同一分支的拉取请求带来提交历史
GIT - Pull requests from the same branch bring over history of commits
这是我的一个存储库中的设置:
master
b运行ch <- 这总是在生产服务器中
staging
b运行ch(默认 b运行ch)<- 这是在暂存服务器中
我们所做的每项更改都经过以下步骤。
假设我必须更改 readme.md
.
- 我从默认的 b运行ch (
staging
) 创建了一个新的 b运行ch,我们称它为 patch-readme
- 我在
patch-readme
中进行了所有需要的更改。
- 当我对我的更改感到满意时,我会创建一个 PR 到
staging
。
- 我合并(挤压和合并)PR,然后删除
patch-readme
。
- (注意:此时多个开发人员可以按照前面的步骤推送到
staging
b运行ch)
staging
b运行ch 然后部署到登台服务器。
- 如果我对暂存服务器中的更改感到满意,我会创建一个从
staging
到 master
的新 PR。
- 然后我审查更改并合并(压缩和合并)拉取请求。
- 此时我将
master
合并回 staging
。我这样做是因为如果 staging
的下一个 PR 对 readme.md
文件进行了更改,当我创建从 staging
到 master
的新 PR 时,我会遇到冲突在那个文件上。所以为了避免冲突,我在每次合并 PR 后合并回 master
。
这个工作流有问题,基本上从 staging
到 master
的每个拉取请求都引入了几个月前的提交,这意味着存储库中出现了混乱(例如,如果有提交引用一个问题,该问题将有一个很长的引用列表,每个新创建的 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 进行代码审查。
我做错了什么?从 staging
到 master
的 PR 中,我怎样才能每次都有一个干净的历史记录?
请注意,我们的开发人员通常只使用 Github 桌面 和 Github 网络界面 .因为我们是一个小团队,所以每个人都可以创建 PR 并将其合并到 staging
和 master
。
我找到了发生这种情况的原因。我们正在使用 GitHub 网络 UI 合并 PR。
基本上每个发送到暂存区的 PR 都与 "Squash and merge" 合并。
从 staging 到 master 的 PR 以同样的方式合并。
通过使用 "Merge commit" 而不是 "Squash and merge",暂存中的每个提交也会出现在 master 中(而不是使用 squash 的单个提交)。
所以,现在为了保持历史干净,我们正在执行从功能分支到暂存的 "Squash and merge",同时我们正在执行从暂存到主分支的 "Merge commit"。
希望这对其他人有帮助。
这是我的一个存储库中的设置:
master
b运行ch <- 这总是在生产服务器中staging
b运行ch(默认 b运行ch)<- 这是在暂存服务器中
我们所做的每项更改都经过以下步骤。
假设我必须更改 readme.md
.
- 我从默认的 b运行ch (
staging
) 创建了一个新的 b运行ch,我们称它为patch-readme
- 我在
patch-readme
中进行了所有需要的更改。 - 当我对我的更改感到满意时,我会创建一个 PR 到
staging
。 - 我合并(挤压和合并)PR,然后删除
patch-readme
。- (注意:此时多个开发人员可以按照前面的步骤推送到
staging
b运行ch)
- (注意:此时多个开发人员可以按照前面的步骤推送到
staging
b运行ch 然后部署到登台服务器。- 如果我对暂存服务器中的更改感到满意,我会创建一个从
staging
到master
的新 PR。 - 然后我审查更改并合并(压缩和合并)拉取请求。
- 此时我将
master
合并回staging
。我这样做是因为如果staging
的下一个 PR 对readme.md
文件进行了更改,当我创建从staging
到master
的新 PR 时,我会遇到冲突在那个文件上。所以为了避免冲突,我在每次合并 PR 后合并回master
。
这个工作流有问题,基本上从 staging
到 master
的每个拉取请求都引入了几个月前的提交,这意味着存储库中出现了混乱(例如,如果有提交引用一个问题,该问题将有一个很长的引用列表,每个新创建的 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 进行代码审查。
我做错了什么?从 staging
到 master
的 PR 中,我怎样才能每次都有一个干净的历史记录?
请注意,我们的开发人员通常只使用 Github 桌面 和 Github 网络界面 .因为我们是一个小团队,所以每个人都可以创建 PR 并将其合并到 staging
和 master
。
我找到了发生这种情况的原因。我们正在使用 GitHub 网络 UI 合并 PR。
基本上每个发送到暂存区的 PR 都与 "Squash and merge" 合并。 从 staging 到 master 的 PR 以同样的方式合并。
通过使用 "Merge commit" 而不是 "Squash and merge",暂存中的每个提交也会出现在 master 中(而不是使用 squash 的单个提交)。
所以,现在为了保持历史干净,我们正在执行从功能分支到暂存的 "Squash and merge",同时我们正在执行从暂存到主分支的 "Merge commit"。
希望这对其他人有帮助。