本文只闡述如何解決問題,不會對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等命令。
總結
對於前三種情況,雖然git revert也適用,但是如要要保持版本歷史干凈的話,建議還是用 git reset3,但是希望保留完整的歷史的話,還是使用git revert為好。對於和其他人協同的項目,使用git rever是最好的。