How do I undo the most recent local commits in Git?
我不小心把错误的文件提交给了Git,但是我还没有将提交推送到服务器上。
如何从本地存储库撤消这些提交?
撤消提交和重做
1 2 3 4 5 | $ git commit -m"Something terribly misguided" # (1) $ git reset HEAD~ # (2) << edit files as necessary >> # (3) $ git add ... # (4) $ git commit -c ORIG_HEAD # (5) |
但是要注意,如果您对索引添加了任何新的更改,那么使用
如果代码已推送到服务器上,并且您有覆盖历史记录(重新设置)的权限,则:
1 | git push origin master --force |
你也可以看看这个答案:
如何将头部移回以前的位置?(分离头)
上面的答案将向您显示
但是,请注意,如果您在提交消息中犯了错误,则不需要重置为早期提交。更简单的选择是
如果你不知道怎么做的话,撤销承诺有点可怕。但如果你真的明白了,那就太容易了。
假设你有这个,其中c是你的头,(f)是你文件的状态。
1 2 3 4 | (F) A-B-C ↑ master |
你想用核武器攻击C,却再也见不到它了。你这样做:
1 | git reset --hard HEAD~1 |
结果是:
1 2 3 4 | (F) A-B ↑ master |
现在B是头部。因为您使用了
啊,但假设commit c不是一场灾难,只是有一点不好。您希望撤消提交,但在执行更好的提交之前,请保留更改进行一些编辑。从这里重新开始,用C作为你的头:
1 2 3 4 | (F) A-B-C ↑ master |
你可以这样做,省去了
1 | git reset HEAD~1 |
在这种情况下,结果是:
1 2 3 4 | (F) A-B-C ↑ master |
在这两种情况下,head只是指向最新提交的指针。当您执行
最轻的一点是,您甚至可以撤消提交,但保留文件和索引:
1 | git reset --soft HEAD~1 |
这不仅使您的文件单独存在,甚至使您的索引单独存在。当您执行
还有一件事:假设您像在第一个示例中那样破坏了一个提交,但后来发现您毕竟需要它?运气不好,对吧?
不,还是有办法把它弄回来的。键入
1 | git checkout -b someNewBranchName shaYouDestroyed |
你现在恢复了承诺。承诺实际上不会在Git中被破坏大约90天,所以你通常可以回去救一个你不想摆脱的人。
我花了一段时间才弄明白,所以也许这能帮助某人…
根据您是否已将提交公开(推送到远程存储库),有两种方法可以"撤消"上次提交:
如何撤消本地提交假设我在本地提交,但现在想删除该提交。
1 2 3 | 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 |
为了使一切恢复到上次提交之前的状态,我们需要将
1 2 | 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 |
现在,
如果您已经公开了提交,您将希望创建一个新的提交,它将"还原"您在以前提交中所做的更改(当前头)。
1 | git revert HEAD |
您的更改现在将被还原并准备好提交:
1 2 3 4 5 | 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基础-撤销操作
添加/删除文件以获得所需的内容:
1 2 | git rm classdir git add sourcedir |
然后修改承诺:
1 | git commit --amend |
前面的错误提交将被编辑以反映新的索引状态——换句话说,它将像您从未犯过错误一样。
请注意,只有在还没有推的情况下才应该这样做。如果你已经推了,那么你只需要正常地提交一个修复。
1 2 | git rm yourfiles/*.class git commit -a -m"deleted all class files in folder 'yourfiles'" |
或
1 | git reset --hard HEAD~1 |
警告:上述命令将永久删除您想要提交的对
更改上一次提交
替换索引中的文件:
1 2 | git rm --cached *.class git add *.java |
然后,如果它是一个私有分支,修改提交:
1 | git commit --amend |
或者,如果它是一个共享分支,则进行新的提交:
1 | git commit -m 'Replace .class files with .java files' |
(要更改以前的提交,请使用令人敬畏的交互式钢筋网)
提示?:将
如果需要更改最后一个提交,那么修改提交是理想的解决方案,但更通用的解决方案是
您可以使用以下方法将Git重置为任何提交:
1 | git reset @~N |
其中,
因此,您可以使用:
1 2 3 | git reset @~ git add *.java git commit -m"Add .java files" |
查看
如果您搞砸了,您可以始终使用reflog查找已删除的提交:
1 2 3 4 5 6 | $ 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 |
使用
要获取提交ID,只需使用
如果您计划完全撤消本地提交,无论您在提交时做了什么更改,如果您不担心这一点,只需执行以下命令。
1 | git reset --hard HEAD^1 |
(此命令将忽略整个提交,您的更改将完全从本地工作树中丢失)。如果您想撤消提交,但是想要在临时区域中进行更改(在提交之前,就像在
1 | git reset --soft HEAD^1 |
现在,您提交的文件进入临时区域。假设您想将文件放在后期,因为您需要编辑一些错误的内容,那么请执行以下命令
1 | git reset HEAD |
现在已提交的文件将从阶段区域发送到未经保存的区域。现在文件已经准备好编辑了,所以不管您做了什么更改,您都要进行编辑并添加它,并进行一次新的/新的提交。
更多
如果安装了Git Extras,则可以运行
我想撤销我们共享存储库中最新的5个提交。我查找了要回滚到的修订ID。然后我输入以下内容。
1 2 3 4 5 6 7 8 | 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 [email protected]:thecompany/prometheus.git + 09a6480...5a74047 master -> master (forced update) prompt> |
我更喜欢用
选择要列出的提交数,然后这样调用(以登记最后三个提交)
1 | git rebase -i HEAD~3 |
样本列表
1 2 3 | pick aa28ba7 Sanity check for RtmpSrv port pick c26c541 RtmpSrv version option pick 58d6909 Better URL decoding support |
然后git将删除您删除的任何行的提交。
如何修复以前的本地提交
使用git-gui(或类似工具)执行
只需将分支重置到以前的位置(例如,使用
警告:不小心使用
执行反向樱桃拾取(Git Revert)以撤消更改。
如果您还没有将其他更改拉到您的分支上,您可以简单地执行…
1 | git revert --no-edit HEAD |
然后将更新的分支推送到共享存储库。
提交历史记录将分别显示两个提交。
高级:更正公共存储库中的私有分支这可能很危险——请确保您有一个分支机构的本地副本。另外请注意:如果其他人正在分支机构工作,则不希望执行此操作。
1 | git push --delete (branch_name) ## remove public version of branch |
在本地清理你的分支机构然后就可以了…
1 | git push origin (branch_name) |
在正常情况下,您可能不必担心您的私有分支提交历史是原始的。只需推送后续提交(参见上面的"如何撤消公开提交"),然后进行挤压合并以隐藏历史记录。
如果你犯了垃圾但没有被推,
1 | git reset --soft HEAD~1 |
HEAD~1 is a shorthand for the commit before head. Alternatively you can refer to the SHA-1 of the hash if you want to reset to. --soft option will delete the commit but it will leave all your changed files"Changes to be committed", as git status would put it.
If you want to get rid of any changes to tracked files in the working tree since the commit before head use"--hard" instead.
或
If you already pushed and someone pulled which is usually my case, you can't use git reset. You can however do a git revert,
1 | git revert HEAD |
This will create a new commit that reverses everything introduced by the accidental commit.
如果要永久撤消它,并且克隆了一些存储库
提交ID可以通过
1 | git log |
那你就可以了-
1 2 3 | git reset --hard <commit_id> git push origin <branch_name> -f |
在sourcetree(gui for github)上,您可以右键单击提交并执行"反向提交"。这将撤消您的更改。
在终端上:
您也可以使用:
1 | git revert |
或:
1 2 | 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. |
单个命令:
1 | git reset --soft 'HEAD^' |
撤消上一次本地提交非常有效!
使用
1 | git reset --soft HEAD~1 |
解释:
我在下图中为您创建了更详细的步骤,包括在实际情况下可能发生的所有步骤和提交代码:
如何撤消最后一次Git提交?
要将所有内容恢复到上一次提交之前的状态,我们需要重置为head之前的提交。
如果不想保留所做的更改:
1 | git reset --hard HEAD^ |
如果要保留更改:
1 | git reset --soft HEAD^ |
现在检查你的Git日志。它将显示上一次提交已被删除。
使用reflog查找正确的状态
1 | git reflog |
重置前重新记录
选择正确的reflog(在我的例子中是f3cb6e2)并键入
1 | git reset --hard f3cb6e2 |
之后,回购头将重置为该头ID。重置后的日志
最后,反应图如下图所示。
最后归还
"将工作树重置为上一次提交"
1 | git reset --hard HEAD^ |
"清除工作树中的未知文件"
1 | git clean |
参见-Git快速参考
注意:此命令将删除以前的提交,因此请小心使用!
第一次运行:
1 | git reflog |
它将向您显示您在存储库中执行的所有可能的操作,例如提交、合并、拉取等。
然后这样做:
1 | git reset --hard ActionIdFromRefLog |
撤消上次提交:
这将撤消上一次提交。
这里,
1 | git commit --amend -m"message" |
它将用新提交替换上一次提交。
另一种方式:
签出要还原的分支,然后将本地工作副本重置回要成为远程服务器上最新的提交(之后的所有内容都将变为再见)。为此,在SourceTree中,我右键单击并选择"将BranchName重置为此提交"。
然后导航到存储库的本地目录并运行以下命令:
1 | git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME |
这将清除本地存储库中当前提交之后的所有提交,但仅限于该分支。
键入
1 | git reset <the previous co> |
在我的案例中,我意外地提交了一些我不想提交的文件。所以我做了以下工作:
1 2 3 4 | 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验证结果
有很多方法可以做到:
要撤消上一次提交/上一次提交的git命令:
警告:不要使用——如果你不知道自己在做什么,就不要使用。--硬文件太危险,可能会删除文件。
在git中恢复提交的基本命令是:
1 | $ git reset --hard <COMMIT -ID> |
或
1 | $ git reset --hard HEAD~<n> |
commit-id:commit的id
n:是您要还原的最后提交数
您可以获取提交ID,如下所示:
1 2 3 4 5 6 7 | $ **git log --oneline** d81d3f1 function to subtract two numbers be20eb8 function to add two numbers bedgfgg function to mulitply two numbers |
其中d81d3f1和be20eb8是提交ID。
现在让我们来看一些案例:
假设您希望恢复最后一次提交"d81d3f1"。以下是两个选项:
1 | $ git reset --hard d81d3f1 |
或
1 | $ git reset --hard HEAD~1 |
假设您要还原提交"be20eb8":
1 | $ git reset --hard be20eb8 |
有关更详细的信息,您也可以参考并尝试其他一些命令,以便将磁头重置为指定状态:
1 | $ git reset --help |
简单地,在命令行中运行:
1 | git reset --soft HEAD~ |
主要有两种情况
你还没有完成任务
如果问题是您提交的额外文件(并且您不希望在存储库中使用这些文件),则可以使用
1 | git rm <pathToFile> |
您还可以使用
1 2 | git rm -r <pathToDirectory> git rm $(find -name '*.class') |
删除文件后,可以使用--amend选项提交
1 | git commit --amend -C HEAD # the -C option is to use the same commit message |
这将重写您最近的本地提交,删除多余的文件,因此,这些文件将永远不会在推送时发送,也将由GC从本地.git存储库中删除。
你已经推动了承诺
您可以应用其他场景的相同解决方案,然后使用
相反,您必须在不使用
使用sourcetree(git的图形工具)查看提交和树。您可以通过右键单击直接手动重置它。
对于本地提交
1 | git reset --soft HEAD~1 |
或者,如果您不确切地记得提交它的位置,那么可以使用
1 | git rm --cached <file> |
对于强制提交
从存储库历史中删除文件的正确方法是使用
1 | git filter-branch --index-filter 'git rm --cached <file>' HEAD |
但我建议你小心使用这个命令。在git filter branch(1)手册页了解更多信息。
要重置为上一版本,请永久删除所有未提交的更改:
1 | git reset --hard HEAD~1 |
使用什么,
我只是在给@kyralessa的答案加上两分钱:
如果您不确定要为
如果您错误地选择了
1 2 | git reset HEAD file.html git checkout -- file.html |
完整例子
1 2 3 4 5 6 7 8 9 10 | 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。
你可以使用:
1 | git reset HEAD@{1} |
此命令将删除不带git日志的错误提交。
我们有code.txt文件。我们对它做了一些更改并提交。我们可以用三种方法撤消这个提交,但首先您应该知道什么是阶段文件…分阶段文件是准备提交的文件,如果运行
这意味着,如果提交更改,则不会保存对此文件所做的更改。您可以在使用
撤消上次提交:
现在,如果我们只想在不做任何其他更改的情况下撤消提交,则可以使用
如果我们希望撤消提交及其更改(这很危险,因为您的更改将丢失),我们可以使用
如果我们想要撤消提交并从阶段中删除更改,我们可以使用
通常,你想撤销一个承诺,因为你犯了一个错误,你想改正它——本质上是操作人员问问题时所做的。所以,实际上,您想要重新提交。
这里的大多数答案都集中在命令行上。虽然命令行是使用Git的最佳方式,但它可能与其他版本控制系统对Git的使用有点不同。
下面介绍如何使用图形用户界面。如果您安装了Git,那么您已经拥有了遵循这些说明所需的一切。
注意:我假设你在推行承诺之前意识到承诺是错误的。如果你不知道推是什么意思,那么你可能还没有推。所以请继续按照指示进行。如果您已经推送了错误提交,那么风险最小的方法就是用一个新的提交来跟踪错误提交,这个提交可以修复问题,就像在不允许您重写历史的版本控制系统中那样。
也就是说,下面是如何使用GUI修复最近的故障提交:
撤消上一次提交
在很多情况下,您确实希望撤消最后一次提交到代码中的操作。例如,因为你想对它进行广泛的重组,甚至完全放弃它!
在这些情况下,"重置"命令是您最好的朋友:
1 | $ git reset --soft HEAD~1 |
上面的命令(reset)会将当前头部分支倒带到指定的版本。在上面的示例中,我们希望返回到当前修订之前的版本—有效地使最后一次提交撤消。
注意
如果不想保留这些更改,只需使用
1 | $ git reset --hard HEAD~1 |
如果您使用的是sourcetree,这将对您有所帮助。
右键单击提交,然后选择"重置(当前分支)/master到此提交",最后选择"软"重置。
只需撤消上一次提交:
1 | git reset --soft HEAD~ |
或撤消上次提交前的时间:
1 | git reset --soft HEAD~2 |
或撤消以前的任何提交:
1 | git reset --soft <commitID> |
(您可以使用
撤消以前的提交时,请记住使用
1 | git clean |
更多详细信息可以在docs:git reset中找到。
要撤消本地提交,请使用
或者,您可以使用
在我的案例中,我提交并推到了错误的分支,所以我想要的是恢复所有更改,以便将它们提交到一个新的正确分支,所以我这样做了:
在提交和推送的同一个分支上,如果键入"git status",则不会看到任何新的内容,因为您提交和推送了,现在键入:
这将使您的所有更改(文件)返回到阶段区域,现在要将它们返回到您刚才键入的工作目录(Unstage)中:
1 | git reset FILE |
其中"file"是要再次提交的文件。现在,这个文件应该在工作目录(未分页)中,包含您所做的所有更改。现在,您可以更改到您想要的任何分支,并提交该分支中的更改。希望这能帮助其他犯同样错误的人。当然,您提交的初始分支仍然存在,并且有所有的更改,但是在我的例子中,这是可以的,如果不适合您,您可以寻找方法来恢复该分支中的提交。
典型的Git循环
在前面的答案中谈到与Git相关的命令时,我想与所有读者分享我的典型Git周期,这可能会有所帮助。以下是我与Git合作的方式,
第一次从远程服务器克隆
从远程拉取(当我没有挂起的本地提交要推送时)
将一个新的本地文件1添加到$to-be-committedu列表中(想象一下$to-be-u-committedu列表意味着
删除错误地将文件2从$添加到"被提交"列表(假设文件2是像步骤3那样添加的,我不想这样做)
提交$to-be-committed-list中的文件1
在推送之前将本地提交与远程存储库同步
冲突发生时解决先决条件配置合并工具
添加解决冲突的文件,比如
继续我以前的REBASE命令
正在推送准备就绪并已同步上一次本地提交
撤消上一次提交:
1 | git reset --soft HEAD^ or git reset --soft HEAD~ |
这将撤消上一次提交。
这里,
将最后一次提交替换为新提交:
1 | git commit --amend -m"message" |
它将用新提交替换上一次提交。
Visual Studio用户(2015等)
如果您不能在Visual Studio中同步,因为不允许将其推到"开发"这样的分支,那么在Visual Studio中,还原和重置(硬或软)都不会起作用。
根据大量投票的答案:
在项目根目录的命令提示符下使用该命令,可以对任何试图被推送的内容进行核攻击:
1 | git reset --hard HEAD~1 |
备份或压缩文件以防丢失任何工作等…
假设您在本地进行了错误的提交,并将其推送到远程存储库。您可以使用以下两个命令来撤消混乱:
首先,我们需要通过返回我们想要的提交来更正本地存储库:
1 | git reset --hard [cc] |
现在,我们使用以下命令在远程存储库上强制执行此良好提交:
1 | git push --force-with-lease |
强制选项的"with lease"版本将防止意外删除您不知道的新提交(即,自上次请求以来来自另一个源)。
我从
1 | git checkout commitID . |
例子:
1 | git checkout 7991072 . |
它将它还原为该提交的工作副本。
你需要做的简单和快速
1 | git commit --amend |
如果是私人分支机构或
1 | git commit -m 'Replace .class files with .java files' |
如果是共享或公共分支。
您有几个选项可以撤消上一次提交。下面是您的一些选项,总结成一个包含代码片段的答案
首先,您需要确定哪些是您希望放弃的"错误"提交。我们将用
您也可以使用
每次修改头部时,
1 2 3 4 | git reflog git checkout HEAD@{...} # or git checkout <sha-1> |
使用签出,您可以返回到任何所需的提交,并且可以创建一个分支或Git签出允许您执行的任何其他选项。
"移动"你的头回到想要的承诺。git reset将根据您选择的值
如果这些承诺不是任何其他分支的一部分,它们将成为"悬而未决"。"dangle"内容是指本地存储库中有一个不可访问的内容,它不是任何其他分支的一部分,可以由
1 2 3 4 5 6 7 8 9 10 11 | # This will destroy any local modifications. # Don't do it if you have uncommitted work you want to keep. git reset --hard 0d1d7fc32 # Alternatively, if there's work to keep: git stash git reset --hard 0d1d7fc32 git stash pop # This saves the modifications, then reapplies that patch after resetting. # You could get merge conflicts if you've modified things which were # changed since the commit you reset to. |
这个模式说明了哪个命令执行什么操作。如您所见,
删除已推送到GitHub的错误提交
1 | git push origin +(previous good commit id):(branch name) |
请指定要在GitHub中重新设置的最后一个良好提交ID。
例如。如果最新提交ID错误,请使用分支名称在上面的git命令中指定上一个提交ID。
您可以使用
使用此命令:
1 | git checkout -b old-state number_commit |
使用此命令
1 | git checkout -b old-state 0d1d7fc32 |
您总是可以执行以前版本的
为了消除最后一次提交、最后2次提交和最后n次提交中的所有更改:
1 2 3 4 | git reset --hard HEAD~1 git reset --hard HEAD~2 ... git reset --hard HEAD~n |
而且,为了在特定的提交之后摆脱任何东西:
1 | git reset --hard <commit sha> |
例如。,
1 | git reset --hard 0d12345 |
PS:
1- Be careful, because of"hard" option, it deletes the local changes
in your repo as well and reverts to the previous mentioned commit. You
should run this if you are sure you messed up in your last commit(s)
and would like to go back in time.2- Usually 7 letters of"commit sha" is enough, but in bigger
projects, you may need up to 12 letters to guarantee be unique. You
also can mention the whole 40 letters sha.3- The above commands work in Github for Windows as well.
您可以通过两种方式撤消Git提交:首先,如果要保留提交历史记录,可以使用
1 2 | git revert HEAD~3 git revert <hashcode of commit> |
其次,您可以使用
1 2 | git reset <hashcode of commit> git reset HEAD~3 |
如果其中任何一个开始出现其他行为,也可以使用
参考:如何撤消Git中的最后一次提交?
如果安装了Git扩展,则可以轻松撤消/还原任何提交(您可以从此处下载Git扩展)。
打开git扩展,右键单击要还原的提交,然后选择"还原提交"。
将打开一个弹出窗口(请参见下面的屏幕截图)
如果要直接提交还原的更改,或者要手动提交还原的更改,请选择"自动创建提交",保持复选框处于未选中状态,然后单击"还原此提交"按钮。
Git重置的区别--混合,--软,--硬
Prerequisite: When a modification to an existing file in your
repository is made, this change is initially considered as unstaged.
In order to commit the changes, it needs to be staged which means
adding it to the index usinggit add . During a commit operation, the
files that are staged gets added to an index.
让我们举个例子:
1 | - A - B - C (master) |
- 当我们执行
git reset --soft B 时,意图删除commit c并将master/head指向b。 - 现在master/head将指向b,但索引仍然从c更改。
- 在执行
git status 时,您可以看到在commit c中索引的文件是分阶段的。 - 此时执行
git commit 将创建一个新的提交,其更改与c相同。
--混合
- 执行
git reset --mixed B 。 - 执行时,master/head将指向b,并且由于使用了混合标志,索引也被修改为与b匹配。
- 如果此时运行git commit,则不会发生任何事情,因为索引与head匹配。
- 我们在工作目录中仍然有更改,但是由于它们不在索引中,所以git status将它们显示为未分页。
- 为了承诺他们,你会先承诺(12),然后像往常一样承诺。
--硬
- 执行
git reset --hard B 。 - 执行时,master/head将指向b并修改您的工作目录。
- 在C中添加的更改和所有未提交的更改都将被删除。
- 工作副本中的文件将与提交B匹配,这将导致永久丢失在提交C中所做的所有更改以及未提交的更改。
希望对可与
我找到了这个站点,它描述了如何撤消您已提交到存储库中的内容。
一些命令:
1 2 | git commit --amend # Change last commit git reset HEAD~1 --soft # Undo last commit |
只需使用
撤消最后一次提交的最简单方法是
1 | git reset HEAD^ |
这将使项目状态在您提交之前。
您可以从本地存储库撤消提交。请遵循以下方案。
在下图中,我检查了"测试"分支(使用git命令
在下一幅图像中,您可以在这里看到我在filter1.txt中做了一些更改,并将该文件添加到临时区域,然后用一些消息提交了我的更改(使用git命令
"-m表示提交消息"
在下一个图像中,您可以看到提交日志,无论您提交了什么(使用git命令
因此,在上面的图像中,您可以看到每次提交时的提交ID,以及现在的提交消息,无论您希望恢复或撤消复制哪个提交ID,并点击下面的git命令,
这里是网站:
以下是很多关于如何在Git中撤消操作的方法。他们中的一些人:
Oh shit, I need to change the message on my last commit!
1 2 | git commit --amend # follow prompts to change the commit message |
Oh shit, I accidentally committed something to master that should have been on a brand new branch!
1 2 3 4 5 6 | # Create a new branch from the current state of master git branch some-new-branch-name # Remove the commit from the master branch git reset HEAD~ --hard git checkout some-new-branch-name # Your commit lives in this branch now :) |
Rebasing and dropping commits are the best when you want to keep the history clean
useful when proposing patches to a public branch etc.
If you have to drop the topmost commit then the following one-liner helps
ZZU1〔8〕
But if you want to drop 1 of many commits you did say
a -> b -> c -> d -> master
and you want to drop commit 'c'
ZZU1〔9〕
This will make 'b' as the new base of 'd' eliminating 'c'
在intellij思想中,只需按alt+9,右键单击提交列表中的某个标记,然后选择"将当前分支重置到此处…",即可打开git存储库日志。
头:
在重置提交之前,我们应该知道head…head只是您工作目录中的当前状态。它由一个提交号表示。
GIT提交:
在提交下分配的每个更改都由一个唯一的标记表示。无法删除提交。因此,如果您想要最后一次提交,您可以使用
您可以使用两种方法深入到最后一次提交:
方法1:(如果您不知道提交编号,但希望转到第一个)
1 | git reset HEAD~1 # It will move your head to last commit |
方法2:(如果知道提交,只需重置为已知提交)
注意:如果您想了解最近的提交,请尝试
以下是图形表示:
为了完整起见,我将给出一个明显的方法,这个方法被以前的答案忽略了。
由于没有推送提交,所以远程文件是不变的,因此:
这有时是必要的,如果你喜欢的吉特客户去再见。(如
不要忘记重新提交上次推送后保存的更改。
通过以下方式查看日志来查找最后一个提交哈希代码:
1 | git log |
然后
1 | git reset <the previous co> |
假设您在Visual Studio中工作,如果进入分支历史记录并查看所有提交,只需在要撤消的提交之前选择事件,右键单击它,然后选择
如果你想删除错误的文件,你应该这样做
比如下面。
现在您只需添加需要推送的文件,
提交他们
推
但是,如果您不关心更改的文件,可以硬重置为以前的良好提交并将所有内容推送到服务器。
通过
1 | git reset --hard <your_last_good_commit_hash_here> |
如果已经将错误的文件发布到服务器,则可以使用
Try this, hard reset to previous commit where those files were not added, then:
ZZU1〔6〕
Make sure you have a backup of your changes just in case, as it's a hard reset, which means they'll be lost (unless you stashed earlier)
What i do each time i need to undo a commit/commits are:
现在,我可以添加和提交我需要的文件:
git add & git commit -m"message" -m"details"
git checkout
git push origin //使用-f强制推。-f
1 | git reset --soft HEAD~1 |
重置会将当前的头分支倒带到指定的版本。注意--soft标志:这可以确保保留未做修订中的更改。运行该命令后,您将在工作副本中找到未提交的本地修改。
如果不想保留这些更改,只需使用--hard标志。确保只在确定不再需要这些更改时执行此操作。
1 | git reset --hard HEAD~1 |
Undoing Multiple Commits
1 | git reset --hard 0ad5a7a6 |
但是,请记住,使用reset命令将撤消在返回到以下位置之后的所有提交:
使用此命令获取最后一个提交ID(在顶部的日志中,它是最新的一个):
1 | git log |
获取提交ID(guid)并运行以下命令:
1 | git revert <commit_id> |
如果你想撤销回购协议中的第一个承诺
您将遇到此问题:
1 2 3 4 | $ git reset HEAD~ fatal: ambiguous argument 'HEAD~': unknown revision or path not in the working tree. Use '--' to separate paths from revisions, like this: 'git <command> [<revision>...] -- [<file>...]' |
出现错误的原因是,如果最后一次提交是存储库的初始提交(或没有父级),则没有head~。
解决方案如果要重置"master"分支上的唯一提交
1 2 | $ git update-ref -d HEAD $ git rm --cached -r . |
如果您只想废弃所有本地更改/提交,并使本地分支看起来像您从中开始的源分支…
用服务器版本替换本地版本,包括所做的更改,这两行代码将强制Git提取并覆盖本地版本。打开命令提示并导航到git项目根目录。如果使用vs,请单击team,synch,然后单击下面的"open command prompt"(打开命令提示)(参见图)。
一旦进入命令提示,继续执行以下两个指令。
1 | git fetch --all |
然后你这样做
1 | git reset --hard origin/master |
这将用git服务器上的本地版本覆盖现有的本地版本。
如何编辑早期提交
一般来说,我不想撤消一堆提交,而是编辑一个较早的提交,以实现我希望在第一时间提交它的方式。
我发现自己经常修改过去的承诺,为此我写了一个脚本。
以下是工作流程:
1 | git commit-edit <commit-hash> |
这将使您放弃要编辑的提交。
提交的更改将被取消,准备好按您希望的第一次进行。
按照您希望的方式,首先修复并准备提交。
(您可能希望使用
用
1 | git commit --amend |
完成钢筋:
1 | git rebase --continue |
在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | #!/bin/bash # Do an automatic git rebase --interactive, editing the specified commit # Revert the index and working tree to the point before the commit was staged # https://stackoverflow.com/a/52324605/5353461 set -euo pipefail script_name=${0##*/} warn () { printf '%s: %s '"$script_name""$*">&2; } die () { warn"$@"; exit 1; } [[ $# -ge 2 ]] && die"Expected single commit to edit. Defaults to HEAD~" # Default to editing the parent of the most recent commit # The most recent commit can be edited with `git commit --amend` commit=$(git rev-parse --short"${1:-HEAD~}") # Be able to show what commit we're editing to the user if git config --get alias.print-commit-1 &>/dev/null; then message=$(git print-commit-1"$commit") else message=$(git log -1 --format='%h %s'"$commit") fi if [[ $OSTYPE =~ ^darwin ]]; then sed_inplace=(sed -Ei"") else sed_inplace=(sed -Ei) fi export GIT_SEQUENCE_EDITOR="${sed_inplace[*]}"'"s/^pick ('"$commit"' .*)/edit \\1/"' git rebase --quiet --interactive --autostash --autosquash"$commit"~ git reset --quiet @~"$(git rev-parse --show-toplevel)" # Reset the cache of the toplevel directory to the previous commit git commit --quiet --amend --no-edit --allow-empty # Commit an empty commit so that that cache diffs are un-reversed echo echo"Editing commit: $message">&2 echo |
ZZU1〔10〕
This will generate the opposite changes from the commit which you want to revert back, and then just commit that changes. I think this is the simplest way.
https://git-scm.com/docs/git-revert
ZZU1〔7〕
对于那些喜欢图形用户界面的人来说,ungit是一个功能齐全的用于Git的图形用户界面,它包括一个"撤消最后一次提交"按钮。