Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 如何从远程分支永久删除少量提交_Git - Fatal编程技术网

Git 如何从远程分支永久删除少量提交

Git 如何从远程分支永久删除少量提交,git,Git,我知道这是对历史的改写,这很糟糕 但是如何从远程分支永久删除少量提交?您可以使用git reset--hard本地分支删除工作树和索引中的更改,然后使用git push--force将修改后的本地分支推送到远程分支。(,涉及删除远程分支并重新推送) 这说明了这种命令的危险性,尤其是当人们依赖远程历史记录进行本地回购时。 您需要准备好向手册页的部分指出人员 使用Git 2.23(2019年8月,九年后),您将使用新命令。 即: (用要删除的提交数替换n) 这将恢复索引和工作树,就像git res

我知道这是对历史的改写,这很糟糕

但是如何从远程分支永久删除少量提交?

您可以使用git reset--hard本地分支删除工作树和索引中的更改,然后使用git push--force将修改后的本地分支推送到远程分支。(,涉及删除远程分支并重新推送)

这说明了这种命令的危险性,尤其是当人们依赖远程历史记录进行本地回购时。
您需要准备好向手册页的部分指出人员


使用Git 2.23(2019年8月,九年后),您将使用新命令。
即:
(用要删除的提交数替换
n

这将恢复索引和工作树,就像git reset--hard一样。
委员会:


重要提示:确保您在“gitpush-f”上指定了哪些分支,否则您可能会无意中修改其他分支![*] 中显示了三个选项。如果链接中断,我将把主要步骤留在这里

  • 恢复完全提交
  • 删除最后一次提交
  • 从列表中删除提交
  • 1还原完全提交

    git revert dd61ab23
    
    git push <<remote>> +dd61ab23^:<<BRANCH_NAME_HERE>>
    
    git rebase -i dd61ab23^
    
    2删除最后一次提交

    git revert dd61ab23
    
    git push <<remote>> +dd61ab23^:<<BRANCH_NAME_HERE>>
    
    git rebase -i dd61ab23^
    
    这将打开显示所有提交列表的编辑器。删除要删除的一个。完成再基准,并用力进行回购

    git rebase --continue
    git push <remote_repo> <remote_branch> -f
    
    git-rebase——继续
    git-push-f
    
    这可能太少太晚了,但对我有帮助的是听起来很酷的“核”选项。基本上,使用命令
    filter branch
    可以在整个git历史中删除大量文件或更改某些内容


    这是最好的解释。

    从pctroll的答案简化,同样基于此


    有时,解决此问题的最简单方法是从您知道代码良好的地方创建一个新分支。然后,您可以将错误的分支历史记录放在一边,以防以后需要从中挑选其他提交。这还可以确保不会丢失任何提交历史记录

    从您当地的流浪分支机构:

    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
    

    轻拍自己。

    请注意,在恢复非工作提交时,使用
    最后一个工作提交id

    git reset --hard <last_working_commit_id>
    

    例如,如果要删除最后一次提交,请运行以下命令从本地分支的文件系统(工作树)和提交历史记录(索引)中删除更改:

    git reset --hard HEAD~3
    
    然后(在本地计算机上)运行以下命令以强制远程分支重写其历史记录:

    git push --force
    
    恭喜你!全部完成

    一些注意事项:

    您可以通过运行

    git log
    
    然后您可以将
    头~N
    替换为
    ,如下所示:

    git reset --hard <desired-commit-id>
    
    git重置——硬
    
    如果您想保留对文件系统的更改,只需修改索引(提交历史记录),请使用
    --soft
    标志,如
    git reset--soft HEAD~3
    。然后,您有机会检查您的最新更改,并保留或删除所有或部分更改。在后一种情况下,runnig
    git status
    显示自
    以来更改的文件。如果使用
    --hard
    选项,
    git status
    将告诉您本地分支与远程分支完全相同。如果不使用
    --hard
    --soft
    ,则使用默认模式,即
    --mixed
    。在此模式下,
    git help reset
    显示:

    重置索引,但不重置工作树(即,更改的文件 保留但未标记为提交)并报告尚未提交的内容 更新


    奇怪。感觉我已经试过了。再加上一些重定基调,效果很好。谢谢。@Arnis:那太好了;)<代码>推-力away@MoshFeuTrue:
    git gc
    在远程端运行的频率并不总是足够高。例如,在GitHub上:@VonC您能否从您的回答中澄清:新命令是否更好或达到相同的最终结果?(你提到旧命令有一些危险!)@Nikhil新命令更好:阅读和,对于分离的头部。在这里,它确实实现了相同的结果,只是使用了更显式的参数。是的,yada yada真的很糟糕,但出于某种原因,我需要喜欢它。我知道这很愚蠢,但有时会发生一些糟糕的事情——比如测试登录和在代码中使用纯文本密码,这是真正的登录凭据。哎呀…真正的登录凭证。。是的,这让我想起了一些whoposi,我已经厌倦了学术界关于这有多危险,怎么不应该这样做的言论。有时候,从git历史中删除一些东西并处理其他开发人员的冲突/中断要好得多。就这么简单。忽视这一点的人可能从来没有在课堂环境中工作过。“粉碎”的大部分时间是那些“聪明”的人不考虑所有可能的情况,缺乏观点,因为他们重复一些事情而不考虑他们根本不考虑的可能的情况。有时必须打破规则。这让我想起了Grammanazis,还来得及。可能对有类似问题的漫游者有用:)请确保指定“git push-f”上的分支,否则可能会无意中修改其他分支!只有步骤1和步骤2完成了工作并回答了原始问题。(不要运行步骤3)这些是针对不同场景的选项,而不是要采取的步骤。在我的例子中,交互
    git push --force
    
    git log
    
    git reset --hard <desired-commit-id>