2.2 Git 基礎(chǔ) - 記錄每次更新到倉(cāng)庫(kù)

引自:https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E8%AE%B0%E5%BD%95%E6%AF%8F%E6%AC%A1%E6%9B%B4%E6%96%B0%E5%88%B0%E4%BB%93%E5%BA%93

常見(jiàn)名詞解釋?zhuān)?/h2>

倉(cāng)庫(kù)(repository)
開(kāi)始或停止跟蹤(track)文件
暫存(stage)
提交(commit)更改

請(qǐng)記住党远,你工作目錄下的每一個(gè)文件都不外乎這兩種狀態(tài):已跟蹤未跟蹤繁成。 已跟蹤的文件是指那些被納入了版本控制的文件耀怜,在上一次快照中有它們的記錄麻裁,在工作一段時(shí)間后, 它們的狀態(tài)可能是未修改,已修改或已放入暫存區(qū)。簡(jiǎn)而言之皇耗,已跟蹤的文件就是 Git 已經(jīng)知道的文件。

工作目錄中除已跟蹤文件外的其它所有文件都屬于未跟蹤文件揍很,它們既不存在于上次快照的記錄中郎楼,也沒(méi)有被放入暫存區(qū)万伤。 初次克隆某個(gè)倉(cāng)庫(kù)的時(shí)候,工作目錄中的所有文件都屬于已跟蹤文件呜袁,并處于未修改狀態(tài)敌买,因?yàn)?Git 剛剛檢出了它們, 而你尚未編輯過(guò)它們傅寡。

編輯過(guò)某些文件之后放妈,由于自上次提交后你對(duì)它們做了修改,Git 將它們標(biāo)記為已修改文件荐操。 在工作時(shí),你可以選擇性地將這些修改過(guò)的文件放入暫存區(qū)珍策,然后提交所有已暫存的修改托启,如此反復(fù)。


檢查當(dāng)前文件狀態(tài)

test@MacintoshdeMacBook-Pro-2:~/Git$ git status
On branch master
nothing to commit, working tree clean

這說(shuō)明你現(xiàn)在的工作目錄相當(dāng)干凈攘宙。換句話(huà)說(shuō)屯耸,所有已跟蹤文件在上次提交后都未被更改過(guò)。 此外蹭劈,上面的信息還表明疗绣,當(dāng)前目錄下沒(méi)有出現(xiàn)任何處于未跟蹤狀態(tài)的新文件,否則 Git 會(huì)在這里列出來(lái)铺韧。

現(xiàn)在多矮,讓我們?cè)陧?xiàng)目下創(chuàng)建一個(gè)新的 README 文件。 如果之前并不存在這個(gè)文件哈打,使用 git status 命令塔逃,你將看到一個(gè)新的未跟蹤文件:

work@MacintoshdeMacBook-Pro-2:~/Git$ echo 'My Project' > README
work@MacintoshdeMacBook-Pro-2:~/Git$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    README

nothing added to commit but untracked files present (use "git add" to track)

在狀態(tài)報(bào)告中可以看到新建的 README 文件出現(xiàn)在Untracked files下面。 未跟蹤的文件意味著 Git 在之前的快照(提交)中沒(méi)有這些文件料仗;Git 不會(huì)自動(dòng)將之納入跟蹤范圍湾盗,除非你明明白白地告訴它“我需要跟蹤該文件”。 這樣的處理讓你不必?fù)?dān)心將生成的二進(jìn)制文件或其它不想被跟蹤的文件包含進(jìn)來(lái)立轧。 不過(guò)現(xiàn)在的例子中格粪,我們確實(shí)想要跟蹤管理 README 這個(gè)文件。

跟蹤新文件

使用命令git add開(kāi)始跟蹤一個(gè)文件氛改。 所以帐萎,要跟蹤 README 文件,運(yùn)行:

work@MacintoshdeMacBook-Pro-2:~/Git$ ls -al
total 8
drwxr-xr-x   8 work  staff   256  9 29 18:49 .
drwxr-xr-x+ 43 work  staff  1376  9 29 18:41 ..
drwxr-xr-x  12 work  staff   384  9 29 18:49 .git
-rw-r--r--   1 work  staff     0  9 29 18:38 LICENSE
-rw-r--r--   1 work  staff    11  9 29 18:49 README
-rw-r--r--   1 work  staff     0  9 29 18:35 testGit1.cpp
-rw-r--r--   1 work  staff     0  9 29 18:35 testGit2.cpp
-rw-r--r--   1 work  staff     0  9 29 18:35 testGit3.cpp
work@MacintoshdeMacBook-Pro-2:~/Git$ git add README
work@MacintoshdeMacBook-Pro-2:~/Git$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README
 針對(duì)一個(gè)評(píng)審的總評(píng)論(區(qū)別于行間評(píng)論)尚未被計(jì)入

