From : http://dmouse.iteye.com/blog/1797267git
git 的錯誤操做,致使丟失了重要的commit,真是痛不欲生;
最後經過git神器終於找回了丟失的commit,可是須要總結和反思的地方有一些,同時須要加深git的學習,特獻上本文以供參考
執行git reset --hard HEAD~1 ,刪除了commit3,可是發現reset錯了,暈菜了……
還好有後悔藥(感嘆git的強大啊,神馬意外狀況都考慮到了)滿血恢復commit3,執行以下步驟: 學習
丟失的commit3終於回來啦~~~~
雖然有利器,可是須要總結和反思的是,慎用reset hard啊,實在不行reset merge也是不錯的選擇。
===================================================
經過此次錯誤的使用reset,反思須要增強對reset的瞭解,不能再盲目的使用了
git reset [--hard|soft|mixed|merge|keep] [<commit>或HEAD]
做用:將當前分支reset到指定的<commit>或者HEAD(默認爲最新的一次提交,即重設到最新一次提交以前的版本)
備註:
index,執行git add的操做,會對文件建立索引,全部被跟蹤的文件索引會放入index,表示文件被修改待提交
working tree,當前工做區,被修改但未被add的文件,存儲在工做區
ORIG_HEAD,用於指向前一個操做狀態,每次的commit或者pull或者reset,git 都會把老的HEAD拷貝到.git/ORIG_HEAD,經過對ORIG_HEAD的引用可 以指向前一次的操做狀態
一、hard(慎用)
重設index和working tree,全部改變都會被丟棄,包括文件的修改、新增、刪除等操做,並把HEAD指向<commit>,
所以經過git log查看版本提交記錄,被reset的版本記錄會被丟棄,但能夠經過git reflog查看
二、soft
不重設index和working tree,僅僅將HEAD指向<commit>,表示已經commit的文件會取消commit,
經過git status查看,文件會處於待commit狀態「Changes to be committed」
三、mixed(默認)
重設index,但不重設working tree,表示已經被add的文件,被取消add,
經過git status查看,文件會處於待添加索引狀態 「Changes not staged for commit」
四、merge
重設index,重設working tree中發生變化的文件,可是保留index和working tree不一致的文件
五、keep
重設index,重設working tree中發生變化的文件spa