首页 > 解决方案 > git:清理 git 历史记录并仅在 master 中保留合并的提交

问题描述

在我们的 git repo 中,我们有一个压缩合并所有提交的策略。最近有一个策略更新,一些更改与他们的本地提交详细信息合并到 master 中。有没有办法可以重写历史记录以仅保留合并的提交并删除所有本地提交。

例如,当前历史看起来像

图1

但我想将其转换为

图2

我尝试rebase -i -p HEAD~3并只选择了合并的提交。我压缩/修复了所有其他本地提交,但它失败了。

提前致谢。

标签: gitrebasegit-rewrite-history

解决方案


在问题开始之前创建一个新分支(“添加测试文件”),然后挑选麻烦的合并提交到它上面,指定-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并重命名newmainmain. 我也将删除它们brbr2当我合并它们时忘记删除它们:

% 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

这正是你所要求的。


(警告:我们刚刚改写了历史。为了将其推送到远程,我们将不得不使用武力,并且必须提前警告所有合作者,以便他们准备好扔掉现有的本地人,然后重新克隆.)


推荐阅读