git - 如何将分支与部分重新设置并强制推送的 master 合并?
问题描述
最初,我需要从master恢复一些提交,包括合并的 pull request。我们称之为“不需要的重构”。
但这些变化在未来是需要的。
我根据master的当前状态创建了一个新的分支开发,以便在那里进行这些更改。
我决定将master硬重置为 pull request 合并的父提交(它是 repo 的稳定状态):
git reset --hard ad23b887
然后,选择其他不是“不需要的重构”的提交:
git cherry-pick
现在我想做一个强制推送命令,它应该覆盖原始/主分支历史。
将来,当它经过 100% 测试时,我需要将“不需要的重构”从开发中合并回master 。但是,如果事实上它们有不同的历史(因为樱桃挑选和重置 HEAD),我应该如何合并这两个分支?
通过重置 HEAD 并只挑选我在我的情况下需要的那些,这是恢复提交的正确方法吗?
Ps 我的团队由两个人组成,我认为进行此类操作没有任何问题。
解决方案
让我们形象化它。
最初,我需要从 master 恢复一些提交,包括合并的 pull request ......
A - B - C --------- M [master]
\ /
F - G - H - I
我根据 master 的当前状态创建了一个新的分支开发,以便在那里进行这些更改。
[develop]
A - B - C --------- M [master]
\ /
F - G - H - I
我决定将 master 硬重置为 pull request 合并的父提交(它是 repo 的稳定状态):
git reset --hard ad23b887
假设 ad23b887 是提交 B。
A - B [master]
|\
| C ----------- M [develop]
\ /
F - G - H - I
那是同一张图,只是稍微移动了一点,以便我们可以与 master 一起工作。
然后,选择其他不是“不需要的重构”的提交:
git cherry-pick
假设这是 G 和 I。
A - B - G1 - I1 [master]
|\
| C ----------- M [develop]
\ /
F - G - H - I
现在我想做一个强制推送命令,它应该覆盖原始/主分支历史。
是的,但使用git push --force-with-lease
. 它更安全。我把它别名为repush。
将来,当它经过 100% 测试时,我需要将“不需要的重构”从开发中合并回 master。但是,如果事实上它们有不同的历史(因为樱桃挑选和重置 HEAD),我应该如何合并这两个分支?
Rebase 在 master 之上开发。这将在 master 之上重放开发者的提交。合并将消失。你挑选的现在多余的提交也将如此,因为现在开发已经从 master 那里获得了这些更改。
A - B - G1 - I1 [master]
|\
| C ----------- M [develop]
\ /
F - G - H - I
$ git checkout develop
$ git rebase master
A - B - G1 - I1 [master]
\
C - F - H [develop]
现在您可以通过正常的 PR 流程合并开发。
A - B - G1 - I1 -------- M1 [master]
\ /
C - F - H
通过重置 HEAD 并只挑选我在我的情况下需要的那些,这是恢复提交的正确方法吗?
让我们回到你采摘樱桃之前。
避免像开发这样的通用分支。给它一个与你正在做的事情相关的名字。一个不错的选择是在问题跟踪器中使用 ID,这会鼓励每个分支都有问题。
A - B [master]
|\
| C ----------- M [issue/#1234]
\ /
F - G - H - I
我建议永远不要直接提交 master ,而是始终使用功能分支。这样可以确保每个更改都经过审查、QA 等 PR 流程。这意味着 master 始终可以稳定地工作。
为此,创建一个新分支,仅用于合并樱桃精选。
$ git checkout -b issue/#abcd
$ git cherry-pick G I
G1 - I1 [issue/#abcd]
/
A - B [master]
|\
| C ----------- M [issue/#1234]
\ /
F - G - H - I
他们通过正常的 PR 流程将其合并。
G1 - I1
/ \
A - B ------- N [master]
|\
| C ----------- M [issue/#1234]
\ /
F - G - H - I
现在在 master 之上 rebase issue/#1234。
G1 - I1
/ \
A - B ------- N [master]
\
C - F - H [issue/#1234]
并通过正常的 PR 流程合并 issue/#1234。
G1 - I1
/ \
A - B ------- N --------- M1 [master]
\ /
C - F - H
历史上的那些颠簸被称为“功能泡沫”,它们就是你想看到的。它们有助于保持历史简单易懂,掌握稳定。
推荐阅读
- laravel - Laravel 路由冲突
- java - Java:使用带有 HTTP GET 的可选请求参数匹配 ArrayList 中的项目时遇到问题
- javascript - 具有固定标题和第一列的水平和垂直滚动
- laravel - 在视图文件中显示存储在公用文件夹之外的图像 - Laravel
- javascript - X-editable - Chrome 更新后 select2 不工作
- java - 如何在数据库中插入分数符号,如 ¼、½ 等
- elasticsearch - Loopback4 连接到 Elasticsearch
- tfs - TFS:如何再次/多次将相同的变更集合并到目标分支
- python - 使用从相机捕获的参考图像检测相机移动或旋转
- javascript - 有条件地在动态 HTML 表单上显示字段的问题