2012-04-17 67 views
23

我有一個web服務器,服務於一個git倉庫的項目。當我對代碼做一些修改時,我會從服務器上做一個git pull。有時候新代碼崩潰了,我希望能夠回滾到最新版本,就像之前那樣。我想用腳本來做到這一點,而不必搜索最新的sha。我怎樣才能做到這一點?Git回滾1拉

編輯:只是想澄清一下,我只想做一個動作,就像按一個按鈕,說「哎呀!我剛剛做的這個最新的拉是一個錯誤,我希望我沒有那樣做」。我不想在這種情況下尋找sha或標籤或其他任何東西,它更像是一個「撤消」功能。 然後,我希望能夠繼續處理代碼,並且服務器上的下一次拉動需要引入最新的更改。

回答

52

git reset --hard HEAD^1將帶你回到你拉的一個提交。如果您希望它恢復到拉動之前的狀態,請使用git reset --hard [email protected]{1}@{1}跟蹤頭部在最後一次操作之前的位置,它在本地回購中更改它,所以如果在您拉動之前推動了幾次提交,它將返回幾次提交。另請參閱git reflog以顯示整個列表。

+1

很有意思,然後我該如何恢復正常運作?我的意思是,如果對錯誤代碼進行一些更正,我可以直接進入服務器並再次執行git以獲取最新更改? – Bastian 2012-04-18 10:18:12

+3

是的,它會處於你從未拉過的狀態,所以你通常會做的任何事情都可以完成。 – 2012-04-18 12:51:00

2

git reset HEAD^應該帶你去上一次提交。有關更多信息,請參見here

+0

它實際上'git的復位 - 硬頭^',除非你不想碰你的工作目錄。 – 2012-04-17 19:17:40

+0

根據這個問題,在新的pull導致問題後,repo只需要回滾,所以工作目錄應該是空的。 – 2012-04-17 20:39:14

0

這樣做的另一種方法將涉及使用標籤。想到的是,你可以在拉動之前用一些版本號來標記你的HEAD,做拉動動作,然後如果你需要回滾HEAD,你可以做git reset {tag name}這樣,如果拉動有多個提交,你可以跳回到你所在的位置在合併之前。

2

在這種情況下,使用分支是有意義的,分支可以在失敗或成功時輕鬆移除或合併。這將幫助你跟蹤新的東西,並讓事情更清潔,如果你有比「只刪除最後一個提交」更復雜的情況(特別是因爲你想用腳本來做到這一點)。所以,你的服務器上:

git fetch --all   # fetch new commits from remote 
git checkout -b testing # create and switch to branch 'testing' 
git merge origin/master # merge new commits from remote branch master 
          # (in branch 'testing') 

...然後測試的東西......如果成功:

git checkout master  # switch back to master 
git merge testing 

,並在失敗時:

git checkout master 
git branch -D testing  # remove testing branch 

但無論如何...這隻有你要點是刪除最後的提交,你可以使用Josh指出的git reset

+0

這裏的好處,這不是我在想什麼,但可以很好地工作。我會盡量用最簡單的方法。 – Bastian 2012-04-18 10:26:07

1

@Karl Bielefeldt接受的答案並不完全適用於我。我正在使用GIT版本2.10.0.windows.1 可能適用於舊版本。我收到「未知開關'e'」錯誤。 最後,我做了一些改變,它的工作。

下面是以前的上拉前恢復狀態的步驟:

  1. 使用git reflog看到名單卡爾提及。
  2. 從列表中選擇您想要移回的提交版本。
  3. 執行git reset --hard <commit version>