天天看點

git diff和回退操作

在git送出環節,存在三大部分:working tree, index file, commit

這三大部分中:

working tree:就是你所工作在的目錄,每當你在代碼中進行了修改,working tree的狀态就改變了。

index file:是索引檔案,它是連接配接working tree和commit的橋梁,每當我們使用git-add指令來登記後,index file的内容就改變了,此時index file就和working tree同步了。

commit:是最後的階段,隻有commit了,我們的代碼才真正進入了git倉庫。我們使用git-commit就是将index file裡的内容送出到commit中。

總結一下:

git diff:是檢視working tree與index file的差别的。

git diff --cached:是檢視index file與commit的差别的。

git diff HEAD:是檢視working tree和commit的差别的。(你一定沒有忘記,HEAD代表的是最近的一次commit的資訊)

補充“回退”操作:

未add之前:

git checkout .

add .之後:

git reset --hard //復原到最近一次的代碼,到未add.狀态,回複代碼為原來狀态

git reset --mixed 回到add狀态 == --hard

git reset HEAD

commit之後

git reset --soft HEAD^ //復原最近一次的commit,到add.狀态

git reset --soft HEAD~3 //復原最近三次的commit

push之後

git revert commitNum 

git reset --hard commitNum //復原到該commitNum處

git reset的幾種mode:

--hard:重設index和working directory,自從<commit>以來在working directory中的任何改變都被丢棄,并把HEAD指向<commit>。

--soft:index和working directory中的内容不作任何改變,僅僅把HEAD指向<commit>。這個模式的效果是,執行完畢後,自從<commit>以來的所有改變都會顯示在git status的"Changes to be committed"中。

--mixed:僅reset index,但是不reset working directory。這個模式是預設模式,即當不顯示告知git reset模式時,會使用mixed模式。這個模式的效果是,working directory中檔案的修改都會被保留,不會丢棄,但是也不會被标記成"Changes to be committed",但是會打出什麼還未被更新的報告。

--merge和--keep: 保留working tree并丢棄一些之前的commit 。

參考:

http://blog.csdn.net/hudashi/article/details/7664464

(伯樂線上插播推薦幾篇文章:《Git 兩分鐘指南》、《寫給 Git 初學者的 7 個建議》、《圖解 Git /圖形化的 Git 參考手冊》、《給 Git 中級使用者的 25 個小貼士》、《讓Git 水準更上一層樓的 10 個小貼士》。)