当前位置 : 首页 » 互动问答 » 正文

如何撤消Git中最近的提交?

分类 : 互动问答 | 发布时间 : 2009-05-30 02:09:14 | 评论 : 30 | 浏览 : 6982150 | 喜欢 : 18225

我不小心将错误的文件提交到Git,但我还没有将提交推送到服务器。

如何撤消来自本地存储库的提交?

回答(30)

  • 1楼
  • 撤消提交并重做

     $ git commit -m“非常误导”#(1)
    $ git reset HEAD~#(2)
    <<必要时编辑文件>>#(3)
    $ git add ...#(4)
    $ git commit -c ORIG_HEAD#(5)
    
    1. 这是您要撤消的内容
    2. 这会使您的工作树(磁盘上文件的状态)保持不变但撤消提交并保留您未提交的更改(因此它们将显示为“未更改的更改”对于提交“in git status,你需要在提交之前再次添加它们”。如果您only want to add对上一次提交的更多更改,或更改提交消息1,则可以使用 git reset --soft HEAD~ ,这类似于 git reset HEAD~ (where HEAD~HEAD~1相同),但会暂时保留现有更改。
    3. 对工作树文件进行更正。
    4. git add要包含在新提交中的任何内容。
    5. 提交更改,重用旧的提交消息。 reset将旧头部复制到 .git / ORIG_HEAD ; commit with -c ORIG_HEAD 将打开一个编辑器,该编辑器最初包含来自旧提交的日志消息,并允许您编辑它。如果您不需要编辑消息,可以使用-C option.

    请注意,如果您已对索引添加了任何新更改,则使用 commit --amend 将添加它们是你之前的提交。

    如果代码已经被推送到你的服务器并且你有权覆盖历史记录(rebase)那么:

     git push origin master --force
    

    您还可以查看以下答案:

    如何将HEAD移回以前的位置? (分离头)

    上面的答案将显示git reflog,用于找出你想要恢复的SHA-1是什么。一旦找到了要撤消的点,就可以使用上面解释的命令序列。


    1但是,请注意,如果你在<notranslate中犯了一个错误,则不需要重置为先前的提交>。更简单的选择是 git commit --amend(以便更新您之后所做的任何更改)然后git reset,这将打开预先填充了最后一次提交消息的默认提交消息编辑器。 git commit --amend提交消息

  • 2楼
  • 如果你不知道如何工作,撤销提交有点可怕。但是如果你理解的话,实际上非常容易。

    说你有这个,其中C是你的HEAD而(F)是你文件的状态。

    (F)
    A-B-C
        ↑
      主
    

    你想 nuke commit C,再也见不到了。你这样做:

     git reset --hard HEAD~1
    

    结果是:

    (F)
    A-B
      ↑
    主
    

    现在B是HEAD。因为您使用了--hard,所以您的文件将重置为它们在提交B时的状态。

    啊,但假设提交C不是灾难,而只是有点关闭。在进行更好的提交之前,您希望撤消提交但保留你的更改进行一些编辑。从这里开始,用C作为你的HEAD:

    (F)
    A-B-C
        ↑
      主
    

    你可以这样做,不用--hard:

     git reset HEAD~1
    

    在这种情况下,结果是:

    (F)
    A-B-C
      ↑
    主
    

    在这两种情况下,HEAD只是指向最新提交的指针。当你执行 git reset HEAD~1 时,你告诉Git将HEAD指针移回一次提交。但是(除非您使用--hard),您可以保留文件。所以现在git status显示你已经检查过C的变化。你没有丢失任何东西!

    对于最轻的触摸,你甚至可以撤消你的提交但是留下你的文件和你的index:

     git reset --soft HEAD~1
    

    这不仅会使您的文件单独存在,甚至会单独留下您的index。当您执行git status时,您将看到索引中的文件与之前一样。实际上,在这个命令之后,您可以执行git commit并且您将重做您刚刚进行的相同提交。

    还有一件事:假设你销毁了一个提交,如第一个示例中所示,,但后来发现你需要它?好运,对吧?

    Nope,还有still一种方法来取回它。输入git reflog,你会看到你已经移动的(部分)提交sha的列表。找到你销毁的提交,并执行以下操作:

     git checkout -b someNewBranchName shaYouDestroyed
    

    你现在已经复活了那个提交。提交实际上并没有在Git中被摧毁大约90天,所以你通常可以回去拯救一个你并不想要摆脱的东西。

  • 3楼
  • 这花了我一段时间来弄明白,所以这可能会帮助别人......

    根据你是否已经公开提交你的提醒,你可以通过两种方式“撤消”你的上一次提交(推送到你的远程)存储库):

    如何撤消本地提交

    假设我在本地提交,但现在想要删除该提交。

     git log
        commit 101:bad commit#latest commit,这将被称为'HEAD'
        commit 100:good commit#second to last commit,这是我们想要的
    

    要将所有内容恢复到上一次提交之前的状态,我们需要在reset git reset之前HEAD:

    到提交--soft HEAD ^ #use --soft如果你想保留你的更改
    git reset --hard HEAD ^ #use --hard如果你不关心你做的改变
    

    Now git log将显示我们的上一次提交已被删除。

    如何撤消公共提交

    如果您已将提交公开,则需要创建一个新的提交,它将“还原”您的更改在你之前的提交中做出的(当前的HEAD)。

     git revert HEAD
    

    您的更改现在将被还原并准备好您提交:

     git commit -m'恢复我意外删除的文件'
    git日志
        提交102:恢复我意外删除的文件
        commit 101:删除我们不需要的文件
        commit 100:添加我们需要的文件
    

    有关详细信息,请查看 Git Basics - 撤消事物

  • 4楼
  • 添加/删除文件以获得您想要的方式:

     git rm classdir
    git add sourcedir
    

    然后修改commit:

     git commit --amend
    

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

    注意你应该只在你避风港时这样做还没推。如果你已推,那么你只需要正常提交修复。

  • 5楼
  • git rm yourfiles / * .class
    git commit -a -m“删除文件夹'yourfiles'中的所有类文件”
    

    or

     git reset --hard HEAD~1
    

    警告:上述命令将永久删除对您要提交的.java文件(以及任何其他文件)的修改。

    The hard reset to HEAD-1会在您错误提交之前将工作副本设置为提交状态。

  • 6楼
  • 更改上次提交

    替换索引中的文件:

     git rm --cached * .class
    git add * .java
    

    然后,如果它是私有分支,amend提交:

     git commit --amend
    

    或者,如果它是共享分支,则进行新的提交:

     git commit -m'用.java文件替换.class文件'
    


    (更改先前的commit ,使用awesome 交互式rebase )


    ProTip™:添加*.class to a gitignore以再次停止此操作。


    还原提交

    修改提交是理想的解决方案,如果您需要更改最后一次提交,但更通用的解决方案是reset.

    您可以将git重置为任何提交:

     git reset @~N
    

    Where NHEAD, and @~重置前一次提交之前的提交次数。

    因此,您可以使用:

     git reset @~而不是修改提交。
    git add * .java
    git commit -m“添加.java文件”
    

    Check out git help reset ,特别是--soft --mixed and --hard上的部分,以便更好地理解它的作用。

    Reflog

    如果你陷入困境,你总是可以使用reflog来查找丢弃的提交:

     $ git reset @~
    $ git reflog
    c4f708b HEAD @ {0}:重置:移动到@~
    2c52489 HEAD @ {1}:commit:添加了一些.class文件
    $ git reset 2c52489
    ......你回到了起步的地方


  • 7楼
  • Use git revert commit-id

    要获取提交ID,只需使用git log

  • 8楼
  • 如果您计划完全撤消本地提交,无论您在提交时做了什么更改,如果您对此没有任何担心,只需执行以下命令。

     git reset --hard HEAD ^ 1
    

    (此命令将忽略您的整个提交,您的更改将完全从本地工作树中丢失)。如果要撤消提交,但希望在暂存区域中进行更改(在提交之前,就像在git add之后),请执行以下命令。

     git reset --soft HEAD ^ 1
    

    现在您提交的文件进入临时区域。假设您想要更新文件,因为您需要编辑一些错误的内容,请执行以下命令

     git reset HEAD
    

    现在提交的文件从暂存区域进入未分区区域。现在文件已经可以编辑了,所以无论你做什么改变,你都要编辑并添加它并进行新的/新的提交。

    More

  • 9楼
  • 如果安装了Git Extras,则可以运行git undo来撤消最新提交。 git undo 3将撤消最后3次提交。

  • 10楼
  • 我想在我们的共享存储库中撤消最新的5次提交。我查找了想要回滚的修订版ID。然后我键入以下内容。

     prompt> git reset --hard 5a7404742c85
    HEAD现在在5a74047增加了一页到目录
    提示> git push origin master --force
    总计0(delta 0),重用0(delta 0)
    remote:bb / acl:neoneye是允许的。接受有效载荷
    致git@bitbucket.org:thecompany / prometheus.git
     + 09a6480 ... 5a74047主 - >主(强制更新)
    提示>
  • 11楼
  • 我更喜欢使用 git rebase -i 来完成这项工作,因为会弹出一个很好的列表,我可以选择要删除的提交。它可能不像其他答案一样直接,但它只是感觉正确.

    选择要列出的提交数量,然后像这样调用(以登记最后三个)< notranslate> git rebase -i HEAD~3

    样本列表

    选择aa28ba7对RtmpSrv端口进行完整性检查 选择c26c541 RtmpSrv版本选项 选择58d6909更好的URL解码支持

    然后git将删除您删除的任何行的提交。

    Then git will remove commits for any line that you remove.

  • 12楼
  • 如何修复先前的本地提交

    使用git-gui(或类似的)来执行 git commit --amend 。从GUI中,您可以从提交中添加或删除单个文件。您还可以修改提交消息。

    如何撤消先前的本地提交

    只需将分支重置为上一个位置(例如,使用gitk or git rebase)。然后从保存的副本中重新应用更改。在本地存储库中进行垃圾收集之后,就像从未发生过意外提交一样。要在单个命令中执行所有操作,请使用 git reset HEAD~1 .

    警告字: 不小心使用git reset是将工作副本置于混乱状态的好方法。我建议Git新手尽可能避免这种情况。

    如何撤消公共提交

    Perform a 反向樱桃选择 (git-revert以撤消更改。

    如果你还没有将其他更改提取到你的分支,你可以简单地做...

     git revert --no-edit HEAD
    

    然后将更新的分支推送到共享存储库。

    提交历史记录将显示两个提交,单独.


    高级:更正公共存储库中的private分支

    这可能很危险 - 确保你有一个分支的本地副本来进行抢占。

    另请注意:如果其他人可能正在分支机构工作,你不想这样做。

     git push --delete(branch_name)## remove public分支的版本
    

    在本地清理你的分支然后重新...

     git push origin(branch_name)
    

    在正常情况下,您可能不必担心您的私有分支提交历史是原始的。只需推送一个后续提交(参见上面的“如何撤消公共提交”),然后执行 squash-merge隐藏历史记录。

  • 13楼
  • 如果你已经犯了垃圾而没有被推,那么

     git reset --soft HEAD~1
    

    HEAD~1是head之前提交的简写。或者,如果要重置为,则可以参考散列的SHA-1--soft选项将删除提交,但它将保留所有已更改的文件“要提交的更改”,因为git status会将其设置为。

    如果您想要删除工作树中跟踪文件的任何更改在头部使用之前的提交“--hard" instead.

    OR

    如果你已经推了并且有人拉了,这通常是我的情况,你不能使用git reset。但你可以做git revert,

     git revert HEAD
    

    这将创建一个新的提交,以反转意外提交引入的所有内容。

  • 14楼
  • 如果你想永久撤消它并且你克隆了一些存储库

    git log 
    

    可以看到提交id然后你可以做 -

     git reset --hard <commit_id>
    
    git push origin <branch_name> -f
  • 15楼
  • On SourceTree(GitHub的GUI),您可以右键单击提交并执行“反向提交”。这应该撤消您的更改。

    在终端上:

    您也可以使用:

    git revert
    

    Or:

     git reset --soft HEAD ^#使用--soft如果您想保留更改。
    git reset --hard HEAD ^#使用--hard如果你不关心保持你的更改。
  • 16楼
  • 单个命令:

     git reset --soft'HEAD ^'
    

    撤消上一次本地提交非常有用!

  • 17楼
  • 只需使用git:

     git reset --soft HEAD~1重置它,执行以下命令
    

    Explain: what git reset的确如此,它基本上是reset到你想要回复的任何提交,然后如果你将它与--soft键结合起来,它会返回,但保留你文件中的更改,所以你回到刚刚添加文件的阶段,HEAD是分支的头部,如果你与~1结合(在这种情况下你也使用HEAD^),它将只返回一个提交你想要什么...

    我在下面的图片中为你创建了更多细节,包括在实际情况下可能发生的所有步骤并提交代码:

    How to undo the last commits in Git?

  • 18楼
  • 如何撤消上次Git提交?

    要将所有内容恢复到上次提交之前的状态,我们需要在HEAD之前重置为提交。

    1. 如果您不想保留更改,你做了:

       git reset --hard HEAD ^
      
    2. 如果您想保留更改:

       git reset --soft HEAD ^
      

    现在检查你的git日志。它将显示我们的上一次提交已被删除。

  • 19楼
  • 使用reflog查找正确的状态

    git reflog
    

    reflog before REFLOG BEFORE RESET

    选择正确的reflog(在我的情况下为f3cb6e2)并输入

     git reset --hard f3cb6e2
    

    之后,repo HEAD将重置为该HEADid reset effect 重置后的LOG

    最后,reflog如下图所示

    reflog after REFLOG FINAL

  • 20楼
  • “将工作树重置为最后一次提交”

     git reset --hard HEAD ^
    

    “从工作树中清除未知文件”

    git clean    
    

    see - Git快速参考

    NOTE:此命令将删除您之前的提交,因此请谨慎使用! git reset --hard is safer –

  • 21楼
  • First run:

    git reflog
    

    它将显示您在存储库中执行的所有可能操作,例如,提交,合并,拉取等。

    Then do:

     git reset --hard ActionIdFromRefLog
  • 22楼
  • 另一种方法:

    签出要恢复的分支,然后将本地工作副本重置回您希望成为远程服务器上最新版本的提交(之后的所有内容将再次发生)。为此,在SourceTree中,我右键单击并选择“将BRANCHNAME重置为此提交”。

    然后导航到存储库的本地目录并运行以下命令:

     git -c diff.mnemonicprefix = false -c core.quotepath = false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME
    

    这将删除本地存储库中当前提交之后的所有提交,但仅删除该一个分支。

  • 23楼
  • 撤消上次提交:

    git reset --soft HEAD ^ or git reset --soft HEAD~

    这将撤消上次提交。

    Here --soft表示重置为暂存。

    HEAD~ or HEAD^表示移动提交在HEAD之前。


    将最后一次提交替换为新提交:

     git commit --amend -m“message”
    

    它将用新提交替换最后一次提交。

  • 24楼
  • Type git log然后输入:

     git reset <上一个co>
  • 25楼
  • 在我的情况下,我不小心提交了一些我不想要的文件。所以我做了以下工作:

     git reset --soft HEAD ^
    git rm --cached [你不需要的文件]
    git add [你需要的文件]
    git commit -c ORIG_HEAD
    

    使用gitk或git log --stat验证结果

  • 26楼
  • Use SourceTree(Git的图形工具)来查看你的提交和树。您可以通过右键单击直接手动重置它。

  • 27楼
  • 有两个主要场景

    你还没有推送提交

    如果问题是你提交的额外文件(并且你不想要那些存储库),你可以使用git rm删除它们然后提交使用--amend

     git rm <pathToFile>
    

    您还可以使用-r删除整个目录,或者甚至与其他Bash commands

     git rm -r <pathToDirectory>结合使用
    git rm $(find -name'* .class')
    

    删除文件后,您可以使用--amend option

     git commit --amend -C HEAD#提交-C选项是使用相同的提交消息
    

    这将重写您最近的本地提交删除额外的文件,因此,这些文件永远不会在推送时发送,也将被GC从本地.git存储库中删除。

    您已经推送了提交

    您可以应用其他方案的相同解决方案,然后执行git push with the -f选项,但它是不推荐,因为它会用不同的更改覆盖远程历史记录(它可能会弄乱您的存储库)。

    相反,你必须在没有--amend的情况下进行提交(请记住这个关于-amend`:该选项会重写最后一次提交的历史记录)。

  • 28楼
  • 有很多方法可以做到这一点:

    Git命令撤消上次提交/之前的提交:

    Warning:如果您不知道自己在做什么,请不要使用--hard。 --hard也是dangerous,它可能删除你的文件。

    在Git中恢复提交的基本命令是:

     $ git reset --hard <COMMIT -ID>
    

    or

     $ git reset --hard HEAD~ <n>
    

    COMMIT-ID:提交

    n:的ID是您要还原的最后提交数

    您可以获取提交ID,如下所示:

     $ ** git log --oneline **
    
    d81d3f1函数减去两个数字
    
    be20eb8函数添加两个数字
    
    bedgfgg函数多为两个数字
    

    where d81d3f1 and be20eb8是提交ID。

    现在让我们看一些情况:

    假设你想恢复最后一次提交'd81d3f1'。这里有两个选项:

     $ git reset --hard d81d3f1
    

    or

     $ git reset --hard HEAD~1
    

    假设您要还原提交'be20eb8':

     $ git reset --hard be20eb8
    

    有关更多详细信息,您可以参考并尝试其他一些命令,以便将头重置为指定状态:

     $ git reset --help
  • 29楼
  • 很简单,在命令行中运行:

     git reset --soft HEAD~
  • 30楼
  • 要重置为先前的修订版,请永久删除所有未提交的更改:

     git reset --hard HEAD~1

相关阅读:

Why should I use core.autocrlf=true in Git?

Force "git push" to overwrite remote files

Update Git branches from master

Undo a Git merge that hasn't been pushed yet

How can I delete a file from git repo?

Git fetch remote branch

How do you clone a Git repository into a specific folder?

Reset or revert a specific file to a specific revision using Git?

View the change history of a file using Git versioning

Difference between "git add -A" and "git add ."