標籤:
Git基本概念
在Git中,我們將需要進資料列版本設定的檔案目錄叫做一個倉庫(repository),每個倉庫可以簡單理解成一個目錄,這個目錄裡面的所有檔案都通過Git來實現版本管理,Git都能跟蹤並記錄在該目錄中發生的所有更新。
現在我們已經知道什麼是repository(縮寫repo)了,假如我們現在建立一個倉庫(repo),那麼在建立倉庫的這個目錄中有一個“.git”的檔案夾。這個檔案夾非常重要,所有的版本資訊,更新記錄,以及Git進行倉庫管理的相關資訊全部儲存在這個檔案夾裡面。所以,不要修改/刪除其中的檔案,以免造成資料的丟失。
進一步的講解請參考下面一張圖,大概展示出了我們需要瞭解的基本知識。
根據上面的圖片,下面給出了每個部分的簡要說明:
- Directory:使用Git管理的一個目錄,也就是一個倉庫,包含我們的工作空間和Git的管理空間。
- WorkSpace:需要通過Git進資料列版本設定的目錄和檔案,這些目錄和檔案組成了工作空間。
- .git:存放Git管理資訊的目錄,初始化倉庫的時候自動建立。
- Index/Stage:暫存區,或者叫待提交更新區,在提交進入repo之前,我們可以把所有的更新放在暫存區。
- Local Repo:本地倉庫,一個存放在本地的版本庫;HEAD會只是當前的開發分支(branch)。
- Stash:是一個工作狀態儲存棧,用於儲存/恢複WorkSpace中的臨時狀態。
有了上面概念的瞭解,下面就開始在本地repo上進行Git操作了。
建立倉庫
通過“Git Bash”命令列視窗進入到想要建立版本倉庫的目錄,通過“git init”就可以輕鬆的建立一個倉庫。
這時,我們的倉庫中會自動的產生一個“.git”檔案夾,這個就是我們前面提到的Git管理資訊的目錄。
添加
現在我們在倉庫中建立一個“test.txt”的文字檔,內容如下。
123123
通過"git status"可以查看WorkSpace的狀態,看到輸出顯示"test.txt"沒有被Git跟蹤,並且提示我們可以使用"git add <file>..."把該檔案添加到待提交區(暫存區)。
注意,如果添加到暫存區,這時的更新只是在WorkSpace中。
使用"git add test.txt"或者"git add .",然後繼續查看WorkSpace的狀態。這時發現檔案已經被放到暫存區。
這時的更新已經從WorkSpace儲存到Stage中。
最後,我們就可以通過“git commit -m”來提交更新了。-m後面跟的是對commit的描述(message)。
這時的更新已經從Stage儲存到了Local Repo中。
通過上面的操作,檔案"test.txt"就成功的被添加到了倉庫中。
更新
假設現在需要對"test.txt"進行更新,修改檔案後,查看WorkSpace的狀態,會發現提示檔案有更新,但是更新只是在WorkSpace中,沒有到暫存區中。
莫語常言道知足,萬事至終總是空。理想現實一線隔,心無旁騖腳踏實。 誰無暴風勁雨時,守得雲開見月明。花開複見卻飄零,殘憾莫使今生留。
同樣,通過add、commit的操作,我們可以把檔案的更新先放到暫存區,然後從暫存區提交到repo中。
注意,只有被add到暫存區的更新才會被提交進入repo。提交前,如果對WorkSpace的檔案進行修改,而沒有被添加到暫存區,那麼提交進repo中的只是暫存區的更新,WorkSpace修改的部分不會提交進repo中的。
git diff
"git diff"是個很有用,而且會經常用到的命令,用於顯示WorkSpace中的檔案和暫存區檔案的差異。先將我們之前的test.txt檔案中的內容改成純數字然後提交到repo中,中文字元運行該命令會顯示亂碼。
123123
接下來修改成下面內容,我們通過"git diff"可以查看WorkSpace和Stage的diff情況,當我們把更新add到Stage中,diff就不會有任何輸出了。
123123456456
當然,我們也可以把WorkSpace中的狀態和repo中的狀態進行diff,命令如下。
git diff HEAD~n
撤銷更新
根據前面對基本概念的瞭解,更新可能存在三個地方,WorkSpace中,Stage中和repo中。下面就分別介紹一下怎麼撤銷這些更新。
撤銷WorkSpace中的更新
接著上面的例子,先將test.txt中的文本設定如下內容,並提交。
abcabc
然後將test.txt中的內容進行修改:
abc123bca321
我們可以使用"git checkout --<file>..."來撤銷WorkSpace中的更新。執行test.txt中的文本會變成兩行"abc"。
注意:使用這種方法撤銷更新的時候一定要謹慎,因為通過這種方式撤銷後,更新將沒有辦法再找回。
撤銷Stage中的更新
由於上個步驟,我們將test.txt修改撤銷了。這裡再次修改為下面內容,並且使用了"git add"把這個更新提交到了暫存區。這時,"git status"的輸出中提示我們可以通過"git reset HEAD <file>..."把暫存區的更新移出到WorkSpace中。
如果想繼續撤銷WorkSpace中的更新,請參考上面一步。
abc123cba321
撤銷repo中的更新
介紹撤銷repo中的更新之前,我們先看一下"git log"這個命令,通過這個命令我們可以查看commit的記錄。
撤銷提交有兩種方式:使用HEAD指標和使用commit id
在Git中,有一個HEAD指標指向當前分支中最新的提交。目前的版本,我們使用"HEAD^",那麼再錢一個版本可以使用"HEAD^^",如果想回退到更早的提交,可以使用"HEAD~n"。(也就是,HEAD^=HEAD~1,HEAD^^=HEAD~2)
git rest --hard HEAD^git rest --hard HEAD~1git rest --c2760c5512bc67a8b990c1da508d40cca623f23
再次查看,發現最新的提交已經被撤銷了,查看test.txt中的檔案,發現內容又變成兩行"abc"文本。
那麼問題就來了,我現在又想恢複被撤銷的提交,當然Git是支援這樣的操作。
下面來看看"git reflog"這個命令。"git log"只是包括了當前分支中的commit記錄,而"git reflog"中會記錄這個倉庫中所有的分支的所有更新記錄,包括已經撤銷的更新。
有了這個,我們就可以恢複撤銷操作。
git reset --hard [email protected]{1}git reset --hard f752570
再次查看,發現我們撤銷的內容已經回來了。
--hard和--soft
前面在使用reset來撤銷更新的時候,我們都是使用的"--head"選項,其實與之對應的還有一個"--soft"選項,區別如下:
--head:撤銷並刪除相應的更新
--soft:撤銷相應的更新,把這些更新的內容放到Stage中
刪除檔案
在Git中,如果我們要刪除一個檔案,可以使用下面的命令,"git rm"相比"rm"只是多了一步,把這次刪除的更新發到Stage中。
rm <file>
git rm <file>
Git介紹及基本操作