如果你搞砸了你的最后一次提交(错误的消息,忘记添加一些更改)并希望在将其推送到公共仓库之前修复它,为什么不使用:
git commit --amend -m "New message here"
如果你有新的阶段性更改,它们将与最后一次提交(你试图摆脱)相结合,并将替换该提交。
当然,如果您在推送之后修改了提交,那么您将重写历史记录,因此如果您这样做,请务必了解其含义。
如果您希望使用先前的提交消息,也可以传递'--no-edit'选项而不是'-m'。
文档: http://git-scm.com/docs/git-commit.html
我已经推了。需要快速返回一些提交。 尝试了很多变化, 但是只有 这个 从 贾斯汀 通过git bush对我来说很好:
git reset --hard $GIT_COMMIT_HASH_HERE git push origin HEAD --force
如果您没有发布更改,则可以执行删除最新提交
$ git reset --hard HEAD^
(请注意,这也会删除所有未提交的更改;请谨慎使用)。
如果您已经发布了要删除的提交,请使用 编辑
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”或删除具有提交的行来删除该提交。
资源: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8
的 例如你最后一次提交 强>
git push origin + aa61ab32 ^:master
现在您要删除此提交,然后以简单的方式执行此操作
脚步
首先将分支重置为当前提交的父级
强制将其推入遥控器。
git reset HEAD^ --hard git push origin -f
对于特定提交,您要重置以下内容
git reset bb676878^ --hard git push origin -f
如果要保留历史记录,显示提交和还原,则应使用:
git revert GIT_COMMIT_HASH
输入消息,解释你为什么要还原,然后:
git push
当你发出 git log 您将看到“错误”提交和还原日志消息。
git log
将代码备份到临时文件夹中。以下命令将重置为与服务器相同。
git reset --hard HEAD git clean -f git pull
如果您想保留更改,请删除最近的提交
git reset --soft HEAD^ git pull
要在本地分支中删除,请使用
git reset --hard HEAD~1
要在远程分支中删除,请使用
git push origin HEAD --force
的 删除整个提交 强>
git rebase -p --onto SHA^ SHA
显然用您想要删除的引用替换“SHA”。该命令中的“^”是文字。
http://sethrobertson.github.io/GitFixUm/fixup.html
git reset --hard
的 如果标记了一个或多个提交,请首先删除标记。 强> 否则,不会删除标记的提交。
使用git revert https://git-scm.com/docs/git-revert 它将恢复所有代码然后你可以做下一次提交。然后头将指向最后一次提交。恢复提交永远不会删除,但它不会影响你上次提交。
上面的所有命令都会在进行提交之前恢复工作树和索引的状态,但不会恢复存储库的状态。如果你看一下,“删除”提交实际上并没有被删除,它根本就不是当前分支顶端的提交。
我认为没有办法删除提交 瓷器命令 。唯一的方法是从日志和reflog中删除它,然后执行a git prune --expire -now 。
git prune --expire -now
我提交和推送时通常做什么(如果有人推动他的提交,这解决了问题):
git reset --hard HEAD~1 git push -f origin
希望这个帮助
如果您尚未将提交推送到任何地方,则可以使用 git rebase -i 删除该提交。首先,找出提交的回程(大约)。然后做:
git rebase -i
git rebase -i HEAD~N
该 ~N 意味着改变最后一个 N 提交( N 例如,必须是一个数字 HEAD~10 )。然后,您可以编辑Git提供给您的文件以删除违规提交。保存该文件后,Git将重写所有以下提交,就好像您删除的提交不存在一样。
~N
N
HEAD~10
Git Book有一个很好的 关于变基的部分 有图片和例子。
不过要小心,因为如果你改变了一些东西 有 推到别处,除非你打算做一个强制推动,否则将需要另一种方法。
的 小心: 强> git reset --hard 将删除您的工作目录更改 。务必 的 存储您想要保留的任何本地更改 强> 在运行此命令之前。
假设你正坐在那个提交上,那么这个命令就会搞砸......
该 HEAD~1 表示在头之前提交。
HEAD~1
或者,你可以看看输出 git log ,找到要备份的提交的提交ID,然后执行以下操作:
git reset --hard <sha1-commit-id>
如果你已经推了它,你需要做一个强制推动来摆脱它......
的 然而 强> ,如果其他人可能已经拉了它,那么你最好开始一个新的分支。因为当他们拉动时,它会将它合并到他们的工作中,并且你会再次将它推回去。
如果你已经推了,可能会更好用 git revert ,创建一个将撤消更改的“镜像”提交。但是,两个提交都将在日志中。
git revert
仅供参考 - git reset --hard HEAD 如果你想摆脱WORK IN PROGRESS,那就太棒了。它会将您重置为最近的提交,并清除工作树和索引中的所有更改。
git reset --hard HEAD
最后,如果您需要查找“已删除”的提交,则通常会将其存在 git reflog 除非你有垃圾收集你的存储库。
git reflog
git reset --hard commitId git push <origin> <branch> --force
PS:CommitId指的是您想要恢复的那个
在本地分支上重置
git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3
强制推动原点
git push -f origin
正如您在上面的图像中看到的,我想删除还原“测试更改2”提交(SHA1 ID: 的 015b5220c50e3dfbb1063f23789d92ae1d3481a2 强> (您可以使用获取SHA1 ID gitk 命令在git bash))。
gitk
为此我可以使用(以下所有命令仅在本地工作。删除后需要推送):
git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2
git reset --hard HEAD^
删除后:
的 我正在追加这个答案,因为我不明白为什么那些刚刚尝试提交工作的人会因为使用Git的一些错误而删除所有工作! 强>
如果你想保留你的工作并且只是'撤消'那个提交命令(你在推送回购之前就抓住了):
git reset --soft HEAD~1
的 不要使用--hard 强> 标志,除非您想要销毁自上次提交以来正在进行的工作。
如果要修复最新的提交,可以通过执行以下操作来撤消提交,并取消暂存其中的文件:
git reset HEAD~1
这将使您的存储库返回到分阶段执行文件的git add命令之前的状态。您的更改将在您的工作目录中。 HEAD~1指的是分支当前尖端下面的提交。
如果要取消提交N提交,请在工作目录中保持代码更改:
git reset HEAD~N
如果你想摆脱最新的提交,并且不想保持代码更改,你可以进行“硬”重置。
同样,如果要丢弃最后的N次提交,并且不想保持代码更改:
git reset --hard HEAD~N
假设您没有推送到远程存储库,则可以重新克隆存储库。这几次是我的选择方法。
另一种可能性是我最喜欢的命令之一:
git rebase -i <commit>~1
这将以交互模式启动rebase -i 在你要提交的提交之前的那一刻。编辑器将从那时开始列出所有提交。删除包含要删除的提交的行并保存文件。 Rebase将完成剩余的工作,仅删除该提交,并将所有其他提交重新放回日志中。
-i