git - 压缩包含 merge 提交的前几十个 git 提交

标签 git git-merge git-rebase git-squash git-rerere

我有一个具有 root R 的现有存储库,然后是几十次提交,包括多次 merge ,最多 X ,然后线性历史直到 Y 。我想粉碎 R 中的所有内容至X进入单个提交并强制推送它。我怎样才能做到这一点而不需要花费大量精力重新解决 merge ?

或者,这个问题可以表述为从 R 更改根提交。至X并切断X之前的图表.

这是简化提交图的图示:

R           ---- I want to squash from here...
|
A
|\
B C
| |
D E
| |\
F G H
| |/
I J
|\ \
K L M
|/  |
N  /
|/
O 
|
X           ---- to here.
|
P
|
Q
|
Y

使用常规 rebase 来压缩所有内容将需要重新解析多个 merge 提交。我知道 git rerere,但我不知道如何在这种情况下使用它。提交所有这些时,它并未启用。

最佳答案

这可以通过 rebase 来完成,但手动完成要容易得多

git checkout --orphan temp X
# now you are on a brand new branch with no history, and your working tree is just like X
git commit -m "Single shot"
# now let's carry over X up to Y
git cherry-pick X..Y

如果您喜欢这个结果,请将您的分支放在这里并从此过上幸福的生活。

更新: 如果 D 之后的历史很复杂,最好为最后一步运行 rebase :

git rebase --rebase-merges X Y --onto temp

如果该历史记录很复杂并且包含有冲突的 merge ,我可以提供此脚本来处理最后一步,以避免必须重做有冲突的 merge :

https://github.com/eantoranz/git-replay

关于git - 压缩包含 merge 提交的前几十个 git 提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75457384/

相关文章:

git - 告诉 git 不要 merge 二进制文件而是选择

git - Android Studio 项目的 .gitignore 中应该包含什么?

python - Django项目中.gitignore文件应该放什么类型的文件

git - 在 merge.renameLimit 警告加上冲突后撤消 git merge

Git 工作流程 - 从发布分支恢复功能分支

git - 如何回滚(重置)单个文件上 git 中提交的更改

Git - 使用rebase将公共(public)分支 merge 到master

git - 如何中断git rebase?

windows - 在 Windows 上为 Bitbucket 设置 SSH key

git - 在 Visual Studio 中使用 github - 从上游 master 更新 fork