背景:Commit了一上午的工作,想检查之前一个版本的功能是否有异常,网络一搜索:
Git reset –hard HEAD^
即回退到上一个版本
却不曾想,回退后,一上午的工作没了?!怎么办?git log
中也没有了commit id
查个资料
git reset 版本回退
基本参数:
reset 参数–soft、 –mixed、 –hard,会对状态 working、index、head 进行重置
git reset –mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息 git reset –soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可 git reset –hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容,此命令 慎用!
head:这是当前分支版本顶端的别名,也就是在当前分支你最近的一个提交 Index:index也被称为staging area,是指一整套即将被下一个提交的文件集合。他也是将成为HEAD的父亲的那个commit working :你正在工作的那个文件集
以为是--hard
的问题,后来发现不管是哪个参数,回退后都无法在git log
输出中看到。
git reflog show命令很好的帮助了我们!
1
2
3
4
5
f509443 (HEAD -> MetaNetworks) HEAD@{0}: checkout: moving from 00149b4a5c45321ee3c62261c81c65ce9c1db272 to MetaNetworks
00149b4 HEAD@{1}: commit (merge): Merge branch 'MetaNetworks' of xxx
176233d HEAD@{2}: checkout: moving from MetaNetworks to HEAD@{9}
f509443 (HEAD -> MetaNetworks) HEAD@{3}: reset: moving to HEAD
f509443 (HEAD -> MetaNetworks) HEAD@{4}: reset: moving to HEAD@{9}
输入git checkout HEAD@{1}
即可向前恢复
总结
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
Extras
git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit
第一: 上面我们说的如果你已经push到线上代码库, reset 删除指定commit以后,你git push可能导致一大堆冲突.但是revert 并不会.
第二: 如果在日后现有分支和历史分支需要合并的时候,reset 恢复部分的代码依然会出现在历史分支里.但是revert 方向提交的commit 并不会出现在历史分支里.
第三:
reset 是在正常的commit历史中,删除了指定的commit,这时 HEAD 是向后移动了,而 revert 是在正常的commit历史中再commit一次,只不过是反向提交,他的 HEAD 是一直向前的.
原文链接:https://blog.csdn.net/wrfff/article/details/79238839
Rebase压缩
git rebase
使用 git rebase 合并多次commit。 当你提交的代码后,管理员发现,您的代码不能提交到服务器上,主要原因在于,你的commit 中和服务器中的有些commit不再同一时间轴上,即:你的有些commit要插入到服务器中的某些commit之间,这样就会造成代码的冲突。所以这个时候就要使用git rebase。
1.1 使用 git log 查看历史提交记录
1.2 合并最后四次的提交
git rebase -i HEAD~4
1.3 修改第2-4行的第一个单词pick为squash
1.4 然后保存退出,git会压缩提交历史,如果有冲突,需要修改,修改的时候要注意,保留最新的历史,不然我们的修改就丢弃了
1.5 修改以后要记得敲下面的命令
1
2
git add .
git rebase --continue
1.6 如果你想放弃这次压缩的话,执行以下命令: git rebase –abort ———————————————— 原文链接:https://blog.csdn.net/wrfff/article/details/79238839