1. 程式人生 > >GIT版本回退、工作區和暫存區、管理修改、提交修改、撤銷修改、刪除檔案

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-repo

我們把檔案往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 commitgit 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 -- 檔名把誤刪的檔案恢復到最近一次提交的版本。