2014-03-13 69 views
2

我通過在生產服務器上運行git pull來將應用程序部署到生產服務器。在保持連接到分支的情況下恢復到舊的git簽出

作爲備份的一部分,我正在考慮只存儲當前提交散列而不是複製所有文件的想法。之後,在還原期間,我想將本地版本的存儲庫從遠程源恢復到已保存的提交哈希。理想情況下,它的行爲就像是我恢復了包含.git文件夾的整個樹。

要保存當前提交散列,我想到的git log -1 --format=%H

爲了恢復到某個特定的版本,我知道了git checkout hash命令。不幸的是,這個命令從分支中分離了倉庫的工作副本。

是否有一個命令或一組命令將本地git存儲庫恢復到之前的狀態(也就是關於進一步更新的透明方式)?所以git pull將工作副本更新到各自分支中最近的提交併更新頭指針等。

回答

0

我知道git checkout hash命令。不幸的是,這個命令分離的存儲庫的工作副本從一個分支

你可以採取分公司,並指出它回到提交,承認「科附件」你問的問題主題:

$ git update-ref refs/heads/<branch> <hash> 
+0

update-ref將如何影響原始副本和/或從原點拉動更多更新? vonbrad建議我願意實現後請檢查我的評論。 – alik

+0

@alik我在我的回覆中引用了我想要解決的部分,這是我打算給你一個額外的工具來處理,嚴格地說,沒有別的。現在,您可以在備份倉庫中恢復特定的修訂版本,並將其複製爲分支。除此之外,當然,對遠程分支應該沒有影響,因爲是本地(跟蹤)分支。 – mockinterface

+0

謝謝。我需要更深入地檢查update-ref命令。首先通過手冊是不夠的。 – alik

1

您可以檢出任何提交,但不會將.git目錄恢復到原來的狀態,「附屬於同一分支」根本沒有意義。在git中,一個分支只是一個提交的引用,它會啓動一個提交序列。你簽出的提交有自己的歷史記錄,但檢出它會使你處於特殊的「分離頭部」狀態(你不在任何分支的頂端,因此例如在頂部添加新的提交是沒有意義的)。

+0

我的願景是更新生產服務器上的網站的例程不應該在意是否曾經恢復過。 因此,從進一步更新的角度來看,將本地存儲庫恢復到類似於如果沒有恢復時的'git fetch'和'git merge'之間的狀態是完全可以的。 – alik

+0

@alik不僅「附屬於同一分支」沒有道理,而且@vonbrand指出,但「從分支中分離回購工作副本」也不正確,分支仍然指向相應的提交。此外,你打算從一個遠程repo中恢復,因此在git fetch之間沒有任何狀態,這個狀態恰好是在取回之後的狀態,並且由你的遠程跟蹤分支來描述。 – mockinterface

+0

我很抱歉不正確,因爲我並不真正熱衷於git。我試圖按照我的理解允許的那樣清楚地解釋我的目標。 「between」指的是'git pull',它和'git fetch'一樣,後面跟着'git merge'並且有正確的參數。 – alik

相關問題