git

轉載自:http://dmouse.iteye.com/blog/1797267

git 的錯誤操作,導致丟失了重要的commit,真是痛不欲生; 
最後通過git神器終於找回了丟失的commit,但是需要總結和反思的地方有一些,同時需要加深git的學習,特獻上本文以供參考 

執行git reset --hard HEAD~1 ,刪除了commit3,但是發現reset錯了,暈菜了…… 
還好有後悔藥(感嘆git的強大啊,神馬意外情況都考慮到了)滿血恢復commit3,執行如下步驟: 
Java代碼  收藏代碼
  1. git reflog  
  2. 502dd0f HEAD@{0}: HEAD~1: updating HEAD  
  3. 147b3b5 HEAD@{1}: commit: test3  
  4. 502dd0f HEAD@{2}: commit: test2  
  5. 0692c03 HEAD@{3}: commit (initial): test1  
  6.   
  7. git reset --hard 502dd0f  
  8. 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神器終於找回了丟失的commit,但是需要總結和反思的地方有一些,同時需要加深git的學習,特獻上本文以供參考 

執行git reset --hard HEAD~1 ,刪除了commit3,但是發現reset錯了,暈菜了…… 
還好有後悔藥(感嘆git的強大啊,神馬意外情況都考慮到了)滿血恢復commit3,執行如下步驟: 
Java代碼  收藏代碼
  1. git reflog  
  2. 502dd0f HEAD@{0}: HEAD~1: updating HEAD  
  3. 147b3b5 HEAD@{1}: commit: test3  
  4. 502dd0f HEAD@{2}: commit: test2  
  5. 0692c03 HEAD@{3}: commit (initial): test1  
  6.   
  7. git reset --hard 502dd0f  
  8. 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中發生變化的文件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章