Git撤銷提交

本文連接:http://volnet.github.io/#!docs/git/reset-to-old-version.mdgit

在使用Git進行版本管理的時候,常常會遇到一些錯誤的提交。github

在開始演示以前,咱們先創建一個測試的環境。服務器

mkdir gittest
cd gittest
git init

echo "a" >> a.md
git add .
git commit -m "add a.md"

echo "b" >> b.md
git add .
git commit -m "add b.md"

echo "c" >> c.md
git add .
git commit -m "add c.md"

rm -rf a.md
git add .
git commit -m "remove a.md"

git remote add origin http://gitserver-url

 

方法一:git revert(推薦)

推薦理由:git revert將保留commit歷史。假設有a、b、c三次順序提交,那麼假設被回滾到a,則b、c仍然存在,同時會多出d。
 
git log --oneline

931568f remove a.md
f622cef add c.md
2a0c5a9 add b.md
6fbba34 add a.md

# 假設要回到2a0c5a9

git revert -n 2a0c5a9..931568f

# ls能夠看到工做目錄中的文件已經恢復到當時的狀態,這個時候查詢git status將看到 2a0c5a9 commit前的狀態。

# 這時候須要從新提交文件

git commit -m "revert 2a0c5a9..931568f and recommit"

git push

 

方法二:git reset --hard(不推薦)

 

不推薦理由:git reset將使歷史沒法恢復。假設有a、b、c三次順序提交,那麼假設被回滾到a,則b、c將不復存在。
 
git log --oneline 

931568f remove a.md
f622cef add c.md
2a0c5a9 add b.md
6fbba34 add a.md

# 假設咱們要恢復到2a0c5a9,則能夠

git reset --hard 2a0c5a9

# 此時ls你將看到a.md

git push -f

#這裏須要增長-f或者--force命令,緣由當前的HEAD指針指向了一箇舊版本,而服務器上這個版本不是最新版本。其實服務器並不知道你是使用reset命令獲得的舊版本,覺得你是一個長期沒有獲取最新版本的用戶,提交了一個錯誤的版本。所以它會建議你git pull以後再更新。若是你很是明確你要這麼作,而且不關心你目標版本以後的版本(可能包含別人的提交),你大能夠就此使用-f來強制提交。同時你將得到一個乾淨的歷史,就像什麼都沒有發生過同樣。
相關文章
相關標籤/搜索