暫存已修改的文件

現(xiàn)在我們來(lái)修改一個(gè)已被跟蹤的文件平窘。 如果你修改了一個(gè)名為 testGit1.cpp 的已被跟蹤的文件吓肋,然后運(yùn)行 git status 命令,會(huì)看到下面內(nèi)容:

work@MacintoshdeMacBook-Pro-2:~/Git$ vi testGit1.cpp
work@MacintoshdeMacBook-Pro-2:~/Git$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   testGit1.cpp 針對(duì)一個(gè)評(píng)審的總評(píng)論(區(qū)別于行間評(píng)論)尚未被計(jì)入

文件 testGit1.cpp 出現(xiàn)在 Changes not staged for commit 這行下面瑰艘,說(shuō)明已跟蹤文件的內(nèi)容發(fā)生了變化是鬼,但還沒(méi)有放到暫存區(qū)肤舞。
現(xiàn)在讓我們運(yùn)行 git add將“testGit1.cpp”放到暫存區(qū),然后再看看 git status 的輸出:

chenshanshan05@MacintoshdeMacBook-Pro-2:~/Git$ git add testGit1.cpp
chenshanshan05@MacintoshdeMacBook-Pro-2:~/Git$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README
    modified:   testGit1.cpp

現(xiàn)在兩個(gè)文件都已暫存均蜜,下次提交時(shí)就會(huì)一并記錄到倉(cāng)庫(kù)李剖。 假設(shè)此時(shí),你想要在 testGit1.cpp 里再加條注釋囤耳。 重新編輯存盤(pán)后篙顺,準(zhǔn)備好提交。 不過(guò)且慢充择,再運(yùn)行git status 看看:

work@MacintoshdeMacBook-Pro-2:~/Git$ vi testGit1.cpp
work@MacintoshdeMacBook-Pro-2:~/Git$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README
    modified:   testGit1.cpp

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   testGit1.cpp    modified:   testGit1.cpp 針對(duì)一個(gè)評(píng)審的總評(píng)論(區(qū)別于行間評(píng)論)尚未被計(jì)入

怎么回事德玫? 現(xiàn)在 testGit1.cpp文件同時(shí)出現(xiàn)在暫存區(qū)和非暫存區(qū)。 這怎么可能呢椎麦? 好吧宰僧,實(shí)際上 Git 只不過(guò)暫存了你運(yùn)行 git add 命令時(shí)的版本。 如果你現(xiàn)在提交,testGit1.cpp 的版本是你最后一次運(yùn)行 git add命令時(shí)的那個(gè)版本观挎,而不是你運(yùn)行 git commit 時(shí)琴儿,在工作目錄中的當(dāng)前版本。 所以嘁捷,運(yùn)行了 git add 之后又作了修訂的文件造成,需要重新運(yùn)行 git add 把最新版本重新暫存起來(lái)

work@MacintoshdeMacBook-Pro-2:~/Git$ git add testGit1.cpp
work@MacintoshdeMacBook-Pro-2:~/Git$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README
    modified:   testGit1.cpp

狀態(tài)簡(jiǎn)覽

git status 命令的輸出十分詳細(xì),但其用語(yǔ)有些繁瑣雄嚣。 Git 有一個(gè)選項(xiàng)可以幫你縮短狀態(tài)命令的輸出晒屎,這樣可以以簡(jiǎn)潔的方式查看更改。 如果你使用git status -s 命令或 git status --short 命令现诀,你將得到一種格式更為緊湊的輸出夷磕。

work@MacintoshdeMacBook-Pro-2:~/Git$ touch LICENSE.txt
work@MacintoshdeMacBook-Pro-2:~/Git$ git status -s
A  README
M  testGit1.cpp
?? LICENSE.txt
  • 新添加的未跟蹤文件前面有 ?? 標(biāo)記
  • 新添加到暫存區(qū)中的文件前面有 A 標(biāo)記
  • 修改過(guò)的文件前面有 M 標(biāo)記

忽略文件

一般我們總會(huì)有些文件無(wú)需納入 Git 的管理,也不希望它們總出現(xiàn)在未跟蹤文件列表仔沿。 通常都是些自動(dòng)生成的文件坐桩,比如日志文件,或者編譯過(guò)程中創(chuàng)建的臨時(shí)文件等封锉。 在這種情況下绵跷,我們可以創(chuàng)建一個(gè)名為 .gitignore 的文件,列出要忽略的文件的模式成福。 來(lái)看一個(gè)實(shí)際的.gitignore 例子:

