移至正確的項(xiàng)目
如果你一直跟著操作盈电,那么現(xiàn)在你的計(jì)算機(jī)中,應(yīng)該在兩個(gè)目錄下有 git 項(xiàng)目:
new-git-project - 使用git init
轉(zhuǎn)換為 git 倉(cāng)庫(kù)的空目錄
course-git-blog-project - 使用 git clone
獲得的現(xiàn)有博客項(xiàng)目
為了避免與已有的 commit 產(chǎn)生混淆泊脐,我們將向 new-git-project 倉(cāng)庫(kù)提交 commit佛寿。
在終端上默责,確保使用 cd
命令轉(zhuǎn)到 new-git-project
目錄中。如果你沒(méi)有 new-git-project
目錄句柠,現(xiàn)在創(chuàng)建一個(gè)浦译。位于該目錄中后,運(yùn)行 git init
命令溯职。如果你之前已經(jīng)運(yùn)行了 git init
精盅,沒(méi)關(guān)系。多次運(yùn)行git init
不會(huì)導(dǎo)致任何問(wèn)題谜酒,因?yàn)樗皇侵匦鲁跏蓟?Git 目錄叹俏。
你的終端應(yīng)該如下圖所示:
狀態(tài)!狀態(tài)僻族!狀態(tài)粘驰!
我已經(jīng)多次提到,但是還是要提下述么,git status
命令在這節(jié)課將非常有用蝌数。你應(yīng)該在任何一個(gè)其他 git 命令之前和之后運(yùn)行 git status
命令。
我們立即運(yùn)行該命令吧度秘!
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)容。
快速檢查 git 狀態(tài)
我們剛剛通過(guò)添加了文件和內(nèi)容對(duì)倉(cāng)庫(kù)進(jìn)行了幾個(gè)更改∑胗ぃ現(xiàn)在該快速檢查下 git 的狀態(tài)了:
``` $ git status```
我的終端顯示了以下內(nèi)容:
整體回顧
很酷吧油猫?我們尚未對(duì) git 執(zhí)行任何特殊操作,但是它已經(jīng)在觀察這個(gè)目錄(因?yàn)樗?git 項(xiàng)目)柠偶,并且知道我們創(chuàng)建了幾個(gè)新的文件情妖。git status
命令的輸出同樣十分簡(jiǎn)潔地告訴我們 git 沒(méi)有跟蹤這些文件睬关。
我們快速回顧一下正在進(jìn)行的操作以及將要執(zhí)行的操作:
我們新建了幾個(gè)希望 git 開(kāi)始跟蹤的文件
為了讓 git 能跟蹤文件,需要將該文件提交到倉(cāng)庫(kù)中
要提交文件毡证,需要將該文件放入暫存區(qū)
可以使用 git add
命令將文件從工作目錄移到暫存區(qū)
工作目錄中目前有三個(gè)未跟蹤文件
index.html
css
目錄下的 app.css
js
目錄下的app.js
要將所有文件提交到倉(cāng)庫(kù)中电爹,首先需要將這些文件從工作目錄移到暫存區(qū)。我們將使用 git add 命令將這三個(gè)文件移到暫存區(qū)料睛。
暫存文件
是時(shí)候行動(dòng)了丐箩!在終端上運(yùn)行以下命令,使用 git add
將 index.html
添加到暫存區(qū):
$ git add index.html
注意:我們僅添加了 index.html
文件恤煞。稍后我們將添加 CSS 和 JavaScript 文件屎勘。
運(yùn)行git add
命令沒(méi)有任何輸出(同樣也沒(méi)有錯(cuò)誤)。如何讓 git
告訴我們它執(zhí)行了什么操作以及添加的 index.html 文件發(fā)生了什么呢居扒?git status
就可以告訴我們這些信息概漱。你可能對(duì)我一直在強(qiáng)調(diào) git status
命令的重要性開(kāi)始感到厭煩了,但是它是非常重要的命令喜喂,特別是在你對(duì)版本控制/命令行工具不是非常熟練的時(shí)期瓤摧,更要注重該命令。
我們來(lái)看看項(xiàng)目的狀態(tài):
$ git status
這是我獲得的輸出結(jié)果:
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ū)刪掉了文件。
此外膳汪,幫助文本中出現(xiàn)了"unstage"(撤消暫存)字眼唯蝶。將文件從工作目錄移到暫存區(qū)叫做"staging"(暫存)。如果已移動(dòng)文件遗嗽,則叫做"staged"(已暫存)粘我。從暫存區(qū)將文件移回工作目錄將"unstage"(撤消暫存)。如果你閱讀的文檔中提示“stage the following files”痹换,則表明你應(yīng)該使用 git add 命令征字。
暫存剩余的文件
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)前目錄畅厢,可以用來(lái)表示所有文件和目錄(包括所有嵌套文件和目錄!)氮昧。
```bash
$ git add css/app.css js/app.js
# 等同于
$ git add .
```
唯一要注意的是框杜,你可能會(huì)不小心包含多余的文件。現(xiàn)在郭计,我們希望同時(shí)暫存 css/app.css 和 js/app.js霸琴,因此運(yùn)行該命令沒(méi)問(wèn)題。現(xiàn)在假設(shè)你向 img 目錄添加了一些圖片昭伸,但是暫時(shí)不想暫存這些圖片梧乘。運(yùn)行 git add . 將暫存這些圖片。如果你暫存了不想暫存的文件庐杨,git status
會(huì)告訴你撤消暫存需要用到的命令选调。
暫存剩余的文件
我們使用以下簡(jiǎn)寫(xiě)命令暫存剩余的文件:
$ git add .
然后運(yùn)行 git status
:
git add 小結(jié)
git add 命令用于將文件從工作目錄移到暫存區(qū)。
$ git add <file1> <file2> … <fileN>
此命令:
可接受多個(gè)文件名(用空格分隔)
此外灵份,可以使用句點(diǎn) . 來(lái)代替文件列表仁堪,告訴 git 添加當(dāng)前目錄至?xí)捍鎱^(qū)(以及所有嵌套文件)
最后一次 git 狀態(tài)檢查
如果你尚未向工作目錄添加任何文件或修改任何現(xiàn)有文件,則不會(huì)有任何被修改內(nèi)容填渠,但是為了進(jìn)行確認(rèn)弦聂,我們需要在提交 commit 之前再次快速運(yùn)行下 git status,以確保項(xiàng)目是我們預(yù)期的狀態(tài)氛什。
提交 Commit
我們開(kāi)始提交吧莺葫!
要在 git 中提交 commit,你需要使用 git commit
命令枪眉,但是先別運(yùn)行這條命令捺檬。運(yùn)行這條命令將會(huì)打開(kāi)你在第一節(jié)課配置的代碼編輯器。如果你尚未運(yùn)行以下命令:
$ git config --global core.editor <your-editor's-config-went-here>
回到 git 配置步驟并讓 git 使用你所選的編輯器贸铜。
如果你尚未執(zhí)行這一步驟并且已經(jīng)運(yùn)行 git commit
堡纬,那么 git 可能會(huì)默認(rèn)使用 Vim 編輯器。Vim 很受 Unix 或 Linux 系統(tǒng)用戶(hù)的歡迎蒿秦,但是對(duì)新用戶(hù)來(lái)說(shuō)烤镐,并不太好用。這門(mén)課程肯定不推薦使用該編輯器棍鳖。請(qǐng)參閱這篇關(guān)于如何退出 Vim 的帖子职车,了解如何回到普通的命令提示符界面。
如果你配置了編輯器,那么可以使用 git commit
命令提交 commit:
$ git commit
注意悴灵,你的編輯器應(yīng)該會(huì)打開(kāi)并且會(huì)出現(xiàn)以下界面:
終端凍結(jié)了
如果你快速切回終端,會(huì)看到終端凍結(jié)了骂蓖,并等待你在彈出的代碼編輯器完成編輯积瞒。不用擔(dān)心。當(dāng)我們向代碼編輯器添加必要的內(nèi)容登下,并最終關(guān)閉代碼編輯器窗口后茫孔,終端將不再凍結(jié),并回到正常狀況被芳。
代碼編輯器 Commit 消息解釋說(shuō)明
回到代碼編輯器缰贝。我的編輯器顯示了以下內(nèi)容:
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
#
# Initial commit
#
# Changes to be committed:
# new file: css/app.css
# new file: index.html
# new file: js/app.js
#
第一段精確地告訴了我們需要執(zhí)行的操作 - 我們需要為該 commit
提供一條消息。此外 畔濒,任何以字符 # 開(kāi)頭的行將被忽略剩晴。在后面還提示:這將是初始 commit。最后炫惩,給出了將提交 commit 的文件列表猜嘱。
因?yàn)檫@是存儲(chǔ)庫(kù)的第一個(gè)commit
伐债,我們將使用 commit 消息"Initial commit"
。文本"Initial commit"
并不特殊绽左,只是第一個(gè) commit 的常用消息。如果你想使用其他消息艇潭,完全可以拼窥!
在代碼編輯器的第一行輸出 commit 消息:
完成提交
現(xiàn)在保存文件并關(guān)閉編輯器窗口(只關(guān)閉面板/標(biāo)簽頁(yè)還不夠,你還需要關(guān)閉 git commit
命令打開(kāi)的代碼編輯器窗口)蹋凝。
現(xiàn)在回到終端鲁纠,你應(yīng)該能看到類(lèi)似于以下內(nèi)容的界面:
終于提交了第一個(gè) commit,恭喜仙粱!
你剛剛提交了第一個(gè) commit - 哇房交! ???? 有何感受?是不是有點(diǎn)虎頭蛇尾的感覺(jué)伐割。說(shuō)實(shí)話候味,當(dāng)我第一次提交 commit 時(shí),我的感受就如同
“等等...就這樣隔心?只是把將要進(jìn)行提交的文件添加到了暫存區(qū)白群,然后運(yùn)行 'git commit'?”
答案是 “是的”硬霍。是的帜慢,就這些內(nèi)容。一開(kāi)始,你會(huì)覺(jué)得版本控制是一個(gè)要克服的龐大障礙粱玲,然后才能成為真正的程序員/開(kāi)發(fā)者/設(shè)計(jì)師等等躬柬。但是當(dāng)你理解術(shù)語(yǔ)(我認(rèn)為是最具挑戰(zhàn)的部分)后,實(shí)際運(yùn)用版本控制就不是那么可怕了抽减。
使用
-m
選項(xiàng)繞過(guò)編輯器提示:如果你要編寫(xiě)的提交說(shuō)明很簡(jiǎn)短允青,不想等打開(kāi)代碼編輯器后再輸入信息,可以直接在命令行中使用
-m
選項(xiàng)傳入信息:$ git commit -m "Initial commit"
在上述示例中卵沉,文本
"Initial commit"
被作為提交說(shuō)明信息颠锉。但是注意,不能為 commit 提供信息的描述(description)史汗,只能提供信息部分(message)琼掠。
第二個(gè) commit - 添加更改
我們已經(jīng)短暫休息了一下,現(xiàn)在提交第二個(gè) commit停撞!將以下內(nèi)容添加到 index.html
中的 body
標(biāo)記中:
<header>
<h1>Expedition</h1>
</header>
下一步是什么瓷蛙?沒(méi)錯(cuò),運(yùn)行 git status
怜森!
[[圖片上傳失敗...(image-c1ec9c-1523348666713)]
終端顯示了 git status
命令的結(jié)果速挑。它顯示了"Changes not staged for commit"部分,其中包含修改后的"index.html"文件副硅。](https://classroom.udacity.com/nanodegrees/nd019-cn/parts/8998189c-3298-475c-9069-db3866d4a688/modules/6394fac9-adee-4a2b-94ca-a9df7ef5c384/lessons/5f584ce7-1b7b-4848-80c1-b559739ea363/concepts/95564c00-5060-45e7-aa24-e26fb9039f90#)
提示:如果你運(yùn)行了
git status
姥宝,但是沒(méi)有看到index.html
已更改,確保文件已被保存恐疲。我經(jīng)常在修改文件以后忘記保存文件腊满!我覺(jué)得修改文件后是否記得保存是衡量真正的專(zhuān)業(yè)人士的標(biāo)準(zhǔn)。
具有多個(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ū)。
第二個(gè) commit
現(xiàn)在我們的文件已經(jīng)具有可以提交的更改落包,讓我們提交第二個(gè) commit 吧部蛇!使用 git commit
命令提交 commit,并添加提交說(shuō)明 Add header to blog
咐蝇。
現(xiàn)在搪花,你可能會(huì)問(wèn)自己:“Richard 為何會(huì)這樣書(shū)寫(xiě)提交說(shuō)明?” 或 “何為好的提交說(shuō)明嘹害?”。問(wèn)的好吮便,我們將在下一部分探討這些問(wèn)題笔呀!
commit 中應(yīng)該包含什么內(nèi)容
我一直在告訴你要?jiǎng)?chuàng)建什么文件,提供需要要包含的內(nèi)容髓需,并告訴你何時(shí)應(yīng)該進(jìn)行 commit许师。但是你自己知道應(yīng)該在 Commit 中包含什么內(nèi)容,以及何時(shí)/多久進(jìn)行 commit 嗎僚匆?
關(guān)鍵在于使每個(gè) commit 都有其側(cè)重點(diǎn)微渠。每個(gè) commit 應(yīng)該記錄一項(xiàng)更改。這種說(shuō)法可能比較主觀(完全沒(méi)問(wèn)題)咧擂,但是每個(gè) commit 應(yīng)該只對(duì)項(xiàng)目的一個(gè)方面做出更改逞盆。
這并不限制可以添加/刪除多少行代碼或添加/刪除/修改多少個(gè)文件。假設(shè)你想更改側(cè)欄松申,并向其中添加新的圖片云芦。你可能會(huì):
向項(xiàng)目文件中添加新的圖片
更改 HTML
添加/修改 CSS 以包含新圖片
完全可以使用一個(gè) commit 記錄所有這些更改!
但是贸桶,一個(gè) commit 不應(yīng)包含不相關(guān)的更改舅逸,更改側(cè)欄,然后重新描述腳注內(nèi)容皇筛。這兩項(xiàng)更改相互沒(méi)有關(guān)系琉历,不應(yīng)包含在同一 commit 中。先進(jìn)行一項(xiàng)更改水醋,提交該更改旗笔,然后再進(jìn)行第二項(xiàng)更改。這樣的話离例,如果一個(gè)更改有 bug换团,你需要撤消該更改時(shí),則不用同時(shí)撤消另一個(gè)更改宫蛆。
我認(rèn)為在判斷應(yīng)該在 commit 中包含什么內(nèi)容時(shí)艘包,最好的方法是思考下“如果該 commit 中的所有更改都清空了的猛,會(huì)怎樣?”想虎。如果刪除了某個(gè) commit卦尊,應(yīng)該只撤消一項(xiàng)更改。
別擔(dān)心舌厨,commit 不會(huì)隨機(jī)地被清除岂却。
在后面的課程中,我們將學(xué)習(xí)使用 git 撤消 commit 中進(jìn)行的更改裙椭,以及如何謹(jǐn)慎地手動(dòng)刪除最后提交的一個(gè) commit躏哩。
git commit 小結(jié)
git commit
命令會(huì)取出暫存區(qū)的文件并保存到倉(cāng)庫(kù)中。
$ git commit
此命令:
將打開(kāi)配置中指定的代碼編輯器
(請(qǐng)參閱第一節(jié)課中的 git 配置流程揉燃,了解如何配置編輯器)
在代碼編輯器中:
必須提供提交說(shuō)明
以
#
開(kāi)頭的行是注釋?zhuān)瑢⒉粫?huì)被記錄添加提交說(shuō)明后保存文件
關(guān)閉編輯器以進(jìn)行提交
然后使用 git log
檢查你剛剛提交的 commit扫尺!
深入研究
將文本編輯器與 git 相關(guān)聯(lián) - 英 GitHub 幫助文檔
良好的提交說(shuō)明
我們來(lái)思考一個(gè)問(wèn)題:
如何編寫(xiě)良好的提交說(shuō)明?為何要編寫(xiě)好的提交說(shuō)明炊汤?
問(wèn)的好正驻!花點(diǎn)時(shí)間編寫(xiě)良好的提交說(shuō)明,再怎么強(qiáng)調(diào)這一點(diǎn)都不為過(guò)抢腐。
何為好的提交說(shuō)明呢姑曙?問(wèn)的好,很多人發(fā)表過(guò)關(guān)于這一問(wèn)題的文章迈倍,比如: 如何編寫(xiě) Git Commit Message - 英|譯文 伤靠、Commit message 和 Change log 編寫(xiě)指南。在編寫(xiě)好的提交說(shuō)明時(shí)授瘦,需要注意以下幾個(gè)事項(xiàng):
建議
消息篇幅簡(jiǎn)短(少于 60 個(gè)字符)
解釋提交的作用(不是如何更改或?yàn)楹胃模醋界。?/p>
禁忌
請(qǐng)勿解釋為何做出了這些更改(下文會(huì)深入講解這一點(diǎn))
請(qǐng)勿解釋如何進(jìn)行了更改(這是
git log -p
的目的!)請(qǐng)勿使用單詞"and"
如果你必須使用 "and"提完,則你的提交說(shuō)明可能進(jìn)行了太多的更改形纺,將這些更改拆分為獨(dú)立的 commit
例如 "make the background color pink and increase the size of the sidebar"
在編寫(xiě)提交說(shuō)明時(shí),我喜歡用以下短語(yǔ)造句:"This commit will…"徒欣。你可以補(bǔ)充完整該句子并作為提交說(shuō)明使用逐样。
最重要的是,在編寫(xiě)提交說(shuō)明時(shí)保持一致性打肝!
解釋原因
如果你需要解釋為何進(jìn)行了提交脂新,也可以!
在編寫(xiě)提交說(shuō)明時(shí)粗梭,第一行是消息本身争便。消息之后空一行,然后輸入正文或說(shuō)明断医,包括關(guān)于為何需要該 commit 的原因詳情(例如 URL 鏈接)滞乙。
以下是編輯提交說(shuō)明時(shí)屏幕可能顯示的內(nèi)容:
提交說(shuō)明的詳情描述部分包含在 git log
中奏纪。要查看帶有詳情描述的提交說(shuō)明,請(qǐng)參閱博客項(xiàng)目倉(cāng)庫(kù)并查看 commit 8a11b3f
斩启。
但是 git log --oneline
中僅包含了說(shuō)明(第一行)序调!
優(yōu)達(dá)學(xué)城的提交樣式要求
下一個(gè)是 git diff兔簇!
在下一部分发绢,我們將學(xué)習(xí)一個(gè)新的工具(具有相似的輸出!)垄琐。此工具可以在進(jìn)行提交之前告訴我們已對(duì)文件進(jìn)行了什么樣的更改边酒!