我目前只使用rebase,例如。
rebase
git rebase -i origin/master
这给我带来了我的文本编辑器,然后我手动用s标记除了第一次提交之外的所有提交。是否可以自动完成此操作,而无需编辑文本文件?
s
7fhtutme1#
假设你在master(本地的)上,并且它比origin/master领先一些提交,你可以这样做:
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自创建侧分支以来已经前进)。在这种情况下,我们必须更多地了解您的实际分支拓扑,以便给予更好的建议...
git merge-base mybranch origin/master
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,但这应该工作得很好。
git reset $(git commit-tree HEAD^{tree} -p origin/master -m 'Squash')
2条答案
按热度按时间7fhtutme1#
假设你在
master
(本地的)上,并且它比origin/master
领先一些提交,你可以这样做:现在,
master
分支在origin/master
之前有一个提交,这是压缩所有以前提交的结果。如果你在一个分支上,这个过程将是类似的,除了上面的步骤2和3将引用该分支而不是
master
。然而,结果可能与预期的不太一样,这取决于git merge-base mybranch origin/master
相对于origin/master
的位置(即如果origin/master
自创建侧分支以来已经前进)。在这种情况下,我们必须更多地了解您的实际分支拓扑,以便给予更好的建议...0md85ypi2#
如果你只是想要一个共享HEAD树的新提交,使用git commit-tree。也就是说,如果您当前的历史记录如下所示:
你想要
其中E'和E具有相同的内容(这里,B将是origin/master),只需执行:
可能有一种更好的方法来获得HEAD的树,它不涉及到管道到awk,但这应该工作得很好。
感谢@Guildenstern,现代git允许你做: