我目前只使用rebase
,例如
git rebase -i origin/master
这给我带来了我的文本编辑器,然后我用s
手动标记所有提交,除了第一次提交。
是否可以自动执行此操作,而无需编辑文本文件?
答案 0 :(得分:2)
假设你在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
已提升)。我们必须更多地了解您的实际分支拓扑,以便在这种情况下提供更好的建议......
答案 1 :(得分:1)
如果您只想要一个共享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')
这可能是一种更好的方法来获得不会涉及到awk管道的HEAD树,但这应该可以正常工作。