2014-09-21 63 views
1

有人可以解釋git-revert是如何工作的。Git恢復誤解

目前我在我的應用程序中犯了一些錯誤,並將更改推送到master分支。現在我發現了工作提交,並且我想將我的主分支重置爲該工作提交。

所以我的問題是,如果我輸入git-revert 145bb80,我會怎麼做,我的所有文件都將與它最初的這個提交相同:145bb80?

回答

2

所以我的問題是,如果我輸入git-revert 145bb80,我會怎麼做,我的所有文件都與原來的提交相同:145bb80?

好問題,答案是否定的。我想你是從Subversion土地出來的(就像我一樣),回覆意味着不同的東西 - 這是對你的工作副本的一個行動,而不是存儲庫。在Git land中,git revert旨在反轉單個提交的更改,而不是將整個樹還原到特定狀態。

你正在尋找的命令是git reset - 雖然有一些形式是爲了工作樹和索引。有幾種不同的形式。如果你想讓分支指向145bb80,那麼你將在該分支上運行git reset --hard 145bb80。結果有兩件事:

1)你的分支將被強制指向145bb80。發生的任何其他提交都將丟失。這是一種重寫歷史的形式,因此確保它是你想要做的。如果您嘗試推送分支,您也會遇到錯誤。它會告訴你這不是一個快進的提交,你需要git push --force來強制它在遠程存儲庫上。再次,要小心。確定這是你的團隊想要的。

2)git reset --hard將刪除索引和工作樹中的所有本地更改。所以如果你想保留它們,你需要在使用git reset --hard之前將它們藏起來。

還有另一種選擇,危險性要低得多。這將是恢復回覆。這聽起來有點愚蠢,但它讓你的歷史繼續快速前進。

另外,如果你單純的喜歡,因爲它是在一個145bb80文件的副本,那麼你就可以做到這一點使用:

git checkout 145bb80 -- path/to/file 

您可以使用下面的樹恢復到內容它是在145bb800

git checkout 145bb80 -- . 

再次,雖然,要小心那種命令的,你可能會失去工作。

最好的辦法是簡單地將壞提交git revert恢復,以避免撤消別人的工作。

+0

很好的答案,但我也想提一提'git checkout -p',它可以讓你輕鬆地「恢復」提交的某些部分。 – 2014-09-21 09:47:36

+0

我是唯一使用此分支的人。所以總結一下,如果我做git reset --hard 145bb80,我會擁有和以前一樣的文件嗎? – Alen 2014-09-21 09:50:46

+0

git reset在這裏並不適合,因爲他向上遊推送了他的更改,並且使用重置會讓您的樹狀態處於無法繼續推送的狀態。 Git checkout確實可以起作用,但是會產生類似於使用git revert的效果,因爲您正在創建一個新的提交。 – 2014-09-21 09:51:01

1

Git revert創建了一個新的提交,它與要撤消的提交相反。所以,這絕對是你想要的,因爲你已經推動了你的改變,你也需要撤消上游的改變(我假設)。它確實會讓你的文件恢復到你想要的狀態。它當然不會消除你錯誤的歷史。

您還可以使用還原爲一系列的提交:

git revert OLDER_COMMIT^..NEWER_COMMIT 
1

如果您有推更改遠程倉庫,你最好不要使用命令git reset,尤其是--hard,這是很危險的。遠程存儲庫可能不允許強制推送,因爲git reset將修改您的提交歷史記錄並進行推送非轉發合併。即使允許,它也可能會破壞已經從git服務器(遠程中央存儲庫)提取的其他人的歷史記錄。

使用git revert是優選的。它會創建一個新的提交來扭轉您之前錯誤提交的效果。