3816

我想知道如何删除提交。

delete我的意思是好像我没有提交,当我将来推送时,我的更改不会推送到远程分支。

我阅读了 git help,我认为我应该使用的命令是git reset --hard HEAD. 这个对吗?

4

35 回答 35

4883

小心: git reset --hard 将删除您的工作目录更改。在运行此命令之前,请务必存储您想要保留的任何本地更改。

假设你正坐在那个提交上,那么这个命令会搞砸它......

git reset --hard HEAD~1

表示在头部之前的HEAD~1提交。

或者,您可以查看 的输出git log,找到要备份到的提交的提交 ID,然后执行以下操作:

git reset --hard <sha1-commit-id>

如果你已经推了它,你需要用力推才能摆脱它......

git push origin HEAD --force

但是,如果其他人可能已经取消了它,那么你最好开始一个新的分支。因为当他们拉动时,它只会将其合并到他们的工作中,而您会再次将其推回原处。

如果您已经推送,最好使用git revert, 创建一个“镜像”提交来撤消更改。但是,两个提交都将在日志中。


仅供参考 -git reset --hard HEAD如果您想摆脱正在进行的工作,那就太好了。它会将您重置回最近的提交,并删除工作树和索引中的所有更改。


最后,如果您需要找到您“删除”的提交,它通常存在,git reflog除非您对存储库进行了垃圾收集。

于 2009-08-27T03:44:04.727 回答
806

如果您尚未将提交推送到任何地方,则可以使用git rebase -i删除该提交。首先,找出该提交有多远(大约)。然后做:

git rebase -i HEAD~N

~N意味着重新提交最后一次N提交(N必须是一个数字,例如HEAD~10)。然后,您可以编辑 Git 呈现给您的文件以删除有问题的提交。保存该文件后,Git 将重写所有以下提交,就好像您删除的提交不存在一样。

Git Book 有一个很好的部分,关于使用图片和示例进行 rebase。

不过要小心这一点,因为如果您更改在其他地方推送的内容,则需要另一种方法,除非您打算进行强制推送。

于 2009-08-27T03:51:04.913 回答
622

另一种可能性是我个人最喜欢的命令之一:

git rebase -i <commit>~1

-i这将在您想要敲击的提交之前以交互模式启动 rebase 。编辑器将开始列出从那时起的所有提交。删除包含要删除的提交的行并保存文件。Rebase 将完成其余的工作,仅删除该提交,并将所有其他提交重放回日志中。

于 2009-08-27T03:49:27.727 回答
401

我附上了这个答案,因为我不明白为什么任何刚刚尝试提交工作的人会因为使用 Git 的一些错误而想要删除所有这些工作!

如果您想保留您的工作并只是“撤消”该提交命令(您在推送到 repo 之前捕获):

git reset --soft HEAD~1

不要使用 --hard标志,除非您想破坏自上次提交以来正在进行的工作。

于 2012-10-15T18:17:58.640 回答
235

删除整个提交

git rebase -p --onto SHA^ SHA

显然将“SHA”替换为您想要摆脱的参考。该命令中的“^”是文字。

http://sethrobertson.github.io/GitFixUm/fixup.html#change_deep

于 2015-08-31T19:36:46.360 回答
92

假设我们要从 repo 中删除提交 2 和 4。(提交的数字越大;0 是最旧的提交,4 是最新的提交)

commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>

注意:由于使用--hard-f.

  • git checkout b3d92c5签出最后一个可用的提交。
  • git checkout -b repair创建一个新的分支来处理。
  • git cherry-pick 77b9b82运行提交 3。
  • git cherry-pick 2c6a45b运行提交 1。
  • git checkout master收银员。
  • git reset --hard b3d92c5将 master 重置为最后一个可用的提交。
  • git merge repair将我们的新分支合并到 master 上。
  • git push -f origin master将 master 推送到远程仓库。
于 2017-09-05T07:19:36.527 回答
58

如果您没有发布更改,要删除最新提交,您可以这样做

