暫存區根本不是一個區(從底層來看),暫存區只是一個index文件,用來記錄倉庫裏的文件和工做區裏的文件這二者之間的對應關係(所謂的「跟蹤」)git
我先簡單說說暫存區的原理 我先在工做區創建一個文件file.txt,此文件未被跟蹤,因此倉庫(.git目錄)裏沒有對應的文件 當我輸入git add file.txt進行跟蹤時,git會將這個文件複製到倉庫裏,並進行更名,例如更名爲d0fd9678ea839e7e01b3b0709cf5da41a276c006,同時在所謂暫存區的index文件裏記錄一筆---工做區的file.txt <對應爲> 倉庫的d0fd9678ea839e7e01b3b0709cf5da41a276c006 我開始編輯file.txt,添加了幾行數據,而後我再輸入git add file.txt進行再跟蹤時,git會將這個新文件複製到倉庫裏,並進行更名,例如更名爲f8764f23d79b59e7c2d006935257823963592a18,同時在所謂暫存區的index文件裏,修改以前的記錄,將工做區的file.txt對應爲倉庫的f8764f23d79b59e7c2d006935257823963592a18,之前的記錄d0fd9678ea839e7e01b3b0709cf5da41a276c006被蓋掉了。但d0fd9678ea839e7e01b3b0709cf5da41a276c006這個文件仍是在倉庫裏沒動。 以此類推3d
因此,工做區裏的文件是否被跟蹤,其實就是暫存區的index文件裏是否有該文件的記錄 若是一個項目有100個文件都被跟蹤,那暫存區也只有1個index文件,裏面有100行,每行記錄每一個文件在兩區的對應關係(工做區和倉庫),注意啊,還沒到提交(commit)這個環節哦。 每一次git add時,都會修改這個index文件(暫存區),能夠屢次git addit
當git commit時,git會對這個index文件取一個名字,好比97ffc2598b5e8c50750d5d515a5fbd536531c810,並保存起來 第二次提交時,git會對當時的index文件取一個名字,好比fdd9024d981ac44d7548ae377545cb9d799dce52,再保存起來 同時保存每一個index文件的父輩是誰,好比fdd9024d981ac44d7548ae377545cb9d799dce52的爸爸就是97ffc2598b5e8c50750d5d515a5fbd536531c810 這些就是清單文件,有了清單文件,恢復就簡單了 我要恢復某個commit,只要找到那個commit的清單文件,從清單文件裏所記錄的清單到倉庫去找到每個文件,並把這些文件複製到工做區,並更名爲文件原來真正的名字。原理