git - git:清理 git 历史记录并仅在 master 中保留合并的提交
问题描述
在我们的 git repo 中,我们有一个压缩合并所有提交的策略。最近有一个策略更新,一些更改与他们的本地提交详细信息合并到 master 中。有没有办法可以重写历史记录以仅保留合并的提交并删除所有本地提交。
例如,当前历史看起来像
但我想将其转换为
我尝试rebase -i -p HEAD~3
并只选择了合并的提交。我压缩/修复了所有其他本地提交,但它失败了。
提前致谢。
解决方案
在问题开始之前创建一个新分支(“添加测试文件”),然后挑选麻烦的合并提交到它上面,指定-m 1
. 精心挑选的提交将是正常的提交,因此您最终会得到您所追求的简单直接历史。
我会示范。在这里,我们的情况与您的情况非常相似:
* 11ef397 (HEAD -> main) Merge branch 'br2'
|\
| * 4d41b17 (br2) f
| * 0486755 e
* | 1283b7e Merge branch 'br'
|\ \
| |/
|/|
| * 85df598 (br) d
| * c7a4077 c
* | 5e70afb b
|/
* 47258d5 a
现在我将从以下位置开始创建一个新分支b
:
% git switch -c newmain 5e70afb
樱桃精选来了:
% git cherry-pick -m 1 1283b7e
% git cherry-pick -m 1 11ef397
就这样。该newmain
分支包含您想要的历史记录。
为了完整起见,让我们抹去我们的足迹。我们将删除原来的main
并重命名newmain
为main
. 我也将删除它们br
,br2
当我合并它们时忘记删除它们:
% git branch -D main
% git branch -M main
% git branch -D br
% git branch -D br2
所以这就是剩下的;没有其他提交:
* 339747e (HEAD -> main) Merge branch 'br2'
* 530f9d2 Merge branch 'br'
* 5e70afb b
* 47258d5 a
这正是你所要求的。
(警告:我们刚刚改写了历史。为了将其推送到远程,我们将不得不使用武力,并且必须提前警告所有合作者,以便他们准备好扔掉现有的本地人,然后重新克隆.)
推荐阅读
- ios - UIRequiredDeviceCapabilities 互联网连接
- java - 首先,如果条件不能正常工作
- python-3.x - (Python 3)数据集分类,使用用户输入 Elo,建议基于国际象棋数据集的开局?
- c - 如何在汇编中实现 memmove,而不仅仅是 memcpy?
- java - 我无法映射此 SQLite 查询的结果。在java中可以做到这一点吗?
- python - scipy.stats rankdata:错误“rankdata()得到了一个意外的关键字参数'axis'”
- r - 我想将每个类别的计数百分比作为标签添加到我的 ggplot 饼图
- python - 在 Python 中强制转换构造函数
- javascript - blazor 中未定义的函数
- c# - 尝试更改集合中的元素