Git過濾器樹有助於在.git/refs/original/refs/heads/tmp
中存儲備份。但我找不到有關如何從中恢復的任何說明。自那以後,我沒有觸及倉庫 - 我只是改變了我對這個特定操作的智慧的看法。如何恢復refs/original/refs/heads/tmp?
我猜答案要麼是文件副本,要麼是git update-ref
,但這些都是非常具有破壞性的操作,我不想弄錯它。
Git過濾器樹有助於在.git/refs/original/refs/heads/tmp
中存儲備份。但我找不到有關如何從中恢復的任何說明。自那以後,我沒有觸及倉庫 - 我只是改變了我對這個特定操作的智慧的看法。如何恢復refs/original/refs/heads/tmp?
我猜答案要麼是文件副本,要麼是git update-ref
,但這些都是非常具有破壞性的操作,我不想弄錯它。
這裏是知道的東西,從一切流量:做git gc
時除外(當然,事情git gc
不一樣),Git會從來沒有刪除任何東西,它永遠只能增加了新的東西。
比方說,你有一個分支,它看起來是這樣的:
* 9d2e82c handle another temporary failure mode
| * 2afb8a0 (resubmit) checkpoint: resubmit
| * 90dcfbb move definitinon of GRONK to sysdefs
|/
* 1ba7847 treat XML login errors as temporary failures
(這被剪斷,並略作修改輸出git lola
:http://blog.kfish.org/2010/04/git-lola.html)。現在說我對我的「重新提交」分支做了一些事情,比如不正確的filter-branch
,所以我在該分支上有兩個新的提交(1234567和7654321,或其他)。我意識到,哦,不,我做了一件徹底壞掉的事情,我想「重新提交」回去指向提交2afb8a0,這是該分支的原始提示。
犯下是還在混帳,並將於數月至少(長,因爲你有用戶可見的分支名original/refs/heads/tmp
- 嘗試它做git log
例如,你會看到它的存在) 。在你的案例中找到提交ID-easy,它被命名爲original/refs/heads/tmp
,並讓你的分支點在那裏。如果你沒有一個名字,你可以做git branch -d resubmit
然後git branch resubmit 2afb8a0
(我自己上面的例子),但你這樣做,那麼:
git branch -D tmp
git branch -m original/refs/heads/tmp tmp
將刪除當前tmp
,並重新命名更名一回tmp
。
(最近增加了新的提交filter-branch
,你認爲你不喜歡,畢竟還是會在你的倉庫中,一旦你刪除了用戶可見名稱,它們將在3個月後過期,之後git gc
將刪除它們。)
噢 - 備份只是一個像其他任何裁判。這就是我錯過的一點。 :) – 2012-03-18 08:10:19
啊哈,是的,這是一個好方法。但即使你失去了ref名字的提交仍然在那裏,他們只是變得更難找到。 – torek 2012-03-18 08:22:49