前言:
教程來源于Udacity的免費(fèi)教程-用Git進(jìn)行版本控制刃泡,這里僅是個(gè)人的筆記,參考使用赞别。
git add:
將文件從工作目錄添加到暫存區(qū)中焦履。
git commit:
將文件從暫存區(qū)中取出贸典,并存儲(chǔ)到倉庫(repo)中视卢。即實(shí)際要提交的地方
git diff:
可以顯示兩個(gè)版本之間的代碼差異。與git log -p輸出的內(nèi)容是一致的廊驼。
*這里的add和commit和SVN里的概念是一樣的
移至正確的項(xiàng)目
如果你一直跟著操作据过,那么現(xiàn)在你的計(jì)算機(jī)中,應(yīng)該在兩個(gè)目錄下有 git 項(xiàng)目:
new-git-project - 使用 git init 轉(zhuǎn)換為 git 倉庫的空目錄
course-git-blog-project - 使用 git clone 獲得的現(xiàn)有博客項(xiàng)目
為了避免與已有的 commit 產(chǎn)生混淆妒挎,我們將向 new-git-project 倉庫提交 commit绳锅。
在終端上,確保使用 cd 命令轉(zhuǎn)到 new-git-project 目錄中酝掩。如果你沒有 new-git-project 目錄鳞芙,現(xiàn)在創(chuàng)建一個(gè)。位于該目錄中后,運(yùn)行 git init 命令原朝。如果你之前已經(jīng)運(yùn)行了 git init驯嘱,沒關(guān)系。多次運(yùn)行 git init 不會(huì)導(dǎo)致任何問題喳坠,因?yàn)樗皇侵匦鲁跏蓟?Git 目錄鞠评。
切換到new-git-project下:
cd
cd new-git-project
git status 輸出總結(jié)
以下是輸出:
On branch master
Initial commit
nothing to commit (create/copy files and use "git add" to track)
注意最后一行 – nothing to commit (create/copy files and use "git add" to track)。注意到它推薦使用的 git add 命令了嗎壕鹉?這很有幫助剃幌!git status 的輸出結(jié)果將給出下一步應(yīng)該怎么做的建議或提示。
我們根據(jù)反饋的建議操作晾浴,并創(chuàng)建一些文件锥忿。
創(chuàng)建 HTML 文件
首先,創(chuàng)建一個(gè)叫做 index.html 的文件怠肋,并添加一些起始代碼:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Blog Project</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<link rel="stylesheet" href="css/app.css">
</head>
<body>
<script src="js/app.js"></script>
</body>
</html>
注意,代碼引用了 CSS 文件和 JavaScript 文件淹朋。
現(xiàn)在創(chuàng)建這些 CSS 和 JavaScript 文件笙各。你可以讓這兩個(gè)文件留空。稍后我們將向文件中添加內(nèi)容础芍。
整體回顧
很酷吧杈抢?我們尚未對(duì) git 執(zhí)行任何特殊操作,但是它已經(jīng)在觀察這個(gè)目錄(因?yàn)樗?git 項(xiàng)目)仑性,并且知道我們創(chuàng)建了幾個(gè)新的文件惶楼。git status 命令的輸出同樣十分簡(jiǎn)潔地告訴我們 git 沒有跟蹤這些文件。
我們快速回顧一下正在進(jìn)行的操作以及將要執(zhí)行的操作:
我們新建了幾個(gè)希望 git 開始跟蹤的文件
為了讓 git 能跟蹤文件诊杆,需要將該文件提交到倉庫中
要提交文件歼捐,需要將該文件放入暫存區(qū)
可以使用 git add 命令將文件從工作目錄移到暫存區(qū)
工作目錄中目前有三個(gè)未跟蹤文件
index.html
css 目錄下的 app.css
js 目錄下的 app.js
要將所有文件提交到倉庫中,首先需要將這些文件從工作目錄移到暫存區(qū)晨汹。我們將使用 git add 命令將這三個(gè)文件移到暫存區(qū)豹储。
暫存文件
是時(shí)候行動(dòng)了!在終端上運(yùn)行以下命令淘这,使用 git add 將 index.html 添加到暫存區(qū):
$ git add index.html
注意:我們僅添加了 index.html 文件剥扣。稍后我們將添加 CSS 和 JavaScript 文件。
Changes to be committed
輸出結(jié)果中現(xiàn)在出現(xiàn)了全新的區(qū)域:"Changes to be committed"區(qū)域铝穷!這一新的"Changes to be committed"區(qū)域顯示了位于暫存區(qū)的文件钠怯!目前只顯示了 index.html 文件,因此暫存區(qū)只有這個(gè)文件曙聂。繼續(xù)這一思路晦炊,如果我們現(xiàn)在提交 commit,則只有 index.html 文件會(huì)被提交。
提示:你注意到"Changes to be committed"下方的幫助文本了嗎刽锤?它提示 (use "git rm --cached <file>..." to unstage)镊尺,也就是當(dāng)你不小心運(yùn)行了 git add 并提供了錯(cuò)誤文件,它會(huì)提示你應(yīng)該怎么操作并思。
順便提下庐氮,git rm --cached 與 shell 的 rm 命令不同。git rm --cached 不會(huì)破壞任何屬于你的文件宋彼,它只是從暫存區(qū)刪掉了文件弄砍。
如果我們誤添加了一文件,我們可以使用
git rm --cache file name
來將文件從暫存區(qū)(staging)中移出
暫存剩余的文件
index.html 文件已暫存输涕。我們?cè)贂捍媪硗鈨蓚€(gè)文件∫羯簦現(xiàn)在我們可以運(yùn)行以下命令:
$ git add css/app.css js/app.js
但是要輸入的內(nèi)容好多啊。我們可以使用一個(gè)特殊的命令行字符:
句點(diǎn) .
句點(diǎn)指代當(dāng)前目錄莱坎,可以用來表示所有文件和目錄(包括所有嵌套文件和目錄R率健)。
$ git add css/app.css js/app.js
# 等同于
$ git add .
唯一要注意的是檐什,你可能會(huì)不小心包含多余的文件〔晡裕現(xiàn)在,我們希望同時(shí)暫存 css/app.css 和 js/app.js乃正,因此運(yùn)行該命令沒問題∽〔幔現(xiàn)在假設(shè)你向 img 目錄添加了一些圖片,但是暫時(shí)不想暫存這些圖片瓮具。運(yùn)行 git add . 將暫存這些圖片荧飞。如果你暫存了不想暫存的文件,git status 會(huì)告訴你撤消暫存需要用到的命令名党。
暫存剩余的文件
我們使用以下簡(jiǎn)寫命令暫存剩余的文件:
$ git add .
然后運(yùn)行 git status:
git add 小結(jié)
git add 命令用于將文件從工作目錄移到暫存區(qū)叹阔。
$ git add <file1> <file2> … <fileN>
此命令:
可接受多個(gè)文件名(用空格分隔)
此外,可以使用句點(diǎn) . 來代替文件列表传睹,告訴 git 添加當(dāng)前目錄至?xí)捍鎱^(qū)(以及所有嵌套文件)
提交 Commit
我們開始提交吧条获!
要在 git 中提交 commit,你需要使用 git commit 命令蒋歌,但是先別運(yùn)行這條命令帅掘。運(yùn)行這條命令將會(huì)打開你在第一節(jié)課配置的代碼編輯器。如果你尚未運(yùn)行以下命令:
$ git config --global core.editor <your-editor's-config-went-here>
回到 git 配置步驟并讓 git 使用你所選的編輯器堂油。
我這里使用的vim編輯器修档,也可以使用其它的,參考用Git進(jìn)行版本控制(一)配置中有具體的說明府框。
輸入 git commit 會(huì)打開配置好的編輯器吱窝。
類似下面這樣:(我給提前了,忘記截圖)
第一段精確地告訴了我們需要執(zhí)行的操作 - 我們需要為該 commit 提供一條消息。此外 院峡,任何以字符 # 開頭的行將被忽略兴使。在后面還提示:這將是初始 commit。最后照激,給出了將提交 commit 的文件列表发魄。
我們需要添珈一條“commit消息說明”即可。
如果是VIM俩垃,輸入完成以后励幼,按ESC,然后在命令處輸入 :wq口柳,保存退出VIM苹粟,回到Git Shell窗口。
現(xiàn)在回到終端跃闹,你應(yīng)該能看到類似于以下內(nèi)容的界面:
終于提交了第一個(gè) commit嵌削,恭喜!
使用 -m 選項(xiàng)繞過編輯器
提示:如果你要編寫的提交說明很簡(jiǎn)短望艺,不想等打開代碼編輯器后再輸入信息苛秕,可以直接在命令行中使用 -m 選項(xiàng)傳入信息:
$ git commit -m "Initial commit"
在上述示例中,文本"Initial commit"被作為提交說明信息荣茫。但是注意,不能為 commit 提供信息的描述(description)场靴,只能提供信息部分(message)啡莉。
第二個(gè) commit - 添加更改
我們已經(jīng)短暫休息了一下,現(xiàn)在提交第二個(gè) commit旨剥!將以下內(nèi)容添加到 index.html 中的 body 標(biāo)記中:
<header>
<h1>Expedition</h1>
</header>
下一步是什么咧欣?沒錯(cuò),運(yùn)行 git status轨帜!
具有多個(gè)作用的 git add
我們修改了文件魄咕。git 看到該文件已被修改。到目前為止蚌父,一切正常哮兰。注意,要提交 commit苟弛,待提交的文件必須位于暫存區(qū)喝滞。要將文件從工作目錄移到暫存區(qū),我們應(yīng)該使用哪個(gè)命令膏秫?答對(duì)了右遭,是 git add!
我們使用 git add 向暫存區(qū)添加了新建的文件,同樣的窘哈,我們也能使用同一命令將修改的文件暫存吹榴。
現(xiàn)在使用 git add 命令將文件移到暫存區(qū),并使用 git status 驗(yàn)證文件是否位于暫存區(qū)滚婉。
*即便是修改的文件图筹,也要使用git add命令將修改的文件放在暫存區(qū)域。
執(zhí)行了git add 文件變成綠色满哪,這時(shí)候就可以commit了婿斥,使用-m跳過編輯器。
git commit -m "Add header to blog"
這時(shí)候通過git log 可以查看提前的信息:
git commit 小結(jié)
git commit 命令會(huì)取出暫存區(qū)的文件并保存到倉庫中哨鸭。
$ git commit
此命令:
將打開配置中指定的代碼編輯器
(請(qǐng)參閱第一節(jié)課中的 git 配置流程民宿,了解如何配置編輯器)
在代碼編輯器中:
必須提供提交說明
以 # 開頭的行是注釋,將不會(huì)被記錄
添加提交說明后保存文件
關(guān)閉編輯器以進(jìn)行提交
然后使用 git log 檢查你剛剛提交的 commit像鸡!
git diff
The git diff 命令可以用來查看已被加入但是尚未提交的更改活鹰。
$ git diff
查看待提交的內(nèi)容和線上版本的差異。
要查看 git diff 的實(shí)際運(yùn)行效果只估,我們需要一些未經(jīng)提交的更改志群!在 index.html 中,我們重新組織標(biāo)題的措辭蛔钙。將標(biāo)題從"Expedition"改為"Adventure"锌云。保存文件,然后在終端上運(yùn)行 git diff吁脱。
你應(yīng)該會(huì)看到以下結(jié)果:
哇桑涎,看起來是不是很熟悉啊兼贡?和運(yùn)行 git log -p 的結(jié)果一樣攻冷!告訴你個(gè)秘密,git log -p 其實(shí)就是在后臺(tái)使用了 git diff遍希。所以你實(shí)際上已經(jīng)知道如何閱讀 git diff 的輸出結(jié)果等曼!
git diff 小結(jié)
總結(jié)下,git diff 命令用來查看已經(jīng)執(zhí)行但是尚未 commit 的更改:
$ git diff
此命令會(huì)顯示:
已經(jīng)修改的文件
添加/刪除的行所在的位置
執(zhí)行的實(shí)際更改
讓 git 忽略某些文件
為何要忽略文件
還記得在幾個(gè)章節(jié)之前學(xué)習(xí)的 git add 嗎凿蒜?我們可以使用一個(gè)特殊的字符來表示當(dāng)前目錄和所有子目錄禁谦,而不用一個(gè)個(gè)地添加文件。還記得是什么字符嗎废封?
沒錯(cuò)枷畏,是句點(diǎn) (.)!
問題
假設(shè)你向項(xiàng)目所在目錄添加了一個(gè) Word 文檔等文件虱饿,但是不希望將該文件添加到倉庫中拥诡。git 會(huì)看到這個(gè)新文件触趴,所以在你運(yùn)行 git status 時(shí),它將顯示在文件列表中渴肉。
在項(xiàng)目中包含此文件存在的潛在問題是冗懦,因?yàn)?git add . 會(huì)添加所有文件,因此該 Word 文檔可能會(huì)不小心 commit 到倉庫仇祭。
gitignore
如果你想將某個(gè)文件保留在項(xiàng)目的目錄結(jié)構(gòu)中披蕉,但是確保它不會(huì)意外地提交到項(xiàng)目中,可以使用名稱特殊的文件 .gitignore(注意文件名開頭的點(diǎn)乌奇,很重要C唤病)。將此文件添加到 new-git-project項(xiàng)目根目錄礁苗。你只需列出希望 git ignore(忽略爬凑,不跟蹤)的文件名,git 將忽略這些文件试伙。
我們用"project.docx"文件試一下嘁信。將以下行添加到 .gitignore 文件中:(在根目錄新建.gitignore文件,沒有擴(kuò)展名)
project.docx
現(xiàn)在運(yùn)行 git status 并查看輸出結(jié)果:
*.gitignore無法直接在文件系統(tǒng)中新建疏叨,可以通過命令行進(jìn)行重命名:
mv .gitignore.txt .gitignore
git 知道查看名稱為 .gitignore 的文件的內(nèi)容潘靖。因?yàn)樗谄渲锌吹?project.docx",所以忽略了該文件蚤蔓,并且沒有在 git status 的輸出結(jié)果中顯示該文件卦溢。
通配符速成課程
假設(shè)你向項(xiàng)目中添加了 50 個(gè)圖片,但是希望 git 忽略所有這些圖片秀又。這樣的話单寂,是否需要將每個(gè)文件名都列在 .gitignore
文件中呢?當(dāng)然不用了涮坐,要不然太可怕了凄贩!相反誓军,你可以采用一個(gè)叫做 通配符(英 的概念袱讹。
通配符允許你使用特殊的字符來表示某些格式/字符。在 .gitignore 文件中昵时,你可以使用:
空白行作為空格
- 將行標(biāo)記為注釋
- 與 0 個(gè)或多個(gè)字符匹配
? - 與 1 個(gè)字符匹配
[abc] - 與 a捷雕、b 或 c 匹配
** - 與嵌套目錄匹配 - a/**/z 與以下項(xiàng)匹配
a/z
a/b/z
a/b/c/z
因此如果所有 50 個(gè)圖片都是 JPEG 圖片,并且位于"samples"文件夾中壹甥,那么我們可以向 .gitignore 中添加以下行救巷,使 git 忽略所有這 50 個(gè)圖片。
- 與 0 個(gè)或多個(gè)字符匹配
samples/*.jpg
gitignore 小結(jié)
總結(jié)下句柠,.gitignore 文件用來告訴 git 不應(yīng)跟蹤的文件浦译。該文件應(yīng)該放在 .git 目錄所在的目錄棒假。