本文隻闡述如何解決問題,不會對git的各種概念多做介紹,如果有興趣可以點選下面的連結,進行詳細的學習:
Pro Git
本文适用的環境
現在先假設幾個環境,本文将會給出相應的解決方法:
1. 本地代碼(或檔案)已經add但是還未commit;
2. 要回退的commit的代碼已經commit了,但是還未push到遠端個人repository
3. 要回退的commit的代碼已經push到遠端的個人分支,但是還未merge到公共的repository
4. 要回退的commit的代碼已被merge(合入)到公共的repository
關鍵的幾個指令
git reset [commit]
git revert [commit]
git reset有三個參數soft,mixed,hard分别對應head的指針移動,index(暫存區)、以及工作目錄的修改,當預設時,預設為mixed參數。
git revert與reset的差別是git revert會生成一個新的送出來撤銷某次送出,此次送出之前的commit都會被保留,也就是說對于項目的版本曆史來說是往前走的。而git reset 則是回到某次送出,類似于穿越時空。
相應的解決方法
1、 對于上面的前兩種情況,我們可以直接使用git reset指令。根據需要的不同使用,不同的參數。但是要注意
git reset –hard
是一個危險的指令,他是git少數幾個會銷毀資料的指令之一,如果你不小心放了錯,你也許可以使用
git reflog
指令來找回你的資料。
2、 對于第三種情況,如果你的遠端分支隻有你一個人用的話,那麼可以在先使用git reset [commit]回退,如何使用git push -f [commit]來強制更新你的遠端庫2
3、 對于最後一種情況,考慮到其他人的版本曆史,使用git reset [commit]是不建議的,此時我們應該使用git revert [commit]改指令不會修改之前的送出曆史,相當于對資料做了一次逆操作,然後再執行add,commit等指令。