如果你有版本庫(kù)使用經(jīng)驗(yàn)蚓庭,則學(xué)習(xí)使用Git會(huì)非常容易毒嫡。但是分布式版本控制系統(tǒng)與集中式版本控制系統(tǒng)有著很多不同莹妒,一旦適應(yīng)了Git就再也難回到SVN上了。
創(chuàng)建版本庫(kù)
進(jìn)入創(chuàng)建好的空目錄诈茧,執(zhí)行git init
,瞬間就可以創(chuàng)建一個(gè)Git空版本庫(kù)捂掰。
查看版本庫(kù)狀態(tài)
執(zhí)行git status
敢会,查看當(dāng)前版本庫(kù)狀態(tài)。
添加文件到暫存區(qū)
執(zhí)行git add
这嚣,將文件添加到版本庫(kù)鸥昏,開始受版本庫(kù)管理。
從暫存區(qū)撤銷(unstage)
將文件添加到暫存區(qū)后姐帚,如果在提交前發(fā)現(xiàn)這個(gè)文件修改錯(cuò)誤了吏垮,則需要將文件從暫存區(qū)撤回。
提交文件到版本庫(kù)
執(zhí)行git commit -m "添加練習(xí)文件。"
膳汪,將文件提交到版本庫(kù)像樊,并添加提交注釋。注意旅敷,提交注釋在實(shí)際工作中生棍,必須添加,以方便后續(xù)跟蹤修改內(nèi)容媳谁。
查看修改差異
執(zhí)行git diff
涂滴,查看當(dāng)前修改了哪些內(nèi)容。
查看提交日志
執(zhí)行git log --pretty=oneline
晴音,可以查看提交日志柔纵,以方便版本選擇。
回退到指定版本
首先通過(guò)git log
锤躁,查看版本情況搁料,再執(zhí)行git reset --hard a54c8e
退回到指定版本(第2個(gè)版本)。
如果回退到歷史版本后系羞,還需要“前進(jìn)”到更新的版本郭计,則需要先使用git reflog
,來(lái)查看歷史命令椒振,然后找到文件對(duì)應(yīng)版本的commit_id昭伸,然后再使用git reset commit_id
回退到指定的更新的版本。
Git的幾個(gè)重要概念
Git版本庫(kù)中有幾個(gè)重要的概念澎迎,必須掌握這些概念庐杨,才能正確了解Git的工作原理。
工作區(qū)(Working Directory)
就是你在電腦里能看到的目錄夹供,比如我的D:盤learngit
文件夾就是一個(gè)工作區(qū):
版本庫(kù)(Repository)
工作區(qū)里面有一個(gè)隱藏目錄.git灵份,這個(gè)不算工作區(qū),而是Git的版本庫(kù)哮洽。
Git的版本庫(kù)里存了很多東西填渠,其中最重要的就是稱為stage(或者叫index)的暫存區(qū),還有Git為我們自動(dòng)創(chuàng)建的第一個(gè)分支master袁铐,以及指向master的一個(gè)指針叫HEAD揭蜒。
前面講了我們把文件往Git版本庫(kù)里添加的時(shí)候,是分兩步執(zhí)行的:
- 第一步是用
git add
把文件添加進(jìn)去剔桨,實(shí)際上就是把文件修改添加到暫存區(qū)屉更; - 第二步是用
git commit
提交更改,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支洒缀。
因?yàn)槲覀儎?chuàng)建Git版本庫(kù)時(shí)瑰谜,Git自動(dòng)為我們創(chuàng)建了唯一一個(gè)master分支欺冀,所以,現(xiàn)在萨脑,git commit就是往master分支上提交更改隐轩。
你可以簡(jiǎn)單理解為,需要提交的文件修改通通放到暫存區(qū)渤早,然后职车,一次性提交暫存區(qū)的所有修改。
所以stage是個(gè)相當(dāng)重要的概念鹊杖。例如悴灵,我修改了文件,但是還未使用git add
將文件添加到暫存區(qū)骂蓖。當(dāng)需要更新的多個(gè)文件(對(duì)應(yīng)某一個(gè)bug)修改到位了积瞒,就可以將這一批文件添加到暫存區(qū),然后執(zhí)行git commit -m "提交說(shuō)明"
將暫存區(qū)一起提交登下。
命令行會(huì)顯示Changes not staged for commit:
茫孔,也就是說(shuō)文件修改了,但是還未添加到暫存區(qū)被芳。
隨著時(shí)間的推移缰贝,工作區(qū)中的文件有新增的有修改的,也有新加入進(jìn)來(lái)還未進(jìn)行跟蹤(Untracked)的筐钟。我們一旦對(duì)stage有了清晰的認(rèn)識(shí)揩瞪,就能根據(jù)需求(新功能,或修改的某個(gè)bug)區(qū)分出哪些是需要在一批中提交篓冲,而哪些則不需要一并提交。
一旦提交宠哄,暫存區(qū)就又是干凈的了壹将。
例如毛嫉,當(dāng)我們執(zhí)行了git commit -m "提交說(shuō)明"
后诽俯,暫存區(qū)又變?yōu)榭铡.?dāng)然Untracked files
還是在工作區(qū)中“未跟蹤”承粤。
管理修改而不是管理文件
Git管理的是修改,提交時(shí)接受的修改是stage中的辛臊。例如第一次修改 -> git add
-> 第二次修改 -> git commit
仙粱,這個(gè)時(shí)候,只提交了第一次修改彻舰。
結(jié)合Java EE開發(fā)中的JPA(Hibernate)對(duì)持久化對(duì)象的管理伐割,可以近似的認(rèn)為候味,stage中(通過(guò)git add
添加)的修改,是“受管”的隔心,在工作區(qū)中但是沒(méi)有在stage中的修改是“游離態(tài)”的白群。受管的修改可以刷新(git commit -m "提交說(shuō)明"
)到持久化庫(kù)(版本庫(kù)中的某個(gè)版本)中。
理解Git是如何跟蹤修改的非常重要:每次修改硬霍,如果不add到暫存區(qū)帜慢,那就不會(huì)加入到commit中。
撤銷修改
當(dāng)有些時(shí)候唯卖,需要放棄某些修改時(shí)崖堤,可以方便的使用git checkout -- Git版本庫(kù)練習(xí)文件.txt
命令,將版本庫(kù)中的文件再次檢出以撤銷工作區(qū)中對(duì)該文件的修改耐床。如果修改文件后添加到暫存區(qū)后又修改了該文件密幔,則恢復(fù)到添加到暫存區(qū)之后的狀態(tài)。
如果要撤銷已添加到暫存區(qū)的修改撩轰,則需要先從暫存區(qū)撤回胯甩,然后再撤銷修改。
場(chǎng)景1:當(dāng)你改亂了工作區(qū)某個(gè)文件的內(nèi)容堪嫂,想直接丟棄工作區(qū)的修改時(shí)偎箫,用命令
git checkout -- file
。場(chǎng)景2:當(dāng)你不但改亂了工作區(qū)某個(gè)文件的內(nèi)容皆串,還添加到了暫存區(qū)時(shí)淹办,想丟棄修改,分兩步恶复,第一步用命令
git reset HEAD file
怜森,就回到了場(chǎng)景1,第二步按場(chǎng)景1操作谤牡。場(chǎng)景3:已經(jīng)提交了不合適的修改到版本庫(kù)時(shí)副硅,想要撤銷本次提交,則使用命令
git reset commit_id
進(jìn)行版本回退翅萤,不過(guò)前提是沒(méi)有推送到遠(yuǎn)程庫(kù)恐疲。
刪除文件
在Git中,刪除也是一個(gè)修改操作套么。使用命令git rm file
刪除文件培己,然后提交即可。
如果發(fā)覺(jué)刪除錯(cuò)了胚泌,則可以使用版本回退的方式git reset --hard HEAD^
省咨,在工作區(qū)中恢復(fù)誤刪除(并提交到版本庫(kù))的文件。