$ git reset --hard HEAD^

(请注意,这也会删除所有未提交的更改;小心使用)。

如果您已经发布了待删除的提交,请使用git revert

$ git revert HEAD
于 2009-08-27T10:47:42.983 回答
52

强制更改历史记录

假设您不仅要删除最后一次提交,而且要删除最后 n 次提交的特定提交,请使用:

git rebase -i HEAD~<number of commits to go back>,所以git rebase -i HEAD~5如果你想查看最后五个提交。

然后在文本编辑器中将单词更改为您要删除的每个提交旁边pickdrop保存并退出编辑器。瞧!

附加更改历史

试试git revert <commit hash>Revert将创建一个撤消指定提交的提交。

于 2017-06-15T23:01:07.147 回答
51
git reset --hard commitId

git push <origin> <branch> --force

PS: CommitId 是指您要恢复的那个

于 2014-10-16T09:51:32.437 回答
46
git rebase -i HEAD~2

这里的 '2' 是你想要变基的提交数。

'git rebase -i HEAD`

如果你想重新设置所有提交。

然后,您将能够选择这些选项之一。

p, pick = use commit

r, reword = use commit, but edit the commit message
e, edit = use commit, but stop for amending
s, squash = use commit, but meld into previous commit
f, fixup = like "squash", but discard this commit's log message
x, exec = run command (the rest of the line) using shell
d, drop = remove commit

这些行可以重新排序;它们是从上到下执行的。如果您在此处删除一行,则 COMMIT 将丢失。但是,如果您删除所有内容,rebase 将被中止。请注意,空提交被注释掉

您可以使用选项“d”或删除包含您的提交的行来简单地删除该提交。

于 2016-05-18T23:39:53.993 回答
39

[快速回答]

您有很多选择,例如:

  • 备选方案 1:

    git rebase -i <YourCommitId>~1
    

    将 YourCommitId 更改为要恢复到的提交的编号。

  • 备选方案 2:

    git reset --hard YourCommitId
    git push <origin> <branch> --force
    

    将 YourCommitId 更改为要恢复到的提交的编号。

    我不推荐此选项,因为您可能会丢失正在进行的工作。

  • 备选方案 3:

    git reset --soft HEAD~1
    

    您可以保留您的工作,只撤消提交。

于 2019-10-30T11:14:37.703 回答
35

如果您想修复最新的提交,您可以撤消提交,并取消暂存其中的文件,方法是:

git reset HEAD~1

这将使您的存储库恢复到暂存文件的 git add 命令之前的状态。您的更改将在您的工作目录中。HEAD~1 指的是分支当前尖端下方的提交。

如果您想取消提交 N 次提交,但将代码更改保留在您的工作目录中:

git reset HEAD~N

如果您想摆脱最近的提交,并且不想保留代码更改,您可以进行“硬”重置。

git reset --hard HEAD~1

同样,如果您想丢弃最后 N 次提交,并且不想保留代码更改:

git reset --hard HEAD~N
于 2014-05-31T07:19:37.447 回答
19

要在本地分支中删除,请使用

git reset --hard HEAD~1

要在远程分支中删除,请使用

git push origin HEAD --force
于 2014-08-28T16:06:07.947 回答
14

来源:https ://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8

删除最后一次提交

例如你的最后一次提交

git push origin +aa61ab32^:master

现在你想删除这个提交然后一个简单的方法来做到这一点

脚步

  1. 首先将分支重置为当前提交的父级

  2. 强行将其推到遥控器上。

git reset HEAD^ --hard

git push origin -f

对于特定的提交,您要重置如下

git reset bb676878^ --hard

git push origin -f
于 2018-06-22T13:40:59.530 回答
10

上面的所有命令都将您的工作树和索引的状态恢复为提交之前的状态,但不会恢复存储库的状态。如果您看一下,“已删除”的提交实际上并没有被删除,它根本不是当前分支尖端的那个。

我认为没有办法用瓷器命令删除提交。唯一的方法是将其从日志和 reflog 中删除,然后执行git prune --expire -now.

