適合新手學(xué)習(xí)的git教程分享

Git 起源
同生活中的許多偉大事件一樣,Git 誕生于一個(gè)極富紛爭(zhēng)大舉創(chuàng)新的年代。Linux 內(nèi)核開源項(xiàng)目有著為數(shù)眾廣的參與者。絕大多數(shù)的 Linux 內(nèi)核維護(hù)工作都花在了提交補(bǔ)丁和保存歸檔的繁瑣事務(wù)上(1991-2002年間)。到 2002 年,整個(gè)項(xiàng)目組開始啟用分布式版本控制系統(tǒng) BitKeeper 來管理和維護(hù)代碼。到了 2005 年,開發(fā) BitKeeper 的商業(yè)公司同 Linux 內(nèi)核開源社區(qū)的合作關(guān)系結(jié)束,他們收回了免費(fèi)使用 BitKeeper 的權(quán)力。這就迫使 Linux 開源社區(qū)(特別是 Linux 的締造者 Linus Torvalds )不得不吸取教訓(xùn),只有開發(fā)一套屬于自己的版本控制系統(tǒng)才不至于重蹈覆轍。他們對(duì)新的系統(tǒng)制訂了若干目標(biāo):
Git 和其他版本控制系統(tǒng)的主要差別在于,Git 只關(guān)心文件數(shù)據(jù)的整體是否發(fā)生變化,而大多數(shù)其他系統(tǒng)則只關(guān)心文件內(nèi)容的具體差異。這類系統(tǒng)(CVS,Subversion,Perforce,Bazaar 等等)每次記錄有哪些文件作了更新,以及都更新了哪些行的什么內(nèi)容.
Git 并不保存這些前后變化的差異數(shù)據(jù)。實(shí)際上,Git 更像是把變化的文件作快照后,記錄在一個(gè)微型的文件系統(tǒng)中。每次提交更新時(shí),它會(huì)縱覽一遍所有文件的指紋信息并對(duì)文件作一快照,然后保存一個(gè)指向這次快照的索引。為提高性能,若文件沒有變化,Git 不會(huì)再次保存,而只對(duì)上次保存的快照作一鏈接.這是 Git 同其他系統(tǒng)的重要區(qū)別。它完全顛覆了傳統(tǒng)版本控制的套路,并對(duì)各個(gè)環(huán)節(jié)的實(shí)現(xiàn)方式作了新的設(shè)計(jì)。Git 更像是個(gè)小型的文件系統(tǒng)
1、創(chuàng)建新倉庫
gitinit
touchtest.txt
gitadd--a
gitcommit-m"fistcommit"
初始化新倉庫,在當(dāng)前目錄下由一個(gè).git的目錄,所有g(shù)it需要的數(shù)據(jù)和資源都放在這個(gè)目錄中,在當(dāng)面目錄下添加文件后,需要通過gitadd添加到文件追蹤管理(添加到暫存區(qū),數(shù)據(jù)存放在.git/index目錄索引,數(shù)據(jù)內(nèi)部保存在.git/objects中),gitcommit-m"提交說明備注"提交的信息會(huì)提交到數(shù)據(jù)倉庫,數(shù)據(jù)提交到正式倉庫,具體保存在.git/objects中,如以上提交會(huì)包含一個(gè)commit,tree,blob對(duì)象。
2、從現(xiàn)有倉庫克隆
gitcloneurl
<a href="mailto:gitclonegit@github.com:torvalds/linux.git">gitclonegit@github.com:torvalds/linux.git</a>
如從gitHub上克隆一份linux的源碼,不僅是克隆最新版本的源碼,還克隆了所有數(shù)據(jù)倉庫的歷史版本,每個(gè)文件的每一個(gè)版本,這個(gè)時(shí)候及時(shí)服務(wù)器github發(fā)生故障,可以用本地?cái)?shù)據(jù)倉庫重建服務(wù)器上的倉庫??梢曰貜?fù)到從服務(wù)器克隆或最后更一次從服務(wù)器拉去的狀態(tài)。在.git目錄中,已經(jīng)保存了所有版本記錄,本地文件夾即工作目錄的所有文件刪除了,然后從中取出最新版本的文件拷貝。
3、檢查文件更新狀態(tài)
要求確定當(dāng)前工作區(qū)和暫存區(qū)文件的狀態(tài),可以通過gitstatus命令。在工作區(qū)和暫存區(qū)的目錄狀態(tài)可以查看。
gitstatus
Onbranchmasternothingtocommit,workingdirectoryclean
當(dāng)前在默認(rèn)master分支,當(dāng)前工作目錄和暫存區(qū)沒有任何跟蹤的文件,也沒有任何文件提交后更改,也沒有新增加,未被跟蹤的文件。
notepadtest.txt
notepadt.txt
修改test.txt文件,新添加一個(gè)t.txt文件,查看當(dāng)前文件狀態(tài)。
$gitstatus
#Onbranchmaster
#Changesnotstagedforcommit:
#(use"gitadd<file>..."toupdatewhatwillbecommitted)
#(use"gitcheckout--<file>..."todiscardchangesinworkingdi
#
#modified:test.txt
#
#Untrackedfiles:
#(use"gitadd<file>..."toincludeinwhatwillbecommitted)
#
#t.txt
nochangesaddedtocommit(use"gitadd"and/or"gitcommit-a")
新增加的文件t.txt在未跟蹤文件范圍Untrackedfiles范圍,需要通過gitadd把改文件添加的暫存區(qū),歸入的版本跟蹤管理。
4、添加文件到暫存區(qū)
$gitadd.
$gitstatus
#Onbranchmaster
#Changestobecommitted:
#(use"gitresetHEAD<file>..."tounstage)
#
#modified:h.txt
#newfile:test.txt
gitadd.把當(dāng)前所有目錄文件所有新文件和修改文件添加到暫存區(qū),如果test.txt文件提示是Changesnotstagedforcommit,說明此跟蹤文件已經(jīng)發(fā)生修改,但是還未添加到暫存區(qū),把修改的文件通過gitadd命令添加到暫存區(qū)后。提示Changestobecommitted.文件已經(jīng)暫存,隨時(shí)可以提交到倉庫。h.txt新添加文件從未跟蹤狀態(tài)Untrackedfiles,通過gitadd命令添加到暫存區(qū),已加入跟蹤文件的范圍。
5、版本提交
$gitcommit-m"thisistestcommit"
[masterd4a498a]thisistestcommit
gitcommit--amend--reset-author</p> <p>2fileschanged,3insertions(+)
createmode100644t.txt
通過gitcommit-m"xxx"將當(dāng)前暫存區(qū)的內(nèi)容提交到倉庫,本次commit提交文件是在默認(rèn)master分支,提交commit對(duì)象存放在.git/objects的d4/1498a...的文件中,該文件指向一個(gè)樹tree對(duì)象。
6、查看當(dāng)前提交日志記錄
$gitlog
commitd4a498a197c24421acee5c5ff96cfbc7e5c3be9e
Author:andy<<a href="mailto:andy@gmail.com">andy@gmail.com</a>>
Date:SatMar814:23:372014+0800</p> <p>thisistestcommit</p> <p>commit80071e48614361dc282473d6482e3faa9fec17d9
Author:andy<<a href="mailto:andy@gmail.com">andy@gmail.com</a>>
Date:SatMar813:35:132014+0800</p> <p>1stcommit
gitlog命令查看當(dāng)前版本
7、文件差異比較
工作區(qū)和暫存區(qū)文件比較用gitdiff命令,暫存區(qū)和最近一天提交版本之間的差異,可以用gitdiff--cached/staged.如下:
目前在test.txt文件只有1111111文件內(nèi)容,我在文件test.txt中添加22222222等內(nèi)容,比較當(dāng)前暫存區(qū)和工作文件差異
$notepadtest.txt
$gitdiff
diff--gita/test.txtb/test.txt
index0147537..f33d264100644
---a/test.txt
+++b/test.txt
@@-1,3+1,4@@
11111111111111
+22222222222222
$gitstatus
#Onbranchmaster
#Changesnotstagedforcommit:
#(use"gitadd<file>..."toupdatewhatwillbecommitted)
#(use"gitcheckout--<file>..."todiscardchangesinworkingd
#
#modified:test.txt
#
nochangesaddedtocommit(use"gitadd"and/or"gitcommit-a")
$gitdiff--staged
可以發(fā)現(xiàn)工作區(qū)比暫存區(qū)test.txt文件多增加了22222222222222內(nèi)容。暫存區(qū)和數(shù)據(jù)倉庫內(nèi)容是完全相同的。同時(shí)看看當(dāng)前工作區(qū)狀態(tài)?,F(xiàn)在我們吧剛剛修改的內(nèi)容添加到暫存區(qū),同時(shí)比較暫存區(qū)和數(shù)據(jù)倉庫文件差異。
$gitaddtest.txt
$gitdiff
$gitstatus
#Onbranchmaster
#Changestobecommitted:
#(use"gitresetHEAD<file>..."tounstage)
#
#modified:test.txt
#
把工作區(qū)修改的內(nèi)容更新到暫存區(qū)后,可以看出此時(shí)暫存區(qū)和工作區(qū)文件完全相同。狀態(tài)是是已暫存,帶提交狀態(tài)。與此同時(shí),我們可以比較暫存區(qū)和數(shù)據(jù)殘酷之間的差異和比較。
$gitdiff--staged
diff--gita/test.txtb/test.txt
index0147537..f33d264100644
---a/test.txt
+++b/test.txt
@@-1,3+1,4@@
11111111111111
+22222222222222
我們可以很清楚的看到當(dāng)前暫存區(qū)和數(shù)據(jù)倉庫版本比較。暫存區(qū)test.txt內(nèi)容比最近一次提交內(nèi)容多22222222222222一行數(shù)據(jù)。提交數(shù)據(jù)到數(shù)據(jù)倉庫。我們現(xiàn)在可以把工作區(qū)目錄和數(shù)據(jù)倉庫比較,看看test.txt直接的文件內(nèi)容差異。
$gitdiffhead
diff--gita/test.txtb/test.txt
index0147537..f33d264100644
---a/test.txt
+++b/test.txt
@@-1,3+1,4@@
11111111111111
+22222222222222
可以很立即看出工作區(qū)文件內(nèi)容比較倉庫有新修改的內(nèi)容。此時(shí)我們提交更新所有文件都沒有差異了??纯次募町?。
$gitcommit-m"testgitdiff"
[masterfc0166f]testgitdiff
Committer:andy<<a href="mailto:andy@gmail.com">andy@gmail.com</a>></p> <p>gitcommit--amend--reset-author</p> <p>1filechanged,1insertion(+)
$gitdiff
$gitdiff--staged
$gitdiffhead
8、文件刪除和移動(dòng)
所有的工作區(qū)rmxxx刪除后,可以直接從數(shù)據(jù)倉庫獲取最近一次提交版本的內(nèi)容gitrmxxx。直接從數(shù)據(jù)倉庫刪除此文件內(nèi)容。
$ls
h.txttest.txt</p> <p>$rmh.txt</p> <p>$ls
test.txt</p> <p>$gitdiff
diff--gita/h.txtb/h.txt
deletedfilemode100644
index456f979..0000000
---a/h.txt
+++/dev/null
@@-1,3+0,0@@
-welcometohere
-verygood
可以通過文某比較當(dāng)前的工作目錄h.txt文件已經(jīng)被刪除了,工作區(qū)目錄和暫存區(qū)比較文件差異也可以返現(xiàn)文件刪除模式。接下來刪除暫存區(qū)目錄
$gitdiff--staged</p> <p>$gitrmh.txt
rm'h.txt'</p> <p>$gitdiff--staged
diff--gita/h.txtb/h.txt
deletedfilemode100644
index456f979..0000000
---a/h.txt
+++/dev/null
@@-1,3+0,0@@
-welcometohere
-verygood
-
$gitstatus
#Onbranchmaster
#Changestobecommitted:
#(use"gitresetHEAD<file>..."tounstage)
#
#deleted:h.txt
#
通過刪除暫存區(qū)文件前后可以比較出文件的差異。此時(shí)文件也不在跟蹤狀態(tài)。還有我們僅僅希望刪除暫存區(qū)的內(nèi)容,不刪除工作區(qū)的內(nèi)容
gitrm--cached-fh.txt的方式來實(shí)現(xiàn),特別是針對(duì)工作區(qū)有修改,要?jiǎng)h除暫存區(qū)內(nèi)容。
$gitreset--hard
HEADisnowatfc0166ftestgitdiff</p> <p>$ls
h.txttest.txt
$gitrm--cachedh.txt
rm'h.txt'</p> <p>$gitdiff</p> <p>$gitdiffhead
diff--gita/h.txtb/h.txt
deletedfilemode100644
index456f979..0000000
---a/h.txt
+++/dev/null
@@-1,3+0,0@@
-welcometohere
-verygood
-
$gitdiff-cached
error:invalidoption:-cached</p> <p>$gitdiff--cachedh.txt
diff--gita/h.txtb/h.txt
deletedfilemode100644
index456f979..0000000
---a/h.txt
+++/dev/null
@@-1,3+0,0@@
-welcometohere
-verygood
移動(dòng)
git移動(dòng)文件操作是是相對(duì)先移動(dòng)復(fù)制一個(gè)新文件,刪除原文件,添加新文件到跟蹤范圍。
$ls
h.txttest.txt</p> <p>$gitmvh.txtd.txt結(jié)果是等同于,相當(dāng)于以下三條命令</p> <p>$ls
d.txttest.txt</p> <p>$mvd.txtto.txt</p> <p>$gitrmd.txt
rm'd.txt'</p> <p>$gitaddto.txt
9、查看提交歷史
$gitlog
commitfc0166f53a45cfc4c17079e5e3454fb7e3136cb6
Author:andy<<a href="mailto:andy@gmail.com">andy@gmail.com</a>>
Date:SatMar815:52:102014+0800</p> <p>testgitdiff</p> <p>commitd6eab3a38aee0b25ac395899c82edd48723a2ea9
Author:andy<<a href="mailto:andy@gmail.com">andy@gmail.com</a>>
Date:SatMar815:36:532014+0800</p> <p>enforcecommit'</p> <p>commit85ec024140442df6db8625a07c2ee7369cceb704
Author:andy<<a href="mailto:andy@gmail.com">andy@gmail.com</a>>
Date:SatMar815:35:442014+0800
com3
gitlog查看提交歷史,gitlog-p-n最近n次提交的內(nèi)能和差異。查看歷史記錄統(tǒng)計(jì)信息gitlog--stat,查看提交的歷史記錄格式可自由選擇。
$gitlog--pretty=format:"%h-%an,%ar:%s"
fc0166f-yyf,48minutesago:testgitdiff
d6eab3a-yyf,63minutesago:enforcecommit'
85ec024-yyf,65minutesago:com3
d4a498a-unknown,2hoursago:thisistestcommit
80071e4-unknown,3hoursago:1stcommit
列出了常用的格式占位符寫法及其代表的意義。
選項(xiàng)說明
%H提交對(duì)象(commit)的完整哈希字串
%h提交對(duì)象的簡短哈希字串
%T樹對(duì)象(tree)的完整哈希字串
%t樹對(duì)象的簡短哈希字串
%P父對(duì)象(parent)的完整哈希字串
%p父對(duì)象的簡短哈希字串
%an作者(author)的名字
%ae作者的電子郵件地址
%ad作者修訂日期(可以用-date=選項(xiàng)定制格式)
%ar作者修訂日期,按多久以前的方式顯示
%cn提交者(committer)的名字
%ce提交者的電子郵件地址
%cd提交日期
%cr提交日期,按多久以前的方式顯示
%s提交說明
$gitlog--pretty=format:"%h%s"--graph
*78d907adevbranchcommit
*fc0166ftestgitdiff
*d6eab3aenforcecommit'
*85ec024com3
*d4a498athisistestcommit
*80071e41stcommit
選項(xiàng)說明
-p按補(bǔ)丁格式顯示每個(gè)更新之間的差異。
--stat顯示每次更新的文件修改統(tǒng)計(jì)信息。
--shortstat只顯示--stat中最后的行數(shù)修改添加移除統(tǒng)計(jì)。
--name-only僅在提交信息后顯示已修改的文件清單。
--name-status顯示新增、修改、刪除的文件清單。
--abbrev-commit僅顯示SHA-1的前幾個(gè)字符,而非所有的40個(gè)字符。
--relative-date使用較短的相對(duì)時(shí)間顯示(比如,“2weeksago”)。
--graph顯示ASCII圖形表示的分支合并歷史。
--pretty使用其他格式顯示歷史提交信息。可用的選項(xiàng)包括oneline,short,full,fuller和format(后跟指定格式)
10、撤銷操作
可以修改最后一次提交的內(nèi)容,當(dāng)你發(fā)現(xiàn)最近一次提交內(nèi)容不正確時(shí)候,可以通過gitcommit--amend修改
$gitcommit--amend-m"modifycommit"
[masterc660522]modifycommit
$gitlog--oneline
c660522modifycommit
fc0166ftestgitdiff
d6eab3aenforcecommit'
85ec024com3
d4a498athisistestcommit
80071e41stcommit
11、取消文件修改
gitreset|gitresethead將head指向的目錄樹重置的暫存區(qū)
gitreset--softhead^工作區(qū)和暫存區(qū)不變,但是引用向前回退一次,當(dāng)對(duì)最新提交不滿意的時(shí)候,撤銷最新提交以便更改
gitcommit-e-F.git/COMMIT_EDITMSG以上兩個(gè)命令相當(dāng)于gitcommit--amend
gitresethead^
gitreset--mixedhead^暫存區(qū)和引用回退到上一次提交之前
gitreset--hardhead^引用工作區(qū)暫存區(qū)徹底消除
相關(guān)文章
WebStorm如何調(diào)試Vue項(xiàng)目? webstorm配置vue開發(fā)環(huán)境指南
WebStorm 支持多種調(diào)試工具,包括瀏覽器的開發(fā)者工具,但本文主要講解的是使用 WebStorm 自帶的調(diào)試功能2025-04-15VSCode和webstorm怎么設(shè)置綠色護(hù)眼背景? 綠豆沙背景色的設(shè)置方法
護(hù)眼色一定程度能保護(hù)眼睛,緩解疲勞,VSCode和webstorm這兩款常用的軟件怎么設(shè)置護(hù)眼色呢?詳細(xì)請(qǐng)看下文介紹2025-04-15WebStorm常用插件以及實(shí)用設(shè)置分享
WebStorm本身已經(jīng)足夠強(qiáng)大,但一些優(yōu)秀的插件能錦上添花,顯著提升開發(fā)效率,詳細(xì)請(qǐng)看下文介紹2025-04-15如何安裝配置WebStorm? WebStorm安裝與使用全方位指南
WebStorm軟件在前端和后端開發(fā)領(lǐng)域都備受青睞,很多朋友不知道該怎么下載安裝,下面我們就來看看詳細(xì)的安裝配置教程2025-04-15Webstorm怎么配置? Webstorm入門之軟件配置教程
WebStorm是一款功能強(qiáng)大的集成開發(fā)環(huán)境(IDE),支持各種前端開發(fā)技術(shù),今天我們就來看看Webstorm的配置教程2025-04-15Webstorm怎么設(shè)置字體大小/背景顏色/背景圖片?
WebStorm 允許您自定義界面顏色,以創(chuàng)建更個(gè)性化和美觀的工作空間,今天我們就來看看Webstorm改變字體大小、背景顏色、設(shè)置背景圖片的方法2025-04-15- VScode上安裝PlatformIO插件能成功安裝,嘗試卸載VScode并刪除插件,這些錯(cuò)誤仍然存在,下面我們就來看看這個(gè)問題的解決辦法2025-04-03
提升代碼搜索效率! VSCode里DeepSeek插件安裝與配置指南
今天我們將向大家介紹如何在Visual Studio Code中安裝并配置 DeepSeek 插件,幫助你更高效地進(jìn)行代碼搜索2025-04-07提升你的編程效率! VSCode的初級(jí)使用教程超詳細(xì)版
VSCode是一款免費(fèi)且開源的代碼編輯器,因其強(qiáng)大的功能和良好的用戶體驗(yàn)而廣受歡迎,本文將詳細(xì)介紹 VSCode 的基本使用方法,并通過插圖幫助你更好地理解2025-04-03- 今天我們來聊聊如何安裝和配置VS Code,讓它成為你編程路上的得力助手,這個(gè)過程其實(shí)很簡單,只要跟著我的步驟走,你絕對(duì)能搞定2025-04-03