原文网址:git--恢复/撤销 相关命令--使用/实例_IT利刃出鞘的博客-CSDN博客
简介
本文介绍git恢复和撤销相关的命令。
检出(从暂存区恢复到工作区)
命令 |
作用 |
git checkout <pathspec> |
恢复暂存区的指定文件到工作区。 若<pathspec>项为“.”,则恢复暂存区的所有文件到工作区。 用于撤销本地的修改。常用撤销命令:git checkout . 解决“HEAD detached from”问题。命令:git checkout <branch> |
检出(从本地仓库恢复到暂存区和工作区)
命令 | 作用 |
git checkout <branch> | 恢复本地仓库某个commit的文件到暂存区和工作区。 不会detach head |
git checkout [--detach] <commit> git checkout --detach [<branch>] |
恢复本地仓库某个commit的文件到暂存区和工作区。 而且会detach head |
git checkout [tag_name] |
恢复本地仓库某个tag的文件到暂存区和工作区。 |
重置(撤销git add/commit)
命令 |
作用 |
git reset [file] |
重置暂存区的指定文件,但工作区不变。 用于git add的撤销。常用: git reset head . |
git reset [mode] [commit] |
重置当前分支的HEAD为指定commit。此[commit]之后的[commit]会彻底删除。 commit:可不写,默认是HEAD。可写为HEAD^,表示上一次commit;HEAD~3:表示3次提交前。 mode:可不写,默认是mixed。 用于git commit的撤销。常用:git reset --soft HEAD^; git reset --soft [commit] 用于本地代码回退。 常用:git reset --hard HEAD; git reset --hard [commit] |
git reset的mode
mode |
作用 |
--soft |
版本库改变。暂存区不变。工作区不变。 //HEAD指向给定提交 |
--mixed |
版本库改变。暂存区改变。工作区不变。//重置暂存区到指定commit (git reset默认的模式) |
--hard |
版本库改变。暂存区改变。工作区改变。//三者全都同步到给定提交 所有工作区追踪的文件的修改都丢弃(若远程已删除相关文件,则git push之后,本地文件也会直接被删掉!)。 |
--merge |
重置暂存区到指定commit,更新工作区[commit]与当前HEAD不一样的地方,工作区与暂存区不一样的地方保持不变。 |
--keep |
重置暂存区到指定commit,更新工作区[commit]与当前HEAD不一样的地方。如果[commit]与当前HEAD不一致的文件在本地有了修改,则取消操作。 |
回滚(撤销git push)
命令 | 作用 |
git revert [commit] |
重置当前分支的HEAD为指定commit。此[commit]之后的[commit]保持不变。 用于git push的撤销。常用:git revert [commit]; git commit xxx; git push |
git stash git stash pop |
暂时将未提交的变化移除,稍后再移入。 |
git reset --hard的作用
已commit的恢复
1.找到之前提交的版本
git reflog
2.恢复到上一版本
git reset --soft head^
之后就可以git add;git commit等
未commit但add过的恢复
此时git reflog没有对应信息。
1. 打印未commit的信息
git fsck --lost-found
2.打印误删除的文件内容
git show xxx
xxx为上边打印出的dangling blob后边的一大长串字符串。
3.打印commit和tree内容
git cat-file -p xxx
xxx为上边打印出的dangling commit后边的一大长串字符串。执行完后打印commit和tree内容
可把这个commit合并到我们的分支里。可通过reset merge rebase cherry-pick这些命令来合commit。
4.列出tree下面的文件名和id的记录信息
git ls-tree xxx
xxx为上边打印出的dangling commit后边的一大长串字符串。
执行完后列出tree下面的文件名和id的记录信息,然后就可以根据blob的id来恢复文件了回滚到某个版本的命令
将所有代码回滚到某个commit
1.查看要回到的那个版本
git log
2.回退到上个版本
git reset --hard HEAD^ 回退到上个版本
git reset --hard commit_id 退到/进到 指定commit_id
3.把回退的某个版本提交到远程
git push origin HEAD --force
回滚之后,又后悔了,想恢复到新的版本怎么办?用git reflog打印你的每一次操作记录。
git reflog 可以查看所有分支的所有操作记录(包括commit和reset的操作),包括已经被删除的commit记录,git log则不能查看已经删除了的commit记录,而且跟进结果可以回退到某一个修改。
把单个文件回退到某一版本
暂定此文件为a.jsp
1.查看a.jsp的更改记录
到a.jsp所在目录:
git log a.jsp
找到想要回退的版本号:例如 fcd2093
2.回退文件版本
git reset fcd2093 a.jsp
3.提交本次回退
git commit -m "注释内容"
4.选中该文件
git checkout a.jsp
5.push到远程目录
git push
其他网址
git回滚到某个commit 上和 返回最新的版本git - 开始战斗 - 博客园