关于git:如何在GitHub上删除提交?

How can I remove a commit on GitHub?

我"不小心"向Github提交了一个承诺。

是否可以删除此提交?

我想还原我的Github存储库,就像这次提交之前一样。


Note: please see alternative to git rebase -i in the comments below—

git reset --soft HEAD^

首先,删除本地存储库上的提交。您可以使用git rebase -i来完成此操作。例如,如果这是最后一次提交,您可以执行git rebase -i HEAD~2,并删除弹出的编辑器窗口中的第二行。

然后,使用git push origin +branchName --force强制推到github

请参阅Git Magic第5章:历史教训-然后参阅一些了解更多信息(例如,如果您希望删除较旧的提交)。

哦,如果你的工作树很脏,你必须先做一个git stash,然后再做一个git stash apply


1
git push -f origin HEAD^:master

这将"撤销"推。


如果只是一个错误(可能是你分叉了一个回购,然后最终推到了原来的而不是一个新的),那么这是另一种可能性:

1
git reset --hard 71c27777543ccfcb0376dcdd8f6777df055ef479

显然,将该数字替换为要返回的提交数。

此后的所有内容将在您再次按下时被删除。为此,下一步将是:

1
git push --force


  • 埃多克斯1〔13〕要找出要还原的提交

  • 埃多克斯1〔9〕而7F6D03是错误推送提交之前的提交。+用于force push

  • 就这样。

    这里有一个很好的指南,可以轻松简单地解决您的问题!


    如果要保留删除后的提交更改:

    请注意,如果要删除的提交是最后一个提交的提交,则此解决方案可以工作。

    1-从日志中复制要返回的提交引用:

    1
    git log

    2-将git重置为提交引用:

    1
     git reset <commit_ref>

    3-将错误提交的本地更改存储到远程后再使用:

    1
     git stash

    4-将更改推送到远程存储库,(-f或--force):

    1
    git push -f

    5-将存储的更改返回到本地存储库:

    1
    git stash apply

    7-如果更改中有未跟踪/新文件,则在提交之前需要将其添加到Git中:

    1
    git add .

    6-添加您需要的任何额外更改,然后提交所需的文件(或使用点"."而不是声明每个文件名),以提交本地存储库中的所有文件:

    1
    git commit -m"<new_commit_message>" <file1> <file2> ...

    1
    git commit -m"<new_commit_message>" .


    您需要清除缓存才能将其完全清除。Git的帮助页面将帮助您解决问题。(它帮助了我)http://help.github.com/remove-sensitive-data/


    使用git revert恢复推送。

    git-revert - Revert some existing commits

    1
    2
    3
    4
    git revert [--edit | --no-edit] [-n] [-m parent-number] [-s] <commit>...
    git revert --continue
    git revert --quit
    git revert --abort

    还原相关修补程序引入的更改,并记录记录这些更改的一些新提交。这要求您的工作树是干净的(没有来自head commit的修改)。


    1
    2
    1. git reset HEAD^ --hard
    2. git push origin -f

    这对我有用。


    要从远程存储库中删除提交,请执行以下操作:

    1
     git push -f origin last_known_good_commit:branch_name

    要从本地存储库中删除提交,请执行以下操作:

    1
    git reset --hard HEAD~1

    链接


    删除最近的提交,保留您所做的工作:

    1
    git reset --soft HEAD~1

    删除最近的提交,销毁您所做的工作:

    1
    git reset --hard HEAD~1


    您需要从要恢复到的提交中知道提交哈希。您可以从Github URL获取它,如:https://github.com/your-organization/your-project/commits/master

    假设commit的散列(您要返回到的地方)是"99FB454"(长版本"99FB45413EB9CA4B3063E07B40402B136A8CF264"),那么您所要做的就是:

    1
    2
    git reset --hard 99fb45413eb9ca4b3063e07b40402b136a8cf264
    git push --force


    在Github上找到要成为分支机构负责人的提交的参考规范,并使用以下命令:

    埃多克斯1〔8〕

    在您的情况下,如果您只想返回一个提交,请找到该提交的引用的开头,例如它是7F6D03,并且要更改的分支的名称,例如它是master,并执行以下操作:

    埃多克斯1〔9〕

    加号被解释为--force,这是必要的,因为您正在重写历史。

    请注意,任何时候只要你承诺,你都可能改写其他民族合并你的分支的历史。但是,如果你很快发现了问题(在其他人合并你的分支之前),你就不会有任何问题。


    如果您这样做是因为在提交中有敏感的数据,那么使用这里的其他答案是不安全的(Subutux除外,我将进一步讨论)。

    上面的Github指南建议使用外部工具,但我更喜欢使用内置工具。

    首先,备份存储库。然后:

    1
    2
    3
    git filter-branch --force --index-filter \
    'git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' \
    --prune-empty --tag-name-filter cat -- --all

    在此之后,请确保存储库处于所需的状态。您可能希望与备份进行比较。

    如果您确定它是正确的,那么:

    1
    2
    3
    #get rid of old unreferenced commits (including the data you want to remove)
    git gc --prune=now
    git push origin --force --all

    您可能需要保留本地备份一段时间,以防万一。


    在终端上运行这个命令。

    1
    git reset HEAD~n

    您可以从本地回购中删除最后n个提交,例如head~2。继续对您的存储库执行强制git push。

    1
    git push -f origin <branch>

    希望这有帮助!


    为了保持分支和合并结构,在执行REBASE时使用--preserve-merges选项非常重要:

    1
    git rebase --preserve-merges -i HEAD^^


    首先将本地更改保存在一侧的某个位置(备份)

    您可以浏览最近的提交,然后通过单击选择提交哈希"复制完整的sha"按钮将其发送到剪贴板。

    如果最后一个提交哈希是,那么假设g0834hg304gh3084gh(例如)

    你必须跑:

    埃多克斯1〔12〕

    使用之前复制的散列值使其成为"head"修订。

    添加所需的本地更改。完成;)


    对于Github

    • 重置本地存储库中的提交(硬)
    • 创建新分支
    • 推送新的
    • 删除旧分支(如果要删除主分支,则将新分支作为默认分支)

    如果要删除do interactive rebase,

    git rebase -i HEAD~4

    4 represents total number of commits to display count your commit and作相应更改

    并从列表中删除您想要的提交…

    按ctrl+x(ubuntu)或:wq(centos)保存更改

    第二种方法,做还原,

    1
    git revert 29f4a2 #your commit ID

    这将还原特定的提交


    在Github桌面中,您只需右键单击提交并将其还原,这将创建一个新的提交来撤消更改。

    意外提交仍将在您的历史记录中(例如,如果您意外提交了API密钥或密码,这可能是一个问题),但代码将被还原。

    这是最简单和最容易的选择,接受的答案更全面。


    添加/删除文件以获得所需的内容:

    1
    2
    git rm classdir
    git add sourcedir

    然后修改承诺:

    1
    git commit --amend

    前面的错误提交将被编辑以反映新的索引状态——换句话说,它将像您从未犯过错误一样。

    请注意,只有在还没有推的情况下才应该这样做。如果你已经推了,那么你只需要正常地提交一个修复。


    重写历史不太好。如果我们使用git revert ,它将创建上述提交ID的干净的反向提交。

    这样,历史就不会被改写,相反,每个人都知道历史已经被改写了。