2010-03-18 63 views
6

我創造了我的筆記本電腦本地的Git回購,然後推源的Heroku創建一個遠程分支。經過幾天的提交和推送後,我需要回滾到之前的提交。這就是我所做的。Git的結賬<SHA>和Heroku的

cd <app root> 
git checkout 35fbd894eef3e114c814cc3c7ac7bb50b28f6b73 

有人告訴我,這樣做結帳創建一個新的工作樹,而不是分支本身,所以當我推回退更改的Heroku,它所說的一切是最新的,並沒有被推倒。我如何解決這種情況?感謝您的幫助提前。

回答

8

當你檢出直接提交域名(使用的commit對象的SHA-1散列)而不是檢查出來的一個分支的名字,你結束了一個「分離頭」。 HEAD是跟蹤當前檢出內容的「ref」。當你直接簽出一個提交而不是一個分支(它沒有連接到任何分支)時,它會變成分離的。分離存儲庫的HEAD時不會更新分支。你可能會想到分離的頭部狀態,就好像你有一個匿名分支簽出。


要重新安裝存儲庫的頭,你將要保存當前HEAD的分支和檢查分支出來:

  1. 要保存當前的頭一個支做到這一點:

    git branch <new-branch-name> 
    
  2. 要覆蓋的現有分支,你需要使用--force

    git branch --force <existing-branch-name> 
    
  3. 然後,重新連接通過檢查新/更新的分支版本庫的HEAD:

    git checkout <branch-name> 
    

    (其中<branch-name>相同<new-branch-name><existing-branch-name>,這取決於上述兩個你使用的命令)

這個序列(git branch做一個引用點到當前的HEAD提交,然後git checkout更新的分支)將繼承您可能在工作索引和/或樹中的任何未提交的內容。


在未來,如果你想「回滾」當前分支此前的一些承諾,您應該使用這個,而不是卸下你的版本庫的HEAD:

git reset --hard <commit> 

這將重置當前分支(或者你分離的HEAD,如果它已經分離)到指定的提交,並且使索引和工作樹反映該提交(即,它丟棄自指定的提交以及任何未提交的內容以來的任何提交)。

脫離的國家元首是重溫老態,有時對你是不知道你能不能讓短期的工作是有用的。除此之外,你可能想避免它。

2

要重置:

git reset --hard 35fbd894eef3e114c814cc3c7ac7bb50b28f6b73
+0

謝謝,這將把工作樹變回分支? – Bob 2010-03-18 04:34:14

+0

這是你最初應該做的事,但它不能解決你的情況。如果您的HEAD仍然分離,則不會將其重新附加到分支。請看我的答案。 – 2010-03-18 04:42:13

+1

它會將您當前的頭重置爲指定的提交。所以你需要'git checkout master'(或者你想要回滾的任何分支),然後使用'git reset'命令。 – Chris 2010-03-18 04:42:44