重写 git 历史记录以将合并提交转换为压缩的独立提交

问题描述 投票:0回答:1

我一直在尝试线性化我的 git 历史记录以删除合并提交并用提交替换它们,就像在创建它们时使用

git merge --squash
一样。

我已经尝试过:

git checkout main
git log --reverse | grep "^commit " > /tmp/commits
git checkout <the oldest commit>
git checkout -b new_main
cat /tmp/commits | tail -n +2 | sed "s/commit //g" | while read commit; do git checkout --force $commit -- . > /dev/null && git commit -a --reuse-message=$commit > /dev/null   ; done

但是,

git checkout --force $commit -- .
适用于所有文件,但不会在本地删除在
$commit
中删除的文件,所以最后,我得到了一个结果
new_main
,其中包含所有文件,甚至是一路上删除的文件,以及重命名文件的两个版本。

关于我可以使用什么来代替

git checkout --force $commit -- .
来检查另一个提交的整个状态,而不仅仅是添加/修改的所有文件,有什么建议吗?

git merge checkout squash
1个回答
0
投票

根据 LeGEC 的评论,我设法解决了这个问题:

cat /tmp/commits | tail -n +2 | sed "s/commit //g" | while read commit; do echo $commit && git read-tree $commit > /dev/null && git commit --reuse-message=$commit > /dev/null && git checkout -- . > /dev/null && git clean -f -d > /dev/null && echo "  $(git rev-parse HEAD)" > /dev/null ; done

所以,

git read-tree
就是我一直在寻找的,谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.