轉載自:http://dmouse.iteye.com/blog/1797267
最後通過git神器終於找回了丟失的commit,但是需要總結和反思的地方有一些,同時需要加深git的學習,特獻上本文以供參考
執行git reset --hard HEAD~1 ,刪除了commit3,但是發現reset錯了,暈菜了……
還好有後悔藥(感嘆git的強大啊,神馬意外情況都考慮到了)滿血恢復commit3,執行如下步驟:
- git reflog
- 502dd0f HEAD@{0}: HEAD~1: updating HEAD
- 147b3b5 HEAD@{1}: commit: test3
- 502dd0f HEAD@{2}: commit: test2
- 0692c03 HEAD@{3}: commit (initial): test1
- git reset --hard 502dd0f
- git cherry-pick 147b3b5
丟失的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的引用可 以指向前一次的操作狀態
1、hard(慎用)
重設index和working tree,所有改變都會被丟棄,包括文件的修改、新增、刪除等操作,並把HEAD指向<commit>,
因此通過git log查看版本提交記錄,被reset的版本記錄會被丟棄,但可以通過git reflog查看
2、soft
不重設index和working tree,僅僅將HEAD指向<commit>,表示已經commit的文件會取消commit,
通過git status查看,文件會處於待commit狀態“Changes to be committed”
3、mixed(默認)
重設index,但不重設working tree,表示已經被add的文件,被取消add,
通過git status查看,文件會處於待添加索引狀態 “Changes not staged for commit”
4、merge
重設index,重設working tree中發生變化的文件,但是保留index和working tree不一致的文件
5、keep
重設index,重設working tree中發生變化的文件
git引發的血案(cherry-pick找回丟失的commit)
最後通過git神器終於找回了丟失的commit,但是需要總結和反思的地方有一些,同時需要加深git的學習,特獻上本文以供參考
執行git reset --hard HEAD~1 ,刪除了commit3,但是發現reset錯了,暈菜了……
還好有後悔藥(感嘆git的強大啊,神馬意外情況都考慮到了)滿血恢復commit3,執行如下步驟:
- git reflog
- 502dd0f HEAD@{0}: HEAD~1: updating HEAD
- 147b3b5 HEAD@{1}: commit: test3
- 502dd0f HEAD@{2}: commit: test2
- 0692c03 HEAD@{3}: commit (initial): test1
- git reset --hard 502dd0f
- git cherry-pick 147b3b5
丟失的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的引用可 以指向前一次的操作狀態
1、hard(慎用)
重設index和working tree,所有改變都會被丟棄,包括文件的修改、新增、刪除等操作,並把HEAD指向<commit>,
因此通過git log查看版本提交記錄,被reset的版本記錄會被丟棄,但可以通過git reflog查看
2、soft
不重設index和working tree,僅僅將HEAD指向<commit>,表示已經commit的文件會取消commit,
通過git status查看,文件會處於待commit狀態“Changes to be committed”
3、mixed(默認)
重設index,但不重設working tree,表示已經被add的文件,被取消add,
通過git status查看,文件會處於待添加索引狀態 “Changes not staged for commit”
4、merge
重設index,重設working tree中發生變化的文件,但是保留index和working tree不一致的文件
5、keep
重設index,重設working tree中發生變化的文件