于 2012-10-04T07:19:22.587 回答
10

这是另一种方法:

签出您要恢复的分支,然后将您的本地工作副本重置回您希望成为远程服务器上最新版本的提交(之后的一切都会再见)。为此,在 SourceTree 中,我右键单击并选择“将 BRANCHNAME 重置为此提交”。我认为命令行是:

git reset --hard COMMIT_ID

由于您刚刚从远程签出您的分支,因此您无需担心丢失任何本地更改。但是,如果您这样做,这将失去它们。

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

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

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

于 2013-05-13T17:20:01.013 回答
9

如果你想保留历史,显示提交和恢复,你应该使用:

git revert GIT_COMMIT_HASH

输入解释您为什么要恢复的消息,然后:

git push  

当您发出时,git log您将看到“错误”提交和恢复日志消息。

于 2015-01-07T15:13:35.507 回答
9

错误:

git rebase -i --root编辑了我的分支,无知地认为我可以重写与 master 不同的第一个提交(GitHub for Windows默认视图是与 master 的比较,隐藏它的全部内容)。

当 900 多个提交加载到 Sublime 时,我长出了硅谷的胡须。退出时没有任何更改,我给电池充电,然后开始刮胡子,因为所有 900 多个个人提交都漫不经心地重新设置了基础——将他们的提交时间重置为现在。

决心击败 Git 并保留原始时间,我删除了这个本地存储库并从远程重新克隆。

现在它重新向我希望删除的 master 添加了一个最近不需要的提交,所以就这样进行了。

用尽选项:

我不希望git revert- 它会创建一个额外的提交,让 Git 占上风。

git reset --hard HEAD什么也没做,在检查完之后reflog,最后一个也是唯一HEAD的克隆——Git 获胜。

为了获得最新的 SHA,我检查了 github.com 上的远程存储库 - 次要胜利。

在思考git reset --hard <SHA>成功后,我将另一个分支更新为 master 和 1... 2... 噗!提交又回来了——Git 赢了。

回到主人那里,是时候尝试了git rebase -i <SHA>,然后删除线......无济于事,很难过。“如果您在此处删除一行,则提交将丢失”。啊...在2.8.3 发行说明中对新功能巨魔 n00b进行了修饰。

解决方案:

git rebase -i <SHA>然后d, drop = remove commit

为了验证,我检查了另一个分支,瞧 - 没有隐藏提交以从 master 获取/拉取。

https://twitter.com/holman/status/706006896273063936

祝你有美好的一天。

于 2016-05-25T20:33:19.700 回答
8

在这里,我只发布一个明确的管道来做到这一点

Step1:使用 git log 获取提交 ID。

git log

在此处输入图像描述

Step2:使用 git reset 回到之前的版本:

git reset --hard <your commit id>
于 2021-02-06T02:45:21.003 回答
7

如果您刚刚搞砸了上一次提交(错误消息,忘记添加一些更改)并且想要在将其推送到公共仓库之前修复它,为什么不使用:

git commit --amend -m "New message here"

如果您有新的暂存更改,它们将与最后一次提交(您试图摆脱的)合并,并将替换该提交。

当然,如果你在推送之后修改了一个提交,你就是在重写历史,所以如果你这样做了,一定要理解其中的含义。

如果您希望使用先前提交的消息,您也可以传递“--no-edit”选项而不是“-m”。

文档: http: //git-scm.com/docs/git-commit.html

于 2014-05-26T23:24:22.347 回答
7

如果你已经推送了,首先在 HEAD ($GIT_COMMIT_HASH_HERE)找到你想要的提交,然后运行以下命令:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

然后在每个已克隆 repo 的地方,运行:

git reset --hard origin/master
于 2017-01-30T00:25:54.880 回答
6

当我提交和推送时,我通常会做什么(如果有人推送他的提交,这可以解决问题):

git reset --hard HEAD~1

git push -f origin

希望这有帮助

于 2017-06-14T09:22:56.520 回答
6

