git 自动压缩未推送的提交

zpqajqem  于 2023-05-12  发布在  Git
关注(0)|答案(2)|浏览(201)

我目前只使用rebase,例如。

git rebase -i origin/master

这给我带来了我的文本编辑器,然后我手动用s标记除了第一次提交之外的所有提交。
是否可以自动完成此操作,而无需编辑文本文件?

7fhtutme

7fhtutme1#

假设你在master(本地的)上,并且它比origin/master领先一些提交,你可以这样做:

git checkout -b tempbranch origin/master
git merge --squash master
git checkout master
git reset --hard tempbranch
git branch -D tempbranch

现在,master分支在origin/master之前有一个提交,这是压缩所有以前提交的结果。
如果你在一个分支上,这个过程将是类似的,除了上面的步骤2和3将引用该分支而不是master。然而,结果可能与预期的不太一样,这取决于git merge-base mybranch origin/master相对于origin/master的位置(即如果origin/master自创建侧分支以来已经前进)。在这种情况下,我们必须更多地了解您的实际分支拓扑,以便给予更好的建议...

0md85ypi

0md85ypi2#

如果你只是想要一个共享HEAD树的新提交,使用git commit-tree。也就是说,如果您当前的历史记录如下所示:

A-B-C-D-E

你想要

A-B-E'

其中E'和E具有相同的内容(这里,B将是origin/master),只需执行:

git reset $( git commit-tree $(git cat-file -p HEAD | 
    awk '/tree/{print $2}') -p origin/master -m 'Squash')

可能有一种更好的方法来获得HEAD的树,它不涉及到管道到awk,但这应该工作得很好。

  • 编辑--
    感谢@Guildenstern,现代git允许你做:
git reset $(git commit-tree HEAD^{tree} -p origin/master -m 'Squash')

相关问题