我知道那是对历史的重写,是坏的矢田矢田。
但是,如何从远程分支中永久删除少量提交呢?
我知道那是对历史的重写,是坏的矢田矢田。
但是,如何从远程分支中永久删除少量提交呢?
Answers:
您是git reset --hard
您的本地分支,以便从工作树和索引中删除更改,并且您是git push --force
将修改后的本地分支扩展到远程站点。(这里的其他解决方案,包括删除远程分支,然后重新按它)
这样的回答说明了执行此命令的危险,尤其是当人们依靠远程历史记录获取自己的本地存储库时。
您需要准备向人们指出手册页的“ 从UPSTREAM REBASE恢复”部分git rebase
在Git 2.23(2019年8月,九年后)中,您将使用新命令git switch
。
即:(
替换git switch -C mybranch origin/mybranch~n
n
要删除的提交数)
那样可以恢复索引和工作树git reset --hard
。
push --force
离开
git gc
并非总是在远程运行足够频繁。例如在GitHub:twitter.com/githubhelp/status/387926738161774592?
请注意last_working_commit_id
,在还原无效的提交时,请使用,
git reset --hard <last_working_commit_id>
因此,我们绝不能重置为 commit_id
我们不想要的。
然后确定,我们必须推送到远程分支:
git push --force
git reset --hard
应该执行的操作。
本教程显示了三个选项。万一链接断开,我将在此处保留主要步骤。
1恢复完整的提交
git revert dd61ab23
2删除最后一次提交
git push <<remote>> +dd61ab23^:<<BRANCH_NAME_HERE>>
或者,如果该分支机构在本地可用
git reset HEAD^ --hard
git push <<remote>> -f
其中+ dd61 ...是您的提交哈希,而git则将x ^解释为x的父级,而+则解释为强制的非fastforwared推送。
3从列表中删除提交
git rebase -i dd61ab23^
这将打开并显示所有提交列表的编辑器。删除您想要摆脱的那一个。完成变基并推动回购。
git rebase --continue
git push <remote_repo> <remote_branch> -f
例如,如果要删除最后的3
提交,请运行以下命令以从文件系统(工作树)和本地分支上的提交历史记录(索引)中删除更改:
git reset --hard HEAD~3
然后(在本地计算机上)运行以下命令来强制远程分支重写其历史记录:
git push --force
恭喜你!全做完了!
一些注意事项:
您可以通过运行来检索所需的提交ID
git log
然后你就可以代替HEAD~N
使用<desired-commit-id>
这样的:
git reset --hard <desired-commit-id>
如果要保留文件系统上的更改并仅修改索引(提交历史记录),请使用--soft
标记,例如git reset --soft HEAD~3
。然后,您将有机会检查您的最新更改并保留或删除全部或部分更改。在后一种情况下,runnig git status
显示自以来更改的文件<desired-commit-id>
。如果使用--hard
option,git status
则会告诉您本地分支与远程分支完全相同。如果您不使用--hard
也不--soft
使用,则使用默认模式--mixed
。在这种模式下,git help reset
说:
重置索引,但不重置工作树(即,已更改的文件将保留,但未标记为提交),并报告尚未更新的内容。
这可能太少了,为时已晚,但是帮助我的是听起来很酷的“核”选项。基本上使用命令filter-branch
您可以在整个git历史记录中删除文件或对大量文件进行更改。
最好在这里解释。
同样基于此博客帖子,简化了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 log
复制您希望分支位于的提交哈希并退出git日志
git checkout theHashYouJustCopied
git checkout -b your_new_awesome_branch
现在,您将按照自己的方式创建一个新分支。
如果您还需要从新分支上不在错误分支上保留特定提交,则可以只选择您需要的特定提交:
git checkout the_errant_branch
git log
复制您需要拉入good分支并退出git日志的一次提交的提交哈希。
git checkout your_new_awesome_branch
git cherry-pick theHashYouJustCopied
轻拍自己的背部。