關於Git版本回退

  最近公司使用了git,之前都使用的是svn,git玩得不是很溜,現在重新學習一下。

  今天主要探討的是回退,因爲最近我們分支上有人做了回退操作,我這邊pull拉取,發現出了問題,部分文件沒有跟着遠端版本回退,納悶了很久,最後通過 執行 git reset <回退版本> 後,重新 commit 解決了。

  參考了這些資料,寫得還是蠻不錯的:

先看原理:

  三種 reset 的區別

  https://www.cnblogs.com/kidsitcn/p/4513297.html

 https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E9%87%8D%E7%BD%AE%E6%8F%AD%E5%AF%86#_git_reset

  soft reset

--soft參數告訴Git重置HEAD到另外一個commit,但也到此爲止。如果你指定--soft參數,Git將停止在那裏而什麼也不會根本變化。這意味着index,working copy都不會做任何變化,所有的在original HEAD和你重置到的那個commit之間的所有變更集都放在stage(index)區域中。

 

  hard reset

--hard參數將會blow out everything.它將重置HEAD返回到另外一個commit(取決於~12的參數),重置index以便反映HEAD的變化,並且重置working copy也使得其完全匹配起來。這是一個比較危險的動作,具有破壞性,數據因此可能會丟失!如果真是發生了數據丟失又希望找回來,那麼只有使用:git reflog命令了。makes everything match the commit you have reset to.你的所有本地修改將丟失。如果我們希望徹底丟掉本地修改但是又不希望更改branch所指向的commit,則執行git reset --hard = git reset --hard HEAD. i.e. don't change the branch but get rid of all local changes.另外一個場景是簡單地移動branch從一個到另一個commit而保持index/work區域同步。這將確實令你丟失你的工作,因爲它將修改你的work tree!

 

 mixed reset 

--mixed是reset的默認參數,也就是當你不指定任何參數時的參數。它將重置HEAD到另外一個commit,並且重置index以便和HEAD相匹配,但是也到此爲止。working copy不會被更改。所有該branch上從original HEAD(commit)到你重置到的那個commit之間的所有變更將作爲local modifications保存在working area中,(被標示爲local modification or untracked via git status),但是並未staged的狀態,你可以重新檢視然後再做修改和commit

再看使用方式

  三種reset的使用方式:

 https://www.cnblogs.com/songzhenhua/p/11246929.html

--hard:(1) 要放棄目前本地的所有改變時,即去掉所有add到暫存區的文件和工作區的文件,可以執行 git reset -hard HEAD 來強制恢復git管理的文件夾的內容及狀態;(2) 真的想拋棄目標節點後的所有commit(可能覺得目標節點到原節點之間的commit提交都是錯了,之前所有的commit有問題)。

--soft:原節點和reset節點之間的【差異變更集】會放入index暫存區中(Staged files),所以假如我們之前工作目錄沒有改過任何文件,也沒add到暫存區,那麼使用reset --soft後,我們可以直接執行 git commit 將 index暫存區中的內容提交至 repository 中。爲什麼要這樣呢?這樣做的使用場景是:假如我們想合併「當前節點」與「reset目標節點」之間不具太大意義的 commit 記錄(可能是階段性地頻繁提交,就是開發一個功能的時候,改或者增加一個文件的時候就commit,這樣做導致一個完整的功能可能會好多個commit點,這時假如你需要把這些commit整合成一個commit的時候)時,可以考慮使用reset --soft來讓 commit 演進線圖較爲清晰。總而言之,可以使用--soft合併commit節點。

--mixed(默認):(1)使用完reset --mixed後,我們可以直接執行 git add 將這些改變果的文件內容加入 index 暫存區中,再執行 git commit 將 Index暫存區 中的內容提交至Repository中,這樣一樣可以達到合併commit節點的效果(與上面--soft合併commit節點差不多,只是多了git add添加到暫存區的操作);(2)移除所有Index暫存區中準備要提交的文件(Staged files),我們可以執行 git reset HEAD 來 Unstage 所有已列入 Index暫存區 的待提交的文件。(有時候發現add錯文件到暫存區,就可以使用命令)。(3)commit提交某些錯誤代碼,或者沒有必要的文件也被commit上去,不想再修改錯誤再commit(因爲會留下一個錯誤commit點),可以回退到正確的commit點上,然後所有原節點和reset節點之間差異會返回工作目錄,假如有個沒必要的文件的話就可以直接刪除了,再commit上去就OK了。

 

目前來說,我這裏只用到了hard 和 mixed:

hard 我用來做遠端的版本回退,一般是 首先進行 git reset --hard <指定版本> , 之後使用 git push -f 進行強制推送,將最新版本覆蓋成老版本,達到遠端回退的目的。

 

mixed 我這裏的使用方法如下:

   在其他人進行了分支回退,你會發現部分文件在你進行 pull 的時候無法回退,這些文件會出現在你的 push 文件中,但是不會出現在你的 commit 中,參考上面的文檔,可以知道,這是因爲pull的時候,執行的是 merge 操作,部分新增部分會遺留下來,雖然你本地的 commit 沒有這些文件,但是你push 的時候,不僅會記錄你本次的 commit 還會記錄 這些遺留的文件,如果這個時候你一不小心 push 了,就會導致把別人原本回退的東西又重新提交,而且 log 線裏最新的提交中還會出現之前修改的記錄。

  這時候,可以進行 git reset <回退的版本號> , 之後提交時,原本 pull 時沒有一起回退的文件,因爲 reset 將這部分文件清除出了 index 區,因此此時這部分文件就會出現在你的 commit 列表中,將這些文件 revert 一下,或者修改,然後提交 push,這樣就保證了本次 push 的文件沒有遠端回退的內容了。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章