如何压扁后提交git?

这给出了压扁多个提交的一个很好的解释:

http://git-scm.com/book/en/Git-Branching-Rebasing

但它不适用于已经被推送的提交。 如何在我的本地和远程回购中压缩最近的几个提交?

编辑:当我做git rebase -i origin/master~4 master ,保留第一个pick ,将其他三个设置为squash ,然后退出(通过emacs中的cx cc),我得到:

 $ git rebase -i origin/master~4 master # Not currently on any branch. nothing to commit (working directory clean) Could not apply 2f40e2c... Revert "issue 4427: bpf device permission change option added" $ git rebase -i origin/master~4 master Interactive rebase already started 

其中2f40是提交提交。 而现在,4个提交中没有一个出现在git log 。 我希望我的编辑器重新启动,以便我可以input提交信息。 我究竟做错了什么?

南瓜在当地承诺

 git rebase -i origin/master~4 master 

然后用力推

 git push origin +master 

--force+之间的区别

git push的文档:

请注意,– --force适用于所有被推送的ref,因此在push.default设置为matching使用它,或者使用configuration了remote.*.push多个推送目的地remote.*.push可以覆盖除当前分支以外的ref(包括本地ref严格落后于对方)。 要强制推送到一个分支,使用refspec前面的+推(例如git push origin +master强制推送到master分支)。

在一个分支上,我能够这样做(最后4次提交)

 git checkout my_branch git reset --soft HEAD~4 git commit git push --force origin my_branch 

只有创build一个branch来处理和处理master才能避免许多问题:

git checkout -b mybranch

以下工作已经推送remote提交和remote推送提交/仅local提交的混合:

 # example merging 4 commits git checkout mybranch git rebase -i mybranch~4 mybranch # at the interactive screen # choose fixup for commit: 2 / 3 / 4 git push -u origin +mybranch 

我也有一些拉请求笔记 ,这可能是有帮助的。

git rebase -i master

你会得到编辑器虚拟打开和消息这样的事情

 Pick 2994283490 commit msg1 f 7994283490 commit msg2 f 4654283490 commit msg3 f 5694283490 commit msg4 #Some message # #some more 

在这里,我已经改变了所有其他提交到“f”(代表fixup)。

git push -f origin feature/feature-branch-name-xyz

这将修复所有提交到一个提交,并将删除所有其他提交。 我做到了这一点,它帮助了我。

Interesting Posts