Git

由Git Reset引发的惨案

Git NB

Posted by MetaNetworks on March 1, 2020
本页面总访问量

背景:Commit了一上午的工作,想检查之前一个版本的功能是否有异常,网络一搜索:

Git reset –hard HEAD^

即回退到上一个版本

却不曾想,回退后,一上午的工作没了?!怎么办?git log 中也没有了commit id

QQ20200301-114409.png


查个资料

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