我已经推了。需要远程返回一些提交。尝试了很多变体,但只有贾斯汀通过 git bush 提供的这个对我来说效果很好:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force
于 2019-02-08T21:29:18.757 回答
5

在本地分支上重置

git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3

强制推到原点

git push -f origin
于 2018-05-29T07:38:04.107 回答
5
// display git commit log    
$ git log --pretty=oneline --abbrev-commit

// show last two commit and open in your default editor
// then delete second commit line and save it
$ git rebase -i HEAD~2

参考:如何在 git、本地和远程删除一个提交

于 2019-06-26T12:46:32.140 回答
5

git reset --hard HEAD~1
您现在将处于以前的状态。拉树枝。推送新代码。提交将从 git 中删除

于 2020-01-20T13:14:20.197 回答
4

将您的代码备份到临时文件夹中。以下命令将重置与服务器相同。

git reset --hard HEAD
git clean -f
git pull

如果您想保留您的更改,并删除最近的提交

git reset --soft HEAD^
git pull
于 2016-07-14T11:25:31.087 回答
3

如果您是IntelliJ用户,那么界面简直太棒了。只需单击一下,您就可以立即看到效果。到这个地方的捷径:Cmd + 9在 MacOS 上。

在此处输入图像描述

于 2021-07-08T15:50:52.507 回答
2

删除本地提交

正如您在上图中看到的,我想删除恢复“测试更改 2”提交(SHA1 ID:015b5220c50e3dfbb1063f23789d92ae1d3481a2(您可以通过在 git bash 中使用gitk命令获取 SHA1 ID))。

为此我可以使用(以下所有命令仅在本地工作。您需要在删除后推送):

  1. git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2//它将您备份到该提交(测试更改 4提交的 SHA1 ID 是515b5220c50e3dfbb1063f23789d92ae1d3481a2
  2. git reset --hard HEAD~1// 它在一次提交之前备份你。
  3. git reset --hard HEAD^ // 从 git 中删除最后一次提交

删除后:

删除提交后

于 2018-07-03T06:51:42.047 回答
1

对我来说,变基成功了

$ git rebase -i HEAD~98

# Delete everything except for the most recent commit on the shown editor caused by "rebase"

$ git push origin -f production-static

注意: 强制推送后减少我的评论。然后我推送了另一组文件,然后我尝试在另一台计算机上使用相同的“存储库和分支”进行拉取。令人惊讶的是没有冲突。这成为我减少存储库大小的方法,同时避免在使用相同 git 的其他本地人上发生拉取冲突

于 2021-01-04T17:25:57.050 回答
1

git reset --hard

git push origin HEAD --force

如果一个或多个提交被标记,请先删除标记。否则标记的提交不会被删除。

于 2015-07-24T14:45:51.583 回答
0

这里有 30 多个分析器,我会用适合我的方法来保持简单

删除.git 文件夹可能会导致您的 git 存储库出现问题。如果您想删除所有提交历史记录但将代码保持在其当前状态,则按照以下方式执行此操作非常安全:

查看

git checkout --orphan latest_branch

添加所有文件

git add -A

提交更改

git commit -m "commit message"

删除分支

git branch -D master

将当前分支重命名为 master

git branch -m master

最后,强制更新您的存储库

git push -f origin master

PS:这不会保留您的旧提交历史记录。

于 2022-02-07T11:05:16.237 回答
0

就我而言,我为此目的的魔法代码是这样的:

git reset --hard @{u}

测试它并告诉我。我尝试了几种不同的方法,但只有这一种对我有帮助。

于 2019-11-13T13:06:49.353 回答
0

使用 git revert https://git-scm.com/docs/git-revert。它将还原所有代码,然后您可以进行下一次提交。然后 head 将指向最后一次提交。恢复的提交永远不会删除,但它不会影响您上次提交。

于 2017-03-01T15:15:44.030 回答
-1

假设您尚未推送到远程存储库,您可以重新克隆存储库。这是我几次选择的方法。

于 2014-12-31T06:54:56.300 回答