我知道这是在改写历史,很糟糕。
但是如何从远程分支永久删除少数提交?
我知道这是在改写历史,很糟糕。
但是如何从远程分支永久删除少数提交?
当前回答
重要提示:确保你在“git push -f”上指定了哪些分支,否则你可能会无意中修改其他分支!(*)
本教程中显示了三个选项。以防链接中断,我将把主要步骤留在这里。
恢复完整的提交 删除最后一次提交 从列表中删除提交
1恢复完整提交
git revert dd61ab23
2删除上次提交
git push <<remote>> +dd61ab23^:<<BRANCH_NAME_HERE>>
或者,如果分支在本地可用
git reset HEAD^ --hard
git push <<remote>> -f
在+ dd61…是你的提交哈希,git将x^解释为x的父节点,+解释为强制的非快进推。
3从列表中删除提交
git rebase -i dd61ab23^
这将打开一个编辑器,显示所有提交的列表。删除你想要删除的那个。完成rebase和推力回购。
git rebase --continue
git push <remote_repo> <remote_branch> -f
其他回答
只需要注意在恢复一个无效提交时使用last_working_commit_id
git reset --hard <last_working_commit_id>
所以我们不能重置为我们不想要的commit_id。
然后当然,我们必须推到远程分支:
git push --force
从pctroll的答案简化,类似的基于这篇博客文章。
# look up the commit id in git log or on github, e.g. 42480f3, then do
git checkout master
git checkout your_branch
git revert 42480f3
# a text editor will open, close it with ctrl+x (editor dependent)
git push origin your_branch
# or replace origin with your remote
你git reset -hard你的本地分支从工作树和索引中删除更改,你git push -force(或git push -force-with-lease)你修改后的本地分支到远程。 (这里的其他解决方案,涉及删除远程分支,并重新推送它)
这个SO回答说明了这样一个命令的危险,特别是如果人们依赖于远程历史记录进行自己的本地回购。 你需要准备好向人们指出git REBASE手册页的recovery FROM UPSTREAM REBASE部分。
另外,正如ringo在评论中指出的那样,如果远程分支被保护不受强制推送的影响,那么git恢复(如本回答中所示)可能更可取。
对于Git 2.23(2019年8月,9年后),您将使用新的命令Git switch。 即:git switch -C mybranch origin/mybranch~n (将n替换为要删除的提交数)
这将恢复索引和工作树,就像git重置一样——很难。 文档补充道:
- c <分公司> ——force-create <分公司> 类似于——create,除了如果<new-branch>已经存在,它将被重置为<起点>。 这是一个方便的快捷方式: $ git分支-f <新建分支> $ git switch <new-branch>
我喜欢用rebase来做这个。 下面的n是最后的n次提交。如果你想删除第三个,用3替换n。
git rebase -i HEAD~n
然后,在清单中找到所需的提交,并将其从“pick”更改为“drop”。退出rebase并使用git push和“-f”选项,就像你刚刚做了一个rebase一样。
重要提示:确保你在“git push -f”上指定了哪些分支,否则你可能会无意中修改其他分支!(*)
本教程中显示了三个选项。以防链接中断,我将把主要步骤留在这里。
恢复完整的提交 删除最后一次提交 从列表中删除提交
1恢复完整提交
git revert dd61ab23
2删除上次提交
git push <<remote>> +dd61ab23^:<<BRANCH_NAME_HERE>>
或者,如果分支在本地可用
git reset HEAD^ --hard
git push <<remote>> -f
在+ dd61…是你的提交哈希,git将x^解释为x的父节点,+解释为强制的非快进推。
3从列表中删除提交
git rebase -i dd61ab23^
这将打开一个编辑器,显示所有提交的列表。删除你想要删除的那个。完成rebase和推力回购。
git rebase --continue
git push <remote_repo> <remote_branch> -f