git push:推送除最后一个提交以外的所有提交

104

有没有一种方法可以将我本地的所有提交推送到远程存储库,除了最近的一个提交?如果需要修改,我想在本地保留最后一个提交。

有没有一种方法可以将我本地的所有提交推送到远程存储库,除了最近的一个提交?如果需要修改,我想在本地保留最后一个提交。

3个回答

128

尝试以下操作(假设您正在使用 master 分支且您的远程仓库名为 origin):

git push origin HEAD^:master

HEAD^指向当前分支上最后一次提交之前的提交记录(最后一次提交可以用HEAD表示),所以这个命令将此提交(包括所有之前的提交)推送到远程的origin/master分支。

如果您感兴趣,可以在这个页面中了解更多关于指定修订版本的信息。

更新:虽然我认为这种情况不太可能发生,但是如果您的最后一次提交是合并提交,在使用该命令时需要小心。对于合并提交的HEADHEAD^指的是该提交的第一个父提交,HEAD^2则指的是该提交的第二个父提交,以此类推。


2
如果你在Windows上,一定要将^用两个引起来,否则你会把所有东西都推送出去:git push origin HEAD^^:master - Ferruccio
2
我得到了 zsh: no matches found: HEAD^:master。如果你使用 zsh(或启用了 EXTENDED_GLOB),你需要转义插入符号:\^ - Cody
如果我想将当前分支推送到设置的远程,我需要提及我的本地分支和远程吗?还是只需使用 git push HEAD^ 命令即可? - Herr Derb

52

一种更普遍的方法是通过指定提交哈希来推送到特定的提交。

git push <remote> <commit hash>:<branch>
例如,如果您有这些提交:
111111 <-- 第一次提交
222222
333333
444444
555555
666666 <-- 最后一次提交

git push origin 555555:master

这会将除了您最后一次提交以外的所有提交推送到您的远程master分支,并且...

git push origin 333333:myOtherBranch  

将包括提交 333333 在内的提交推送到远程分支 myOtherBranch


错误:您提供的目标不是完整的引用名称(即以“refs /”开头)。我们尝试猜测您的意思。 - Kasra

15

另一个可能性是

git reset --soft HEAD^

撤消您最近的提交并将更改移至暂存区。然后您可以

git push

它只会推送剩余的提交。这样,在推送之前,您可以通过git log查看将要被推送的内容。


6
如果你撤销(或删除)最新的未推送提交,你将失去该提交的提交信息。 - Konrad Morawski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接