git关于恢复、重置和生成指定新版本分支的问题
恢复和重置涉及的命令:git log 、git reset、git revert、git reflog
git log
git log [<options>] [<revision range>] [[--] <path>…] 查看commit的提交记录
e.g :
git log 查看全部提交记录
git log -5查看前五次提交记录
git log -5 a.txt 查看涉及a.txt前五次的提交记录
git log -5 -- a.txt 查看涉及a.txt前五次的提交记录
git reset
git reset --hard commitID(或者HEAD^)
git reset --soft commitID(或者HEAD^)
git reset --mixed commitID(或者HEAD^)
--hard --soft --mixed选项的区别:
--hard 会丢弃所有的改变并且清空工作区和缓存区,
--soft将commit到本地仓库的文件还原到工作区,但是缓存区中的内容不变,
--mixed将commit到本地仓库和缓存区中的内容都还原到工作区
e.g:
git reset --hard HEAD^ 丢弃最后一次的更改
git reset --hard HEAD^^ 丢弃最新两次的更改
git revert
git revert [<commit>](或者HEAD^)
e.g:
git revert HEAD^ 丢弃最后一次的更改
git revert HEAD^^ 只丢弃第二新的更改
reset和revert的区别
revert会建立一个新的commit,只恢复要恢复的commit
reset会丢弃你要重置之后的commit,等于重置到指定commit的版本
git reflog
可以查看已经删除的commitId
1、项目组要求拉取一个分支,这个分支是我们主版本的指定版本,假定我们的主版本的分支名字就叫git-test,新版本分支叫git-feature我先来把操作命令写下来
git log 列出提交目录 git checkout e9f771353f2aa215ce962b5beb64a0bfd4a161f2 切换到指定commitId git switch -c git-feature 以上一步的commitId为版本建立分支git-feature git push -u origin git-feature 推到远程仓库的新分支中,远程仓库的名字为origin,分支名为git-feature
git log
git checkout e9f771353f2aa215ce962b5beb64a0bfd4a161f2
git switch -c git-feature
git push -u origin git-feature
git status
完成!
2、项目成员小王误提交了idea的配置文件并且已经推送到远程仓库,之后小李和小张也提交了代码并且推送到了远程仓库。假定分支名为git-feature,我们来帮他回退,我先把命令写下来:
git log -5 查看前五条提交记录
git revert e9f771353f2aa215ce962b5beb64a0bfd4a161f2 回退小王的commitId
git push 把恢复的内容推到远程仓库
git log -5
git revert d7c99e8c9dea2f2b4cb289fe732e70b83bac486e
git push
git log -6
3、项目成员小王误提交了idea的配置文件并且已经推送到远程仓库,之后小李和小张也提交了代码并且推送到了远程仓库,小王和小张,小李沟通,发现他们的提交内容也有问题,想一起回退掉。假定分支名为git-feature,我们来帮他回退,我先把命令写下来:
git log -6
查看提交日志
git reset --hard e9f771353f2aa215ce962b5beb64a0bfd4a161f2 重置到指定版本(注意这个commitId是你想重置的commitId,一般是你提交的前一个commitId。而revert的commitId是你要恢复的commitId,
一般是你提交的commitId)
git log -5 查看提交日志
git log -6
git reset --hard e9f771353f2aa215ce962b5beb64a0bfd4a161f2
git log -5
三个人的commit全都删除了,分支分回到了小王提交的前一个版本。
ps: HEAD^ 最新的commitID HEAD^^ 第二新的commitID HEAD^^^ 第三新的commitID HEAD^^^... 一次类推