- git checkout還原工作區的功能
- git reset 還原暫存區的功能
- git clean 還沒有被添加進暫存區的文件也就是git還沒有跟蹤的文件可以使用這個命令清除他們
- git revert 撤銷本次提交。
Git checkout
首先我們對文件的一個修改,對master.txt進行了修改
修改結果我們利用上面的知識來進行查看。
新增加了Test這么一段話,如果我們想要將工作區的內容添加到暫存區會使用git add這個命令,如果我們想要還原工作區內容這時候就要用的git checkout命令,實際上做的工作是用暫存區的內容來覆蓋我們工作區的內容。看下面操作:
查看一下git status
發現我們之前的修改被還原了。
這時候我們在對master.txt進行修改並添加到暫存區里面去。修改內容如下
修改完成之后我們來進行提交到暫存區,使用git add 命令。這時候再次查看下狀態就變成了changes to be committed的狀態。
我們可以使用git reset HEAD(HEAD~2)這種方式進行還原到某一個提交記錄上。因為HEAD所指向的commit就是我們想要恢復的內容,也就是我們HEAD指向的commit就是我們要用這些數據覆蓋暫存區數據。
這時候我們在git status看一下,暫存區的內容就被還原了。
我們可以使用這種還原工作區
Git checkout v0 — master.txt ,v0是指向首次提交的commit的記錄(這里的v0是給commit打的一個tag記錄)。我們來看一下工作區和暫存區的區別:
發現少了一行提交內容。我們這時候再用當前HEAD指向的commit還原一下工作區就可以了。
這時候就沒有了區別了。使用提交記錄還原暫存區的內容格式和checkout是一致的這里就不做演示了。(例如用v0 tag的記錄還原暫存區,git reset v0 – master.txt還原指定文件)
在工作區內新建兩個文件然后不將文件添加到暫存區內,使用git clean進行清理。
這時候使用git clean –n將要刪除的文件展示出來。
這時候再用git clean –f進行刪除掉這些文件。
我們在這里新建一個vim .gitignore的文件過濾掉后綴為o和a的文件。
添加到歷史記錄里面去,然后在新建文件進行清理。
新建了三個文件test.o、test1.a、test2.c這時候我們來使用git clean –n的時候就會顯示一條清除記錄就是test2.c,默認他不清理gitignore里面的文件。
這里我們正好相反我們想要保留ignore以外的文件,清理掉ignore里面的文件。這時候我們就會用到下面的這個指令git chean -n -X后面跟一個大寫的X,我們發現得到了我們想要的結果。
我們執行它,清理掉這些文件。git chean -X –f這時候就清理了.o和.a的文件
我們可以使用git revert產生一個新的提交來覆蓋我們不想要的上面的ignore提交記錄。git revert HEAD
下面來演示下git revert的工作原理:
第一種情況:當我們第一次提交記錄時就revert。當我們用touch 生成一個文件a,生成后將a文件放入到暫存區,這時候就會產生一個a的git對象,這個對象存放在.git/objects目錄,如下圖所示:
當我們還有add的時候objects文件下面就兩個默認文件夾。當git add的時候就會產生一個git對象。
這個就是git對象,一個文件對應一條內容,以該內容加上特定頭部信息一起的 SHA-1 校驗和為文件命名。 校驗和的前兩個字符用於命名子目錄,余下的 38 個字符則用作文件名。這里不作詳解。那么整體的sha-1校驗和就是文件名+子目錄名。當我調用git commit 的時候會產生一個樹對象一個commit對象,並且commit對象指向樹對象。
接下來我們來看一下那個sha-1是樹對象哪一個是commit對象,並且驗證下commit對象下面是不是樹對象。
整體生成本次提交的結構如下圖所示:
當我們git revert的時候會產生一個新的tree對象,這個tree對象是創建一個撤銷上次修改的tree對象。
就變成了現在這個樣子了。
還有第二種情況就是我們第二次提交之后再進行revert的時候這時候就會生成一個新的commit指向原來的tree對象。接下來我們就來演示下
首先第一步就是初始化一個倉庫這里就不多說了,第二部就是下面圖的步驟先新建兩個文件a,b兩個文件,然后將a和b文件分別添加到暫存區中,這時候就會產生git對象,我們來看一下git對象的類型,確定是blob類型,然后將暫存區的文件提交到記錄中。演示如下圖所示:
接下來就在查看下.git/objects文件下面生成的對象以及對象的類型,然后我們就開始准備第二題提交,首先編輯下a文件添加到暫存區里面這時候會產生一個git對象(blob)。如下圖所示:
這時候就能看到我們新增加的git對象內容以及sha-1。
接下來我們就要查看新生成對象的類型,在進行第二次提交git commit,當我們提交之后會生成新的對象,再看一下新對象類型的屬性,剛好查看第一個對象是commit對象看一下他的內容。詳細請見下圖:
接下來就要看一下tree對象以及tree對象下的元素都有哪些,詳情請見下圖
那么這是我們看一下它產生的記錄結構如下圖所示:
當我們revert之后,就會生成一個新的commit將指向第一次提交的tree對象。我們來看一下新生成的commit對象的sha-1。
這時候看一下它產生的記錄結構如下圖所示:
本文內容皆為研究成果以及學習文章后總結,如果上述問題有錯誤之處請指正,我發現截圖太多了,應該換一種方式。
導航:
小丁帶你走進git世界一-git簡單配置
http://www.cnblogs.com/dwlsxj/p/Github.html
小丁帶你走進git的世界二-工作區暫存區分支
http://www.cnblogs.com/dwlsxj/p/git.html