work@MacintoshdeMacBook-Pro-2:~/Git$ cat .gitignore
*.[oa]
*~

第一行告訴 Git 忽略所有以.o.a結(jié)尾的文件碾局。一般這類(lèi)對(duì)象文件和存檔文件都是編譯過(guò)程中出現(xiàn)的。 第二行告訴 Git 忽略所有名字以波浪符(~)結(jié)尾的文件奴艾,許多文本編輯軟件(比如 Emacs)都用這樣的文件名保存副本净当。 此外,你可能還需要忽略 log,tmp 或者 pid 目錄像啼,以及自動(dòng)生成的文檔等等俘闯。 要養(yǎng)成一開(kāi)始就為你的新倉(cāng)庫(kù)設(shè)置好 .gitignore 文件的習(xí)慣,以免將來(lái)誤提交這類(lèi)無(wú)用的文件忽冻。

文件 .gitignore 的格式規(guī)范如下:

  • 所有空行或者以 # 開(kāi)頭的行都會(huì)被 Git 忽略真朗。
  • 可以使用標(biāo)準(zhǔn)的 glob 模式匹配,它會(huì)遞歸地應(yīng)用在整個(gè)工作區(qū)中僧诚。
  • 匹配模式可以以(/)開(kāi)頭防止遞歸遮婶。
  • 匹配模式可以以(/)結(jié)尾指定目錄。
  • 要忽略指定模式以外的文件或目錄湖笨,可以在模式前加上嘆號(hào)(!)取反旗扑。
    gitHub 有一個(gè)十分詳細(xì)的針對(duì)數(shù)十種項(xiàng)目及語(yǔ)言的 .gitignore 文件列表: https://github.com/github/gitignore

查看已暫存和未暫存的修改

git diff此命令比較的是工作目錄中當(dāng)前文件和暫存區(qū)域快照之間的差異。 也就是修改之后還沒(méi)有暫存起來(lái)的變化內(nèi)容赶么。

提交更新

現(xiàn)在的暫存區(qū)已經(jīng)準(zhǔn)備就緒肩豁,可以提交了。 在此之前辫呻,請(qǐng)務(wù)必確認(rèn)還有什么已修改或新建的文件還沒(méi)有 git add 過(guò), 否則提交的時(shí)候不會(huì)記錄這些尚未暫存的變化琼锋。 這些已修改但未暫存的文件只會(huì)保留在本地磁盤(pán)放闺。 所以,每次準(zhǔn)備提交前缕坎,先用 git status 看下怖侦,你所需要的文件是不是都已暫存起來(lái)了, 然后再運(yùn)行提交命令 git commit

git commit

移出文件

要從 Git 中移除某個(gè)文件谜叹,就必須要從已跟蹤文件清單中移除(確切地說(shuō)匾寝,是從暫存區(qū)域移除),然后提交荷腊。 可以用 git rm 命令完成此項(xiàng)工作艳悔,并連帶從工作目錄中刪除指定的文件,這樣以后就不會(huì)出現(xiàn)在未跟蹤文件清單中了女仰。

如果只是簡(jiǎn)單地從工作目錄中手工刪除文件猜年,運(yùn)行 git status 時(shí)就會(huì)在 “Changes not staged for commit” 部分(也就是 未暫存清單)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市疾忍,隨后出現(xiàn)的幾起案子乔外,更是在濱河造成了極大的恐慌,老刑警劉巖一罩,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杨幼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)差购,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)四瘫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人歹撒,你說(shuō)我怎么就攤上這事莲组。” “怎么了暖夭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵锹杈,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我迈着,道長(zhǎng)竭望,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任裕菠,我火速辦了婚禮咬清,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奴潘。我一直安慰自己旧烧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布画髓。 她就那樣靜靜地躺著掘剪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奈虾。 梳的紋絲不亂的頭發(fā)上夺谁,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音肉微,去河邊找鬼匾鸥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛碉纳,可吹牛的內(nèi)容都是我干的勿负。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼村象,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼笆环!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起厚者,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤躁劣,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后库菲,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體账忘,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鳖擒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溉浙。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蒋荚,靈堂內(nèi)的尸體忽然破棺而出戳稽,到底是詐尸還是另有隱情,我是刑警寧澤期升,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布惊奇,位于F島的核電站,受9級(jí)特大地震影響播赁,放射性物質(zhì)發(fā)生泄漏颂郎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一容为、第九天 我趴在偏房一處隱蔽的房頂上張望乓序。 院中可真熱鬧,春花似錦坎背、人聲如沸替劈。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)抬纸。三九已至,卻和暖如春耿戚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背阿趁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工膜蛔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脖阵。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓皂股,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親命黔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子呜呐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容