一般我們寫(xiě)代碼會(huì)用到版本控制工具安拟,那么git就是免費(fèi)開(kāi)源的工具之一馆截,同時(shí)也是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)(沒(méi)有之一)。因此硼砰,它的功能也是十分強(qiáng)大的了且蓬!當(dāng)然了,精通git是很難的题翰,大多數(shù)人也沒(méi)有必要恶阴。
因此,本系列文就對(duì)常用的git知識(shí)進(jìn)行梳理遍愿,保證實(shí)用存淫!
這一篇主要內(nèi)容如下:
- 創(chuàng)建版本庫(kù)、添加文件到版本庫(kù)沼填、掌握倉(cāng)庫(kù)和文件狀態(tài)
- 版本回退
- 工作區(qū)和暫存區(qū)桅咆、管理修改
Git超級(jí)實(shí)用命令
創(chuàng)建版本庫(kù) git init
新建一個(gè)空目錄,并使用這個(gè)命令坞笙,就可以變成git可以管理的倉(cāng)庫(kù)岩饼,例如:
$ mkdir mygit
$ cd mygit
$ git init
Initialized empty Git repository in /Users/cynthia/mygit/.git/
建好了,然后.git目錄是用來(lái)跟蹤管理版本庫(kù)的薛夜,不要手動(dòng)修改就對(duì)了籍茧!
把文件添加到版本庫(kù) git add / git commit
假設(shè)我們新建了一個(gè)README.md文件在上面新建的mygit目錄下。
$ git add README.md
$ git commit -m "readme file"
其中梯澜,git add是把文件添加到倉(cāng)庫(kù)寞冯,git commit則是把文件提交到倉(cāng)庫(kù)。 -m 后面的那段則是提交說(shuō)明。
掌握倉(cāng)庫(kù)和文件狀態(tài) git status / git diff
git status 查看倉(cāng)庫(kù)當(dāng)前的狀態(tài)吮龄。比如你曾經(jīng)添加了一些文件到倉(cāng)庫(kù)俭茧,但是不記得添加了哪些了,使用這個(gè)命令就可以很清楚的看到漓帚。
git diff 用git status發(fā)現(xiàn)有文件被修改過(guò)母债。但是你又不記得對(duì)文件進(jìn)行了怎樣的修改,就可以使用這個(gè)命令尝抖,查看區(qū)別毡们。
$ git diff README.md
版本回退 git log / git reset / git relog
首先,使用git log查看最近提交了哪些版本昧辽。
$ git log
commit 08fea1512175c0033a03d3261499f64251ce19b1 (HEAD -> master)
Author: cynthia <xx@qq.com>
Date: Thu Jan 17 12:24:54 2019 +0800
修改說(shuō)明文件
commit eec68512d9e5a0ac9e9c5f07a907db57a334cfa4 (origin/master, origin/HEAD)
Author: cynthia <xx@qq.com>
Date: Mon Jan 14 12:06:52 2019 +0800
增加說(shuō)明文件
當(dāng)然衙熔,如果你提交過(guò)很多次的話,一屏肯定顯示不全奴迅,那就按空格或者回車(chē)青责,繼續(xù)查看余下部分。如果想退出這個(gè)界面取具,直接按q鍵就好了脖隶。
如果覺(jué)得信息太多,還可以嘗試加上--pretty=oneline
參數(shù)暇检,這樣就會(huì)在一行顯示一個(gè)提交产阱,清爽了很多。
$ git log --pretty=oneline
08fea1512175c0033a03d3261499f64251ce19b1 (HEAD -> master) 修改說(shuō)明文件
eec68512d9e5a0ac9e9c5f07a907db57a334cfa4 (origin/master, origin/HEAD) 增加說(shuō)明文件
類(lèi)似08fea1512...51ce19b1這樣的一長(zhǎng)串就是commit id(版本號(hào))块仆。
HEAD是當(dāng)前版本构蹬,也就是當(dāng)前的最新提交08fea1512...51ce19b1,上一個(gè)版本是HEAD,上上個(gè)版本是HEAD,往上100個(gè)版本則可以寫(xiě)成HEAD~100悔据。
回退到上一個(gè)版本庄敛,使用git reset
命令:
$ git reset --hard HEAD^
HEAD is now at eec6851 增加說(shuō)明文件
如果想指定回到某個(gè)版本怎么辦呢?找到它的commit id科汗,當(dāng)然不需要復(fù)制整個(gè)一長(zhǎng)串藻烤,復(fù)制前面幾位就好了(也別太少,一兩位的話可能會(huì)找到多個(gè)版本號(hào)头滔,無(wú)法確定)怖亭。例如commit id是08fea15,使用命令:
$ git reset --hard 08fea15
那么當(dāng)你回退到舊版本之后坤检,還想恢復(fù)到新版本兴猩,此時(shí)用git log又查看不到版本號(hào)怎么辦?此時(shí)就可以使用git reflog
查看命令歷史早歇,進(jìn)行找回倾芝。
$ git reflog
eec6851 (HEAD -> master, origin/master, origin/HEAD) HEAD@{0}: reset: moving to HEAD^
08fea15 HEAD@{1}: reset: moving to 08fea1512175c003
eec6851 (HEAD -> master, origin/master, origin/HEAD) HEAD@{2}: reset: moving to HEAD^
工作區(qū)和暫存區(qū)
剛學(xué)git的時(shí)候讨勤,我并不清楚有這個(gè)概念,所以經(jīng)常很難理解一些操作蛀醉。所以這次就帶你來(lái)了解一下它們吧悬襟,可以更好地理解git哦衅码!
工作區(qū)就是電腦里看到的目錄啦拯刁。
另外,我們使用git init的時(shí)候有自動(dòng)生成一個(gè).git目錄逝段,這個(gè)是git的版本庫(kù)垛玻,并不算是工作區(qū)。
版本庫(kù)里存了很多東西奶躯,其中最重要的有stage和git自動(dòng)創(chuàng)建的第一個(gè)分支master帚桩,以及指向master的指針HEAD.
stage就是暫存區(qū)。
當(dāng)我們使用git add添加文件的時(shí)候嘹黔,就是添加到暫存區(qū)账嚎。
使用git commit提交更改的時(shí)候,就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支儡蔓。
當(dāng)我們使用的時(shí)候郭蕉,是不是會(huì)在git add好幾次之后才會(huì)做一次git commit呀?此時(shí)喂江,需要提交的文件召锈,會(huì)通過(guò)git add放到暫存區(qū),然后在git commit的時(shí)候获询,一次性提交暫存區(qū)的所有修改涨岁。
撤銷(xiāo)修改 git checkout -- filename / git reset HEAD filename
正寫(xiě)著代碼呢,小貓跑過(guò)來(lái)啪啪啪幫忙寫(xiě)了幾爪子吉嚣,然后順手還幫你保存了梢薪。你很感激貓主子的“好意”,不過(guò)你還是想恢復(fù)到之前的模樣尝哆。
怎么辦呢秉撇?用眼睛一處處檢查,然后改回來(lái)么较解?那萬(wàn)一整個(gè)文件都給你刪了呢畜疾?
不用慌,此時(shí)使用git checkout -- filename
撤銷(xiāo)修改就好啦印衔!之后啡捶,這個(gè)文件就會(huì)回到最近一次git commit或git add時(shí)的狀態(tài)。
git checkout
其實(shí)是用版本庫(kù)里的版本替換工作區(qū)的版本奸焙,無(wú)論工作區(qū)是修改還是刪除瞎暑,都可以“一鍵還原”彤敛。
那么,萬(wàn)一你離開(kāi)電腦的時(shí)候了赌,小貓幫你寫(xiě)了一堆代碼墨榄,你回來(lái)之后直接使用git add添加到了暫存區(qū)怎么辦?
使用git reset HEAD filename
就可以把暫存區(qū)的修改撤銷(xiāo)掉勿她,重新放回工作區(qū)
了袄秩!
假如你不僅add了,還commit了怎么辦逢并?參考上面版本回退部分的相關(guān)命令之剧,就好了。