注意: You need to have admin rights over the repo 因为您正在使用 --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 将主控推送到远程仓库 .
297
I'm appending this answer because I don't see why anyone who has just tried to commit work would want to delete all that work because of some mistake using Git!
27 回答
上面的所有命令都会在进行提交之前恢复工作树和索引的状态,但不会还原存储库的状态 . 如果你看一下,“删除”的提交实际上并没有被删除,它根本就不是当前分支顶端的提交 .
我认为没有办法删除porcelain commands的提交 . 唯一的方法是从日志和reflog中删除它,然后执行
git prune --expire -now
.如果您尚未将提交推送到任何位置,则可以使用git rebase -i删除该提交 . 首先,找出提交的回程(大约) . 然后做:
~N
表示最后一次N
提交(N
必须是数字,例如HEAD~10
) . 然后,您可以编辑Git提供给您的文件以删除违规提交 . 在保存该文件时,Git将重写所有以下提交,就好像您删除的那个提交不存在一样 .Git Book有一个很好的section on rebasing图片和例子 .
但要小心这一点,因为如果你改变了其他地方的东西,除非你打算做一个强制推动,否则需要采用另一种方法 .
Forcefully Change History
假设您不只是想删除最后一次提交,但是想要删除最后n次提交的特定提交,请使用:
git rebase -i HEAD~<number of commits to go back>
,所以git rebase -i HEAD~5
如果你想看到最后五次提交 .然后在文本编辑器中将要删除的每个提交旁边的单词
pick
更改为drop
. 保存并退出编辑器 . 瞧!Additively Change History
试试
git revert <commit hash>
. Revert将创建一个撤消指定提交的新提交 .如果您已经推送过,首先找到您想要在HEAD($ GIT_COMMIT_HASH_HERE)的提交,然后运行以下命令:
然后每个地方克隆了repo,运行:
将代码备份到临时文件夹中 . 以下命令将重置为与服务器相同 .
如果您想保留更改,请删除最近的提交
PS:CommitId指的是您想要恢复的那个
错误:
我
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中掩盖了n00b的新功能巨魔 .解决方案:
git rebase -i <SHA>
然后d, drop = remove commit
.为了验证,我检查了另一个分支,瞧 - 没有隐藏提交从主服务器获取/拉取 .
https://twitter.com/holman/status/706006896273063936
祝你好运
资料来源:https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8
删除最后一次提交
For example your last commit
git push origin aa61ab32 ^:master
现在您要删除此提交,然后以简单的方式执行此操作
脚步
首先将分支重置为当前提交的父级
强制将其推入遥控器 .
git push origin -f
对于特定提交,您要重置以下内容
git reset --hard
git push origin HEAD --force
If one or more of the commits is tagged, delete the tag(s) first. 否则不会删除标记的提交 .
如果要修复最新的提交,可以通过执行以下操作来撤消提交,并取消暂存其中的文件:
这将使您的存储库返回到分阶段执行文件的git add命令之前的状态 . 您的更改将在您的工作目录中 . HEAD~1指的是分支当前尖端下面的提交 .
如果要取消提交N提交,请在工作目录中保持代码更改:
如果你想摆脱最新的提交,并且不想保持代码更改,你可以进行“硬”重置 .
同样,如果要丢弃最后N次提交,并且不想保持代码更改:
使用git revert https://git-scm.com/docs/git-revert . 它将恢复所有代码然后你可以做下一次commit.Then head将指向最后一次提交 . 还原提交永远不会删除,但它不会影响您上次提交 .
Removing an entire commit
显然,将“SHA”替换为您想要的引用摆脱 . 该命令中的“^”是文字 .
http://sethrobertson.github.io/GitFixUm/fixup.html
在本地分支上重置
强制推动原点
如果要保留历史记录,显示提交和还原,则应使用:
输入消息,解释你为什么要还原,然后:
当您发出
git log
时,您将看到"wrong"提交和还原日志消息 .如果你搞砸了你的最后一次提交(错误的消息,忘了添加一些更改)并希望在将其推送到公共仓库之前修复它,为什么不使用:
如果你有新的阶段性更改,它们将与最后一次提交(你试图摆脱)相结合,并将替换该提交 .
当然,如果您在推送之后修改了提交,那么您将重写历史记录,因此如果您这样做,请务必了解其含义 .
如果您希望使用先前的提交消息,也可以传递'--no-edit'选项而不是'-m' .
文件:http://git-scm.com/docs/git-commit.html
我在下面提到了两个链接,没关系 .
http://christoph.ruegg.name/blog/git-howto-revert-a-commit-already-pushed-to-a-remote-reposit.html https://gist.github.com/gunjanpatel/18f9e4d1eb609597c50c2118e416e6a6
这里'2'是您要重新设置的提交数 .
如果你想重新提交所有提交 .
然后,您将能够选择其中一个选项 .
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”或删除具有提交的行来删除该提交 .
正如您在上面的图像中看到的,我想删除revert "test change 2" commit(SHA1 ID: 015b5220c50e3dfbb1063f23789d92ae1d3481a2 (您可以通过在git bash中使用
gitk
命令获取SHA1 ID)) .为此,我可以使用(以下所有命令仅在本地工作 . 删除后需要推送):
git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2
//它备份你到那个提交( test change 4 提交的SHA1 ID是 515b5220c50e3dfbb1063f23789d92ae1d3481a2 )git reset --hard HEAD~1
//它在一次提交之前备份你 .git reset --hard HEAD^
//从git中删除最后一次提交删除后:
要在本地分支中删除,请使用
要在远程分支中删除,请使用
这是另一种方法:
检查要还原的分支,然后将本地工作副本重新设置为您希望成为远程服务器上最新版本的提交(之后的所有内容将再次出现) . 为此,在SourceTree中我右键单击并选择“将BRANCHNAME重置为此提交” . 我认为命令行是:
由于您刚刚从远程检出了您的分支,因此您不会有任何本地更改以担心丢失 . 但如果你这样做会失去它们 .
然后导航到存储库的本地目录并运行以下命令:
这将删除本地存储库中当前提交之后的所有提交,但仅删除该一个分支 .
假设您尚未推送到远程存储库,则可以重新克隆存储库 . 这几次是我的选择方法 .
另一种可能性是我最喜欢的命令之一:
这将在交互模式
-i
中在您想要敲击的提交之前启动rebase . 编辑器将从那时开始列出所有提交 . 删除包含要删除的提交的行并保存文件 . Rebase将完成剩余的工作,仅删除该提交,并将所有其他提交重新放回日志中 .我提交和推送时通常做的事情(如果有人推动他的提交,这解决了问题):
希望这个帮助
Careful:
git reset --hard
将删除您的工作目录更改 . 运行此命令之前,请务必使用 stash any local changes you want to keep .假设你正坐在那个提交上,那么这个命令就会搞砸......
HEAD~1
表示在head之前提交 .或者,您可以查看
git log
的输出,找到要备份的提交的提交ID,然后执行以下操作:如果你已经推了它,你需要做一个强制推动来摆脱它......
However ,如果其他人可能已经拉了它,那么你最好开始一个新的分支 . 因为当他们拉动时,它会将它合并到他们的工作中,并且你会再次将它推回去 .
如果您已推送,最好使用
git revert
来创建将撤消更改的"mirror image"提交 . 但是,这两个提交都将在登录 .仅供参考 - 如果您想要摆脱WORK IN PROGRESS,我们很高兴
git reset --hard HEAD
. 它会将您重置为最近的提交,并清除工作树和索引中的所有更改 .最后,如果您需要找到"deleted"的提交,它通常存在于
git reflog
中,除非您有垃圾收集您的存储库 .如果您没有发布更改,则可以执行删除最新提交
(请注意,这也会删除所有未提交的更改;请谨慎使用) .
如果您已发布要删除的提交,请使用git revert
假设我们要从repo中删除提交2和4 .
注意: You need to have admin rights over the repo 因为您正在使用
--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
将主控推送到远程仓库 .I'm appending this answer because I don't see why anyone who has just tried to commit work would want to delete all that work because of some mistake using Git!
如果你想保留你的工作并且只是'撤消'那个提交命令(你在推送回购之前就 grab 了):
Do not use the --hard flag除非您想要销毁自上次提交以来正在进行的工作 .