我知道这是在改写历史,很糟糕。
但是如何从远程分支永久删除少数提交?
我知道这是在改写历史,很糟糕。
但是如何从远程分支永久删除少数提交?
当前回答
只需要注意在恢复一个无效提交时使用last_working_commit_id
git reset --hard <last_working_commit_id>
所以我们不能重置为我们不想要的commit_id。
然后当然,我们必须推到远程分支:
git push --force
其他回答
这可能是太少也太迟了,但帮助我的是听起来很酷的“核”选项。基本上,使用命令filter-branch,你可以在整个git历史记录中删除文件或更改大量文件。
这里最好解释一下。
git reset --soft commit_id
git stash save "message"
git reset --hard commit_id
git stash apply stash stash@{0}
git push --force
有时,修复这个问题最简单的方法是从您知道代码良好的地方创建一个新的分支。然后,您可以不去管错误的分支历史记录,以防稍后需要从中挑选其他提交。这也确保您不会丢失任何提交历史记录。
来自你当地的错误分支:
git log
复制你想要分支所在的提交哈希并退出git日志
git checkout theHashYouJustCopied
git checkout -b your_new_awesome_branch
现在你有了一个你想要的新分支。
如果你还需要从错误的分支中保留一个特定的提交,而它不在你的新分支上,你可以选择你需要的特定提交:
git checkout the_errant_branch
git log
复制你需要拉入好的分支的提交哈希并退出git日志。
git checkout your_new_awesome_branch
git cherry-pick theHashYouJustCopied
拍拍自己的背。
只需要注意在恢复一个无效提交时使用last_working_commit_id
git reset --hard <last_working_commit_id>
所以我们不能重置为我们不想要的commit_id。
然后当然,我们必须推到远程分支:
git push --force
你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>