代码之家  ›  专栏  ›  技术社区  ›  Peter Mortensen

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

  •  19138
  • Peter Mortensen  · 技术社区  · 6 年前

    提交了错误的文件 Git ,但尚未将提交推送到服务器。

    我怎么能 从本地存储库中撤消这些提交 ?

    唯一的方法似乎是在某种GUI文本编辑器中复制编辑,然后擦除整个本地克隆,然后重新克隆存储库,然后重新应用编辑。然而

    • 这可能会导致数据丢失。
    • 如果只是一次意外事故,那么很难做到这一点 git commit 他是跑的。

    77 回复  |  直到 3 年前
        1
  •  25419
  •   Mark Amery    4 年前

    撤消提交&重做

    $ git commit -m "Something terribly misguided" # (0: Your Accident)
    $ git reset HEAD~                              # (1)
    [ edit files as necessary ]                    # (2)
    $ git add .                                    # (3)
    $ git commit -c ORIG_HEAD                      # (4)
    
    1. 该命令负责 打开 您需要再次添加它们,然后才能再次提交它们)。

    2. 对工作树文件进行更正。

    3. git add 您希望在新提交中包含的任何内容。

    4. 提交更改,重用旧的提交消息。 reset 把旧头像复制到 .git/ORIG_HEAD commit 具有 -c ORIG_HEAD 将打开一个编辑器,该编辑器最初包含来自旧提交的日志消息,并允许您对其进行编辑。如果不需要编辑邮件,可以使用 -C 选项

    或者,编辑上一次提交(或仅编辑其提交消息) , commit --amend

    ,用文字改写历史 git push origin master --force 这是必要的。


    进一步阅读

    How can I move HEAD back to a previous location? (Detached head) & Undo commits

    上面的答案会告诉你 git reflog ,可用于确定要还原到的提交的SHA-1。获得此值后,请使用上述命令序列。


    HEAD~ HEAD~1 . 文章 What is the HEAD in git? 如果要取消提交多个提交,则此选项非常有用。

        2
  •  11563
  •   Ryan Lundy    3 年前

    备选案文1: git reset --hard

    假设你有这个,其中C是你的头,(F)是你文件的状态。

       (F)
    A-B-C
        ↑
      master
    

    你想 . 您可以这样做:

    git reset --hard HEAD~1
    

    结果是:

     (F)
    A-B
      ↑
    master
    

    现在B是头。因为你曾经 --hard

    git reset

    撤消提交,但保留更改 在进行更好的提交之前,先进行一点编辑。再次从这里开始,以C为头部:

    --硬的 :

    git reset HEAD~1
    

    在这种情况下,结果是:

       (F)
    A-B-C
      ↑
    master
    

    在这两种情况下,HEAD只是指向最新提交的指针。当你做一个 git reset HEAD~1 --硬的 git status 显示您签入C的更改。您没有丢失任何内容!

    git reset --soft

    为了获得最轻的触感,您甚至可以 index :

    git reset --soft HEAD~1
    

    这不仅使您的文件处于孤立状态,甚至还使您的 单独地当你这样做的时候 git状态 ,您将看到索引中的文件与以前相同。事实上,在这个命令之后,你可以 git commit

    选项4:你做到了 git重置——硬 我需要把代码拿回来

    假设你破坏了一个承诺 ? 真倒霉,对吧?

    不,没有 git reflog 您将看到(部分)提交的列表 shas (也就是散列)你已经搬进来了。找到您销毁的提交,然后执行以下操作:

    git checkout -b someNewBranchName shaYouDestroyed
    

    你现在已经复活了。在Git中,提交在大约90天内不会被破坏,所以您通常可以返回并援救一个您不想摆脱的提交。

        3
  •  2395
  •   Community CDub    4 年前

    有两种方法可以“撤消”上次提交,具体取决于您是否已将提交公开(推送到远程存储库):

    如何撤消本地提交

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

    git log
        commit 101: bad commit    # Latest commit. This would be called 'HEAD'.
        commit 100: good commit   # Second to last commit. This is the one we want.
    

    reset 之前的承诺 HEAD :

    git reset --soft HEAD^     # Use --soft if you want to keep your changes
    git reset --hard HEAD^     # Use --hard if you don't care about keeping the changes you made
    

    现在 git log

    如何撤消公共提交

    git revert HEAD
    

    git commit -m 'restoring the file I removed by accident'
    git log
        commit 102: restoring the file I removed by accident
        commit 101: removing a file we don't need
        commit 100: adding a file that we need
    

    有关更多信息,请查看 Git Basics - Undoing Things .

        4
  •  1836
  •   Vikrant Mayank    8 年前

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

    git rm classdir
    git add sourcedir
    

    然后修改提交:

    git commit --amend
    

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

        5
  •  1128
  •   dippas    7 年前
    git rm yourfiles/*.class
    git commit -a -m "deleted all class files in folder 'yourfiles'"
    

    git reset --hard HEAD~1
    

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

    这个 hard reset HEAD-1

        6
  •  858
  •   Zoe - Save the data dump 张群峰    3 年前

    替换索引中的文件:

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

    那么,如果是私人分支机构,

    git commit --amend
    

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

    git commit -m 'Replace .class files with .java files'
    

    更改以前的提交 ,使用真棒 interactive rebase .)


    ProTip:添加 *.class gitignore


    恢复提交

    reset .

    您可以使用以下方法将Git重置为任何提交:

    git reset @~N
    

    哪里 N 是之前的提交数 HEAD @~ 重置为上一次提交。

    您可以使用以下方法代替修改提交:

    git reset @~
    git add *.java
    git commit -m "Add .java files"
    

    退房 git help reset --soft --mixed --hard ,以便更好地了解它的作用。

    重新记录

    $ git reset @~
    $ git reflog
    c4f708b HEAD@{0}: reset: moving to @~
    2c52489 HEAD@{1}: commit: added some .class files
    $ git reset 2c52489
    ... and you're back where you started
    

        7
  •  761
  •   Peter Mortensen icecrime    5 年前

    使用 git revert <commit-id> .

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

        8
  •  613
  •   riQQ dtb    4 年前

    git reset --hard HEAD^1
    

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

    git reset --soft HEAD^1
    

    现在,您提交的文件进入暂存区域。假设由于需要编辑一些错误的内容,因此要对文件进行后台处理,请执行以下命令

    git reset HEAD
    

    现在提交的文件将从暂存区域进入未暂存区域。现在文件可以编辑了,所以无论您做了什么更改,您都希望进行编辑并添加它,然后进行新的/新的提交。

    More (link broken) ( Archived version

        9
  •  563
  •   Peter Mortensen icecrime    5 年前

    如果你有 Git Extras git undo 撤消最近的提交。 git undo 3 将撤消最后三次提交。

        10
  •  525
  •   Peter Mortensen icecrime    5 年前

    我想撤销共享存储库中最近的五次提交。我查找了要回滚到的修订id。然后我输入了以下内容。

    prompt> git reset --hard 5a7404742c85
    HEAD is now at 5a74047 Added one more page to catalogue
    prompt> git push origin master --force
    Total 0 (delta 0), reused 0 (delta 0)
    remote: bb/acl: neoneye is allowed. accepted payload.
    To git@bitbucket.org:thecompany/prometheus.git
     + 09a6480...5a74047 master -> master (forced update)
    prompt>
    
        11
  •  499
  •   Peter Mortensen icecrime    6 年前

    我更喜欢使用 git rebase -i 感觉不错 .

    选择要列出的提交数量,然后像这样调用(以登记最后三个)

    git rebase -i HEAD~3
    

    pick aa28ba7 Sanity check for RtmpSrv port
    pick c26c541 RtmpSrv version option
    pick 58d6909 Better URL decoding support
    

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

        12
  •  470
  •   Mac    6 年前

    如何修复以前的本地提交

    git commit --amend . 从GUI中,您可以从提交中添加或删除单个文件。您还可以修改提交消息。

    只需将分支重置到以前的位置(例如,使用 gitk git rebase git reset HEAD~1

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

    表演 reverse cherry pick ( git-revert )撤消更改。

    git revert --no-edit HEAD
    

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

    提交历史记录将分别显示两次提交


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

    git push --delete (branch_name) ## remove public version of branch
    

    在本地清理您的分支机构,然后重新出售。。。

    git push origin (branch_name)
    

    squash-merge

        13
  •  385
  •   poorva    4 年前

    如果您想永久撤消它,并且已经克隆了某个存储库。

    git log 
    

    然后你可以像这样做:

    git reset --hard <commit_id>
    
    git push origin <branch_name> -f
    
        14
  •  380
  •   Chris Forever    10 年前

    git reset --soft HEAD~1
    

    是“头前提交”的缩写。或者,您可以参考 SHA-1 如果要重置为,则为哈希的。 --柔软的 选项将删除提交,但它将保留所有更改的文件“要提交的更改”,正如git status所说的那样。

    --硬的

    如果你已经推了,有人拉了,这通常是我的情况,你不能使用 . 但是你可以做一个 git还原 ,

    git revert HEAD
    

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

        15
  •  322
  •   Varun Parakh    9 年前

    在…上 SourceTree

    git revert
    

    或:

    git reset --soft HEAD^ # Use --soft if you want to keep your changes.
    git reset --hard HEAD^ # Use --hard if you don't care about keeping your changes.
    
        16
  •  301
  •   Manish Shrivastava    10 年前

    单个命令:

    git reset --soft 'HEAD^' 
    

    撤销最后一次本地提交非常有效!

        17
  •  282
  •   Alireza    7 年前

    git :

    git reset --soft HEAD~1
    

    git reset 是的,基本上 reset 任何你想回去的承诺,如果你把它和 --soft HEAD 是分支机构的负责人,如果您与 ~1 HEAD^ ),它将只返回一个您想要的提交。。。

    How to undo the last commits in Git?

        18
  •  261
  •   Ranjithkumar Ravi    8 年前

    如何撤消上次Git提交?

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

    1. 如果您不想保留所做的更改:

      git reset --hard HEAD^
      
    2. git reset --soft HEAD^
      

    现在检查您的git日志。这将表明我们的最后一次提交已被删除。

        19
  •  219
  •   Mr. Smith    5 年前

    “将工作树重置为上次提交”

    git reset --hard HEAD^ 
    

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

    git clean    
    

    看- Git Quick Reference

    注: 此命令将删除您以前的提交,请小心使用! git reset --hard 这样更安全。

        20
  •  208
  •   Shubham Chaudhary    11 年前

    git reflog
    

    reflog before 复位前重新记录

    选择正确的reflog(在我的例子中是f3cb6e2)并键入

    git reset --hard f3cb6e2
    

    reset effect

    最后,reflog如下图所示

    reflog after 复赛决赛

        21
  •  183
  •   U. Ali    9 年前

    首次运行:

    git reflog
    

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

    然后做:

    git reset --hard ActionIdFromRefLog
    
        22
  •  173
  •   Jon Dukes-Schlossberg    7 年前

    撤消上次提交:

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

    这将撤消最后一次提交。

    在这里 --soft 意味着重设为暂存。

    HEAD~ HEAD^ 意思是移动到头部之前提交。


    将上次提交替换为新提交:

    git commit --amend -m "message"
    

        23
  •  170
  •   CommaToast    9 年前

    另一种方式:

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

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

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

        24
  •  159
  •   Peter Mortensen    9 年前

    git log 并找到最后一个提交哈希代码,然后输入:

    git reset <the previous co>
    
        25
  •  154
  •   egridasov    9 年前

    git reset --soft HEAD^
    git rm --cached [files you do not need]
    git add [files you need]
    git commit -c ORIG_HEAD
    

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

        26
  •  149
  •   matt snider    9 年前

    git reset --soft HEAD~ 
    
        27
  •  138
  •   dseminara    9 年前

    您还没有推送提交

    如果问题是您提交了额外的文件(并且您不希望这些文件出现在存储库中),您可以使用 git rm 然后与 --amend

    git rm <pathToFile>
    

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

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

    删除文件后,可以使用提交 --修正 选项

    git commit --amend -C HEAD # the -C option is to use the same commit message
    

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

    您已经推送了提交

    git push -f 未推荐的

    --修正 (记住这个about-amend`:该选项重写上次提交时的历史记录)。

        28
  •  137
  •   geoom    10 年前

    git reset --soft HEAD~1
    

    或者,如果您不记得它在哪个commit中,您可以使用

    git rm --cached <file>
    

    对于推式提交

    git filter-branch . 就是,

    git filter-branch --index-filter 'git rm --cached <file>' HEAD
    

    但我建议你小心使用这个命令。阅读更多 git-filter-branch(1) Manual Page .

        29
  •  136
  •   thestar    8 年前

    要重置为上一版本,请永久删除所有未提交的更改:

    git reset --hard HEAD~1
    
        30
  •  136
  •   amd    8 年前

    用什么,, reset --soft reset --hard ?

    我只是为@Kyralessa的回答加了两分钱:

    如果你不确定该用什么,那就去找吧 --soft s

    --hard 失去 如果你愿意 --柔软的 如果你犯了错误,你也会得到同样的结果 --硬的

    git reset HEAD file.html
    git checkout -- file.html
    

    完整示例

    echo "some changes..." > file.html
    git add file.html
    git commit -m "wrong commit"
    
    # I need to reset
    git reset --hard HEAD~1 (cancel changes)
    # OR
    git reset --soft HEAD~1 # Back to staging
    git reset HEAD file.html # back to working directory
    git checkout -- file.html # cancel changes
    

    学分归@Kyralessa所有。