《穿越時(shí)空的git》之創(chuàng)建版本庫(kù)和常用命令操作
Git 是一個(gè)開(kāi)源的分布式版本控制系統(tǒng),可以有效、高速地處理從很小到非常大的項(xiàng)目版本管理。Git 強(qiáng)大的分支管理,遠(yuǎn)遠(yuǎn)超過(guò) SVN。那 git 如何創(chuàng)建版本庫(kù)?如何進(jìn)行一些常用的操作呢?欲知答案如何,請(qǐng)看下文分解。
小時(shí)候看過(guò)一部印象很深的劇叫做《穿越時(shí)空的愛(ài)戀》,今日也厚著臉皮導(dǎo)演一部《穿越時(shí)空的git》,不上映,純屬自嗨!
what is 版本庫(kù)?無(wú)論我們平常使用git的頻率如何,但是從事IT這個(gè)行業(yè)的小伙伴一定經(jīng)常聽(tīng)到有人在說(shuō),哪個(gè)哪個(gè)牛X的項(xiàng)目在哪個(gè)倉(cāng)庫(kù),哪個(gè)項(xiàng)目的倉(cāng)庫(kù)被人惡意添加issue(之前就聽(tīng)說(shuō)了阿波羅計(jì)劃的代碼倉(cāng)庫(kù)中issue被很多無(wú)關(guān)的中文評(píng)論占樓~哎,咱們測(cè)試工程師一定不要這樣做,為這個(gè)行業(yè)盡一份力);
說(shuō)了這么多廢話,其實(shí)我們平常說(shuō)的倉(cāng)庫(kù)就是版本庫(kù),版本庫(kù)又名倉(cāng)庫(kù),英文名叫repository,相信很多用GitHub的小伙伴經(jīng)??吹竭@個(gè)單詞;
我就簡(jiǎn)單的把它理解成一個(gè)目錄文件夾,里面可以放各種文件,和平常的使用管理一樣,可以刪除、修改;但是Git的”文件夾“更強(qiáng)大一點(diǎn),它記性好-Git可以"記住"整個(gè)管理的歷史,還能”存檔“。
如何創(chuàng)建一個(gè)版本庫(kù),很簡(jiǎn)單:
1)選擇一個(gè)路徑(you like just ok!),創(chuàng)建一個(gè)空目錄
$ mkdir mygit
$ cd mygit?
$ pwd?
/Users/qinzhen/mygit?
?#這里就是我的Mac上創(chuàng)建的倉(cāng)庫(kù)地址了
2)倉(cāng)庫(kù)地址創(chuàng)建好了,現(xiàn)在就是一個(gè)普通的文件夾,后使用git init命令將它變成”Git文件夾“,也就是把這個(gè)目錄變成Git可以管理的倉(cāng)庫(kù)
$ git init?
Initialized empty Git repository in /Users/qinzhen/mygit/.git/
它會(huì)提示說(shuō)在你的目錄下創(chuàng)建了一個(gè)空的Git倉(cāng)庫(kù),并且目錄下多了一個(gè).git,這個(gè)時(shí)候就算創(chuàng)建完成了。
在看命令之前先來(lái)用一張圖了解幾個(gè)概念,可以方便理解和記憶:
工作區(qū)(Working Directory)
臨時(shí)倉(cāng)庫(kù)(暫存區(qū),Staging Area)
Git倉(cāng)庫(kù)(Repository)
我們就是先在工作區(qū)進(jìn)行文件的編輯操作;然后add到臨時(shí)倉(cāng)庫(kù),可以add多個(gè);最后再commit一起提交到倉(cāng)庫(kù)中。
接下來(lái)正式進(jìn)入實(shí)操:
1)在mygit路徑下,創(chuàng)建文件readme.txt,輸入以下內(nèi)容:
I want to study Git
2)利用git add命令將文件提交到臨時(shí)倉(cāng)庫(kù)(運(yùn)行成功不會(huì)輸出任何消息,看不到輸出不要慌~)
$ git add readme.txt
3)再用git commit命令將文件從暫存區(qū)提交到倉(cāng)庫(kù)去
localhost:mygit qinzhen$ git commit -m "study git"?
[master 64f5ced] study git?
1 file changed, 2 insertions(+), 2 deletions(-)
命令解釋:
-m : 添加注釋,對(duì)本次提交寫一個(gè)說(shuō)明
1 file changed :
1個(gè)文件被改變,也就是readme.txt;?
2 insertions(+):?
2行插入了內(nèi)容,也就是我們輸入的兩行內(nèi)容?
2 deletions(-):?
2行內(nèi)容缺失了,因?yàn)槲沂前裷eadme.txt文件里原有的內(nèi)容刪除后添加的內(nèi)容,
所以會(huì)有次改動(dòng)提示,若是完全新建的就只會(huì)有添加的記錄
1)我們先用git status查看當(dāng)前倉(cāng)庫(kù)的狀態(tài)
localhost:mygit qinzhen$ git status
On branch master?
nothing to commit, working tree clean
現(xiàn)在表示在一個(gè)master分支上沒(méi)有可提交的東西,工作目錄當(dāng)前是干凈的
2)修改readme.txt文件:
I want to study Git very much.
3)再使用git status查看
localhost:mygit qinzhen$ git status
On branch master
Changes not staged for commit:
?
(use "git add <file>..." to update what will be committed)?
?(use "git checkout -- <file>..." to discard changes in working directory)
?modified: ? readme.txt?
n
o?changes added to commit (use "git add" and/or "git commit -a")
這時(shí)候可以看到文件已經(jīng)被修改了,但是并沒(méi)有被add和commit;
4)再使用git diff(different)命令來(lái)查看當(dāng)前操作和之前的操作有何區(qū)別之處,修改了哪里:
localhost:mygit qinzhen$ git diff?
diff --git a/readme.txt b/readme.txt?
index 225e15a..8080bd8 100644?
--- a/readme.txt?
+++ b/readme.txt
@@ -1,2 +1,2 @@
?I am a test engineer.?
-I want to study Git.
+I want to study Git very much.
可以看到我在第二行增加了very much
1)我們先將剛才修改好的文件提交到倉(cāng)庫(kù)中:
$ git add readme.txt
$ git commit -m "very much"
?[master 7582a45] very much?
?1 file changed, 1 insertion(+), 1 deletion(-)
2)我們?cè)偈褂胓it log命令來(lái)看看之前都干了些什么:
$ git log
commit 7582a45a1acd9f5540f381d6e9bb7c9d38e74348 (HEAD -> master)
Author: qinzhen <376057520@qq.com>?
Date: ? Thu Sep 19 16:48:31 2019 +0800
?
??very much
commit 64f5cedd48745267e4e161c57f126a9230344339
Author: qinzhen <376057520@qq.com>?
Date: ? Thu Sep 19 16:05:40 2019 +0800
? ?
study git
在git log命令后,我們可以看到之前的提交commit歷史,每一次提交都分配了唯一的commit id,這個(gè)id就是我們回到過(guò)去的關(guān)鍵,就相當(dāng)與科幻電影中回到過(guò)去的某個(gè)時(shí)期
3.1)HEAD——現(xiàn)在,我如果想回到study git的”時(shí)期“,可以使用git reset --hard HEAD^
$ git reset --hard HEAD^?
HEAD is now at 64f5ced study git
$ cat readme.txt
?I am a test engineer.
I want to study Git.
這個(gè)時(shí)候我們可以看到,已經(jīng)成功的回到了study git的”時(shí)期“,very much已經(jīng)消失不見(jiàn)
命令解釋:
如果回到過(guò)去不好理解的話,也可以理解為存檔,本人小時(shí)候喜歡玩一款電腦游戲叫做紅色警戒,
打任務(wù)戰(zhàn)的時(shí)候每過(guò)一關(guān)前就會(huì)存檔一次,這樣就方便”死“了之后可以回到指定關(guān)卡重新再來(lái)
^代表上一個(gè)存檔,^^代表上上個(gè)存檔,如果想反會(huì)至上100個(gè)版本的話可以直接使用HEAD~100果回到過(guò)去
3.2)commit id——現(xiàn)在再修改文件,在第一行添加I can fly,然后add、commit:
I am a test engineer,I can fly.
I want to study Git.
$ git add readme.txt?
$ git commit -m "I can fly"?
[master 9c32701] I can fly?
1 file changed, 1 insertion(+), 1 deletion(-)
git log 查看修改提交日志
$ git log
?commit 9c327016eec10a6db7f9b75ecb705df417b6508c (HEAD -> master)?
Author: qinzhen <376057520@qq.com>
Date: ? Thu Sep 19 17:06:10 2019 +0800
??
?I can fly?
commit 64f5cedd48745267e4e161c57f126a9230344339?
Author: qinzhen <376057520@qq.com>
Date: ? Thu Sep 19 16:05:40 2019 +0800
?
??study git
上面說(shuō)了可以利用commit id回到過(guò)去,現(xiàn)在咱們就來(lái)試試;使用git reset --hard 64f5ce…命令:
$ git reset --hard 64f5ced
?HEAD is now at 64f5ced study git?
?$ cat readme.txt
?I am a test engineer.?
I want to study Git.
從上面的結(jié)果可以看到,我們已經(jīng)通過(guò)commit id成功回到了過(guò)去,回到了那個(gè)沒(méi)有”I can fly“的年代;可以注意到的一點(diǎn)是,在寫commit id的時(shí)候并沒(méi)有寫全,只是寫了前面的一部分,git就可以找到了;
額。。??隙ㄓ腥艘獑?wèn)具體是幾位,說(shuō)實(shí)話~我也不知道0.0,也沒(méi)有專門去研究過(guò),前四五位?六七位?七八位?達(dá)到使用要求就好啦,能保證id唯一,稍微多復(fù)制幾個(gè)就可以了。。。
3.3)回到add前的年代——僅add文件到了暫存區(qū),并沒(méi)有commit;感覺(jué)好像是進(jìn)入到了add的另一重空間,在未來(lái)也找不到他,那想回到原來(lái)的”時(shí)期“的話,就可以使用git reset HEAD 把file丟掉
現(xiàn)在我的readme.txt文件內(nèi)容如下,并且已經(jīng)add到了暫存區(qū):
I am a test engineer.I can fly!?
I want to study Git.
$ git status?
On branch master?
Changes to be committed:?
??(use "git reset HEAD <file>..." to unstage)
?modified: ? readme.txt
使用git reset HEAD readme.txt命令將修改從add撤銷回來(lái)
$ git reset HEAD readme.txt?
Unstaged changes after reset:
M ?readme.txt?
$ git status?
On branch master?
Changes not staged for commit:
?
(use "git add <file>..." to update what will be committed)?
??(use "git checkout -- <file>..." to discard changes in working directory)
?modified:?
readme.txt?
no changes added to commit (use "git add" and/or "git commit -a")
3.4)這個(gè)時(shí)候又有個(gè)疑問(wèn),我只是把readme.txt從add后的暫存區(qū)給撤銷回來(lái)了,文件并沒(méi)有改變的;想要把文件的修改也撤回,就要使用git checkout – 命令了:
$ git checkout -- readme.txt?
$ cat readme.txt
I am a test engineer.
?I want to study Git.
?$ git status?
On branch master?
nothing to commit, working tree clean
補(bǔ)充:一個(gè)文件已經(jīng)被提交到了版本庫(kù),有時(shí)候我們?cè)诠ぷ鲄^(qū)誤刪了某個(gè)文件(rm或手動(dòng)),這個(gè)時(shí)候版本庫(kù)中還是有這個(gè)文件的,就可以通過(guò)git checkout – 命令來(lái)”找回“;
如果真的想要從版本庫(kù)中將文件刪除,就要用到git rm和git commit命令了
1)沒(méi)錯(cuò),一般穿越的電影里到最后總是會(huì)找到方法返回未來(lái)的,git也不例外,除了可以回到過(guò)去(版本回退),也可以返回未來(lái)(回到新版本);
這里我們還是要借助于commit id來(lái)做,但是回退后再用git log已經(jīng)看不到未來(lái)時(shí)期的定位坐標(biāo)了(commit id):
$ git log?
commit 64f5cedd48745267e4e161c57f126a9230344339 (HEAD -> master)?
Author: qinzhen <376057520@qq.com>
Date: ? Thu Sep 19 16:05:40 2019 +0800
?
??study git
2)這個(gè)時(shí)候就要用到git reflog命令了,記錄你之前走過(guò)的路:
$ git reflog?
64f5ced (HEAD -> master) HEAD@{0}: reset: moving to 64f5ced?
9c32701 HEAD@{1}: commit: I can fly?
64f5ced (HEAD -> master) HEAD@{2}: reset: moving to HEAD^?
7582a45 HEAD@{3}: commit: very much?
64f5ced (HEAD -> master) HEAD@{4}: commit: study git
在這里就可以看到之前I can fly 的commit id;這里順便提一句,上面說(shuō)了commit id不用寫全部,寫前面一部分,但是不確定具體寫幾位,這里看到git的log也只記錄了前7位,那就姑且算7位吧。。。
有了commit id就等于獲得了返回未來(lái)的坐標(biāo)信息和方法,電影也差不多到了大結(jié)局的時(shí)候了,本文也就要結(jié)束了,來(lái)個(gè)收尾:
$ git reset --hard 9c32701?
HEAD is now at 9c32701 I can fly?
?$ cat readme.txt
I am a test engineer,I can fly.?
I want to study Git.?
?$ git status?
On branch master?
nothing to commit, working tree clean