从Git中的分支中删除提交

时间:2009-08-27 03:39:51

标签: git git-rebase git-reset

我想知道如何删除提交。

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

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

33 个答案:

答案 0 :(得分:3672)

小心: 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中,除非您有垃圾收集了您的存储库。

答案 1 :(得分:647)

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

git rebase -i HEAD~N

~N表示对最后N次提交进行rebase(N必须是数字,例如HEAD~10)。然后,您可以编辑Git提供给您的文件以删除违规提交。保存该文件后,Git将重写所有以下提交,就像您删除的提交不存在一样。

Git Book有很好的section on rebasing图片和示例。

要小心这一点,因为如果你改变了 推到别处的东西,除非你打算强制推动,否则需要采用另一种方法。

答案 2 :(得分:452)

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

git rebase -i <commit>~1

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

答案 3 :(得分:315)

我正在追加这个答案,因为我不明白为什么刚刚尝试提交工作的人会因为使用Git的错误而删除所有工作!

如果你想保留你的工作并且只是'撤消'那个提交命令(你在推送回购之前就抓住了):

git reset --soft HEAD~1

除非您想要销毁自上次提交以来正在进行的工作,否则请勿使用--hard 标志。

答案 4 :(得分:74)

删除整个提交

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /lastwish
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ index.php?/$1 [L,QSA]
</IfModule>

显然将“SHA”替换为您想要删除的引用。该命令中的“^”是文字。

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

答案 5 :(得分:51)

如果您没有发布更改,要删除最新提交,您可以执行

$ git reset --hard HEAD^

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

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

$ git revert HEAD

答案 6 :(得分:35)

git reset --hard commitId

git push <origin> <branch> --force

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

答案 7 :(得分:31)

强制更改历史记录

假设您不只是想删除最后一次提交,但想要删除最后n次提交的特定提交,请使用:

<script> new Vue({ el:'#loginform', data: { rememberme: 1 } }); </script> ,如果您想查看最近五次提交,请git rebase -i HEAD~<number of commits to go back>

然后在文本编辑器中,将要删除的每个提交旁边的单词git rebase -i HEAD~5更改为pick。保存并退出编辑器。瞧!

添加更改历史记录

试试drophttp://www.sqlfiddle.com/#!7/a71acb/1将创建一个 new 提交,撤消指定的提交。

答案 8 :(得分:29)

如果要修复最新提交,可以执行以下操作撤消提交,并取消暂存其中的文件:

git reset HEAD~1

这将使您的存储库返回到分阶段执行文件的git add命令之前的状态。您的更改将在您的工作目录中。 HEAD~1指的是分支当前提示下面的提交。

如果要取消提交N次提交,请在工作目录中保持代码更改:

git reset HEAD~N

如果你想摆脱最新的提交,并且不想保持代码更改,你可以做一个&#34; hard&#34;复位。

git reset --hard HEAD~1

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

git reset --hard HEAD~N

答案 9 :(得分:27)

假设我们要删除提交2&amp;回购。

--hard

注意:您需要拥有对回购的管理员权限,因为您使用的是-fgit checkout b3d92c5

  • git checkout -b repair查看上次可用的提交。
  • git cherry-pick 77b9b82创建一个新的分支来处理。
  • git cherry-pick 2c6a45b贯穿提交3。
  • git checkout master贯穿提交1。
  • git reset --hard b3d92c5 Checkout master。
  • git merge repair将master重置为上次可用的提交。
  • git push -f origin master将我们的新分支合并到主人身上。
  • $("div").attr("data-test", "test"); 将主人推送到远程仓库。

答案 10 :(得分:18)

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”或删除包含提交的行来删除该提交。

答案 11 :(得分:14)

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

git reset --hard HEAD~1

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

git push origin HEAD --force

答案 12 :(得分:9)

错误:

git rebase -i --root'编辑了我的分支,无知地认为我可以改写与主服务器不同的第一个提交( 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>工作之后,我更新了另一个分支到掌握和1 ... 2 ...噗!提交回来了 - Git获胜。

检查回给主站,时间尝试git rebase -i <SHA>,则删除行...无济于事,伤心的话。 “如果你在这里删除一行,那么将失去”。啊......在2.8.3 release notes中隐藏了新功能 troll n00b

解决方案:

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

要验证,我检查了另一个分支,瞧 - 没有隐藏提交从主服务器获取/提取。

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

祝你好运。

答案 13 :(得分:9)

这是另一种方法:

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

git reset --hard COMMIT_ID

由于您刚刚从远程检出了您的分支,因此您不会有任何本地更改以担心丢失。但如果你这样做,就会失去它们。

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

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

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

答案 14 :(得分:8)

上述所有命令都会恢复提交前工作树和索引的状态,但不会恢复存储库的状态。如果你看一下,“删除”的提交实际上并没有删除,它根本就不是当前分支顶端的提交。

我认为没有办法删除porcelain commands的提交。唯一的方法是从日志和reflog中删除它,然后执行git prune --expire -now

答案 15 :(得分:7)

如果要保留历史记录,显示提交和还原,则应使用:

git revert GIT_COMMIT_HASH

输入消息说明您要还原的原因,然后:

git push  

当您发出git log时,您会看到&#34;错误&#34;提交并还原日志消息。

答案 16 :(得分:7)

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

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

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

当然,如果您在推送之后修改了提交,那么您将重写历史记录,因此如果您这样做,请务必了解其含义。

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

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

答案 17 :(得分:6)

来源: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

答案 18 :(得分:5)

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

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

然后每个地方克隆了repo,运行:

git reset --hard origin/master

答案 19 :(得分:5)

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

git reset --hard HEAD~1

git push -f origin

希望这个帮助

答案 20 :(得分:4)

在本地分支上重置

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

强行推送到原点

git push -f origin

答案 21 :(得分:4)

您有许多选择,例如:

  • 替代1:

    git rebase -i <YourCommitId>~1
    
      

    将YourCommitId更改为要还原为的提交次数。

  • 替代2:

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

    将YourCommitId更改为要还原为的提交次数。

         

    我不建议您使用此选项,因为您可能会丢失正在进行的工作。

  • 替代3:

    git reset --soft HEAD~1
    
      

    您可以继续工作,仅撤消提交。

答案 22 :(得分:3)

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

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

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

git reset --soft HEAD^
git pull

答案 23 :(得分:2)

我已经推了。需要远程返回一些提交。 尝试了许多变化, 但只有this中的Justin通过git bush对我来说工作正常:

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

答案 24 :(得分:2)

在这里我只是发布了一个明确的管道

第一步:使用 git log 获取提交 ID。

git log

enter image description here

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

git reset --hard <your commit id>

答案 25 :(得分:1)

git reset --hard

git push origin HEAD --force

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

答案 26 :(得分:1)

delete local commit

如上图所示,我要删除还原“测试更改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中删除最后一次提交

删除后:

after delete commit

答案 27 :(得分:1)

// 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

参考:How to delete a commit in git, local and remote

答案 28 :(得分:1)

就我而言,我的目的魔术代码是这样的:

git reset --hard @{u}

测试一下,然后告诉我。我尝试了几种不同的方法,但这是唯一对我有所帮助的方法。

答案 29 :(得分:1)

对我来说 rebase 成功了

$ 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 的其他本地人的拉取冲突的方法

答案 30 :(得分:0)

如果您是 IntelliJ 用户,那么界面简直太棒了。通过单击,您可以同时立即看到效果。此地点的快捷方式:Cmd + 9

enter image description here

答案 31 :(得分:-1)

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

答案 32 :(得分:-1)

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