2010-09-28 93 views
4

所以。我是git的新手。而且我想我可能已經超出了我的修復能力(hooray)。與GIT歷史混淆摧毀最近提交...如何恢復?

這裏的故障:

我做了一個遠程目錄,並意外地包含在最初的一些非常大的文件提交。這使得人們很難用它做任何事情。 (我一開始並沒有意識到,並且已經進行了修改,並且一直使用我自己的目錄)

我瞭解到,僅刪除文件並提交刪除操作並不能幫助克隆目錄的人員,並瞭解通過命令來修改歷史,如:

git filter-branch --tree-filter 'rm -f public/vidos/*' HEAD 

這會,據我所知,從公共/ VIDOS /目錄中刪除所有文件,擺脫他們的所有內存。

這似乎發生了。我可以成功克隆(無內存錯誤),並且克隆副本中沒有超大文件。

今天早上(愚蠢地確認我確實匹配了遠程存儲庫後(即擺脫了我所有的本地資料,認爲它應該是最新的除了那些大文件以外的任何東西),我開始與在目錄中,並實現了所有的文件似乎是因爲他們在初始檢查(無修改,有事情我修改了很多,都顯示出來)

我做

git log 

查看所有修改,並可以看到我的所有提交(包括從目錄中刪除超大文件的提交)。我沒有

git reset hashcode 

回滾到適當的混帳(與我從日誌中得到的散列碼)。

除...即使它認爲我是在正確提交,文件仍等同於那些我在第一次開機。

我可以回頭看看自己的歷史,看到我沒對任何目前未修改的文件都進行過濾分支...我真的很困惑,爲什麼我的更改不再存在。我承諾...我推...我非常確定遠程存儲庫有我所有的變化(可以檢查出來(會永遠耗盡內存,但我會得到的文件),並看到更改.. ......但我再也看不到他們了

我做了些什麼愚蠢的東西嗎?是否搞亂了歷史做了一些我沒有意識到的事情?我描述的事情是不是完全不可能搞砸了我的(也就是說,我應該看到一個完全不同的方向嗎?)

我真的,真的想讓我的修改回來......複製所有的代碼(並記住我甚至是DID)將是非常困難的有什麼我可以做的嗎?

編輯:

~~~~~~~~~~~ 好吧,重置沒有工作,但這樣做:

git checkout hashcode 

似乎工作就好了,我可以看到我的代碼改變了。

但是,結帳意味着我不在任何分支,我不能讓他們承諾這些變化是最「最近的」(它認爲它是最新的)。關於如何讓這個承諾成爲「頭腦」的任何想法?而一旦它是頭,那麼將擺脫我爲了擺脫超大文件而進行的分支過濾嗎?如果是這樣,有沒有人有任何建議,如何擺脫這些超級大文件沒有這種頭痛再次。

如果沒有其他方法,我可以簡單地簽出兩個副本(一個在頭,一個在我最後一個好的提交)並手動複製並粘貼好頭文件,然後提交?似乎它會工作,但不是很乾淨。

+0

'git reflog'說什麼?在那裏你可以找到那裏的任何不可達的提交? – VonC 2010-09-28 12:41:05

+0

它說:64e3dcb ... HEAD @ {0}:64e3dcb92ca80d6d53bb92d9470ca269f73ae044:更新HEAD 7d71565 ... HEAD @ {1}:clone:from [email protected]:/ var/git/pcms_vodpop – Jenny 2010-09-28 12:46:43

+0

但是...恩......我感覺它太短了,因爲我愚蠢地刪除了我的本地副本,並將其克隆出來以測試克隆是否仍在工作。 – Jenny 2010-09-28 12:47:06

回答

1

基本上,

git checkout hashcode 

做什麼,我想混帳復位會。我不確定爲什麼當我分支過濾時,所做的更改會回滾,但現在我至少可以再次看到代碼,我只是手動將更改複製到頭部的克隆中,然後再次重新檢查更改。不是最優雅的解決方案,但我必須保持我的過濾並擁有最新的代碼。

我想可能發生的一部分是我對git存儲庫的不完全理解。我以前從來沒有真正管理過一個,但是我有一個簡單的概念,即git存儲庫始終是「最新的」,並且它擁有最新版本的東西。當我做分支過濾時,我在git倉庫中,並且我注意到過濾器處於git狀態,因此需要進行提交。所以我做了。可能這個版本庫實際上並不是「最新版本」,所以在提交(並且愉快地重寫)時,我可能覆蓋了更改並基本上將事情推回。

+0

git reset只會重置索引;你想要git reset --hard。 – 2010-09-28 19:24:43