GIT版本回退、工作區和暫存區、管理修改、提交修改、撤銷修改、刪除檔案
git status
命令可以讓我們時刻掌握倉庫當前的狀態。比如哪個檔案被修改過,並且是否提交過。
git diff
具體檔名.字尾名命令可以檢視某個檔案修改前後的區別,顯示的格式正是Unix通用的diff格式。
版本回退:
版本回退是有條件的,就是你還沒有把自己的本地版本庫推送到遠端版本庫。
在Git中,用HEAD
表示當前版本,也就是最新的提交,上一個版本就是HEAD^
,上上一個版本就是HEAD^^
,當然往上100個版本寫100個^
比較容易數不過來,所以寫成HEAD~100
。
git log
命令顯示從最近到最遠的提交日誌。在日誌中,可以找到各個版本的commit id。
如,回退到上一個版本:
git reset --hard HEAD^
如果你回退到了某個版本,但後悔了又想恢復到新版本,可以用git reflog
命令用來記錄你的每一次命令:
從中找到你想恢復的版本的commit id,使用命令git reset --hard commit_id
可以回退到該commit id的版本。
$ git reflog
e475afc [email protected]{1}: reset: moving to HEAD^
1094adb (HEAD -> master) [email protected]{2}: commit: append GPL
e475afc [email protected] {3}: commit: add distributed
eaadf4e [email protected]{4}: commit (initial): wrote a readme file
終於舒了口氣,從輸出可知,append GPL
的commit id是1094adb
,現在,你又可以乘坐時光機回到未來了。
Git和其他版本控制系統如SVN的一個不同之處就是有暫存區的概念。
工作區(Working Directory):
就是你的本地倉庫目錄:
版本庫(Repository):
工作區有一個隱藏目錄.git
,這個不算工作區,是Git的版本庫。
暫存區(stage):
Git的版本庫裡存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動建立的第一個分支master
,以及指向master
的一個指標叫HEAD
。
我們把檔案往Git版本庫裡新增的時候,是分兩步執行的:
第一步是用git add
把檔案新增進去,實際上就是把檔案修改新增到暫存區;
第二步是用git commit
提交更改,實際上就是把暫存區的所有內容提交到當前分支。
我們建立Git版本庫時,Git自動為我們建立了唯一一個master
分支,所以,現在,git commit
就是往master
分支上提交更改。
可以簡單理解為需要提交的檔案修改通通放到暫存區,然後,一次性提交暫存區的所有修改。
管理修改:
Git比其他版本控制系統相比,Git跟蹤並管理的是修改而非檔案。
每次修改後,只有git add新增到暫存區中後,git commit才會把修改提交到分支。
刪除修改:
如果你修改後,還沒有git add到暫存區:
git checkout -- 檔名
可以丟棄工作區的修改。命令git checkout -- readme.txt
意思就是,把readme.txt
檔案在工作區的修改全部撤銷,這裡有兩種情況:
一種是readme.txt
自修改後還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;
一種是readme.txt
已經新增到暫存區後,又作了修改,現在,撤銷修改就回到新增到暫存區後的狀態。
總之,就是讓這個檔案回到最近一次git commit
或git add
時的狀態。
如果你修改後,已經git add到了暫存區但還沒有git commit:
用命令git reset HEAD <file>
可以把暫存區的修改撤銷掉(unstage),重新放回工作區。
如果你不但git add到了暫存區並且git commit到了版本庫:
參見上面版本回退的操作。
刪除檔案:
在Git中,刪除也是一個修改操作。
如果你提交了一個新檔案到版本庫,現在你想刪除它:
你可以直接在檔案管理器中把沒用的檔案刪了,或者用$ rm
檔名刪除它。
此時Git知道你刪除了檔案,工作區和版本庫不一致了。git status
命令會立刻告訴你哪些檔案被刪除了。
現在你有兩種情況:
一是確實要從版本庫中刪除該檔案,那就用命令git rm 檔名
刪掉,並且git commit;
二是刪錯了,但版本庫裡還有該檔案最近一次提交的版本,可以使用$ git checkout -- 檔名把誤刪的檔案恢復到最近一次提交的版本。