Git(6)-- 記錄每次更新到倉庫(git clone熔吗、status辆床、add、diff桅狠、commit讼载、rm轿秧、mv命令詳解)

1、克隆現(xiàn)有倉庫:git clone

還是以之前做好的為例:

git clone git@github.com:2021AY/testfirst.git

image

現(xiàn)在我們的機器上有了一個 真實項目 的 Git 倉庫咨堤,并從這個倉庫中檢出了所有文件的 工作副本菇篡。通常,你會對這些文件做些修改吱型,每當(dāng)完成了一個階段的目標(biāo)逸贾,想要將記錄下它時,就將它提交到到倉庫津滞。

工作目錄下的每一個文件都不外乎這兩種狀態(tài):已跟蹤 或 未跟蹤铝侵。已跟蹤的文件是指那些被納入了版本控制的文件,在上一次快照中有它們的記錄触徐,在工作一段時間后咪鲜,它們的狀態(tài)可能是未修改,已修改或已放入暫存區(qū)撞鹉。簡而言之疟丙,已跟蹤的文件就是 Git 已經(jīng)知道的文件。

工作目錄中除已跟蹤文件外的其它所有文件都屬于未跟蹤文件鸟雏,它們既不存在于上次快照的記錄中享郊,也沒有被放入暫存區(qū)。初次克隆某個倉庫的時候孝鹊,工作目錄中的所有文件都屬于已跟蹤文件炊琉,并處于未修改狀態(tài),因為 Git 剛剛檢出了它們又活, 而你尚未編輯過它們苔咪。

編輯過某些文件之后,由于自上次提交后你對它們做了修改柳骄,Git 將它們標(biāo)記為已修改文件团赏。工作時,你可以選擇性地將這些修改過的文件放入暫存區(qū)耐薯,然后提交所有已暫存的修改舔清,如此反復(fù)。

image

2曲初、檢查當(dāng)前文件狀態(tài) :git status

可以用 git status 命令查看哪些文件處于什么狀態(tài)体谒。 如果在克隆倉庫后立即使用此命令,會看到類似這樣的輸出:

image

這說明你現(xiàn)在的工作目錄相當(dāng)干凈复斥。換句話說营密,所有已跟蹤文件在上次提交后都未被更改過械媒。 此外目锭,上面的信息還表明评汰,當(dāng)前目錄下沒有出現(xiàn)任何處于未跟蹤狀態(tài)的新文件,否則 Git 會在這里列出來痢虹。 最后被去,該命令還顯示了當(dāng)前所在分支,并告訴你這個分支同遠(yuǎn)程服務(wù)器上對應(yīng)的分支沒有偏離奖唯。 現(xiàn)在惨缆,分支名是“main”,這是默認(rèn)的分支名。

在項目下創(chuàng)建一個新的 Excel.xlsx 文件丰捷。 如果之前并不存在這個文件坯墨,使用 git status 命令,你將看到一個新的未跟蹤文件:

image

在狀態(tài)報告中可以看到新建的 Excel.xlsx 文件出現(xiàn)在 Untracked files 下面病往。 未跟蹤的文件意味著 Git 在之前的快照(提交)中沒有這些文件捣染;Git 不會自動將之納入跟蹤范圍,除非你明明白白地告訴它“我需要跟蹤該文件”停巷。 這樣的處理讓你不必?fù)?dān)心將生成的二進(jìn)制文件或其它不想被跟蹤的文件包含進(jìn)來耍攘。

3、跟蹤新文件:git add

使用命令 git add 開始跟蹤一個文件畔勤。 所以蕾各,要跟蹤 Excel.xlsx文件,運行:git add Excel.xlsx

此時再運行 git status 命令庆揪,會看到 Excel.xlsx 文件已被跟蹤式曲,并處于暫存狀態(tài):

image

只要在 Changes to be committed 這行下面的,就說明是已暫存狀態(tài)嚷硫。 如果此時提交检访,那么該文件在你運行 git add 時的版本將被留存在后續(xù)的歷史記錄中。 git add 命令使用文件或目錄的路徑作為參數(shù)仔掸;如果參數(shù)是目錄的路徑脆贵,該命令將遞歸地跟蹤該目錄下的所有文件。

4起暮、暫存已修改的文件:git add

現(xiàn)在我們來修改一個已被跟蹤的文件卖氨。 如果你修改了一個名為 README.md 的已被跟蹤的文件,然后運行 git status 命令负懦,會看到下面內(nèi)容:

image

文件 README.md 出現(xiàn)在 Changes not staged for commit 這行下面筒捺,說明已跟蹤文件的內(nèi)容發(fā)生了變化,但還沒有放到暫存區(qū)纸厉。 要暫存這次更新系吭,需要運行 git add 命令。 這是個多功能命令:可以用它開始跟蹤新文件颗品,或者把已跟蹤的文件放到暫存區(qū)肯尺,還能用于合并時把有沖突的文件標(biāo)記為已解決狀態(tài)等沃缘。 將這個命令理解為“精確地將內(nèi)容添加到下一次提交中”而不是“將一個文件添加到項目中”要更加合適。 現(xiàn)在讓我們運行 git add 將“README.md”放到暫存區(qū)则吟,然后再看看 git status 的輸出:

image

現(xiàn)在兩個文件都已暫存槐臀,下次提交時就會一并記錄到倉庫。 假設(shè)此時氓仲,你想要在 README.md 里再加條注釋水慨。 重新編輯存盤后,準(zhǔn)備好提交敬扛。 不過且慢晰洒,再運行 git status 看看:

image

怎么回事? 現(xiàn)在 README.md 文件同時出現(xiàn)在暫存區(qū)和非暫存區(qū)啥箭。 這怎么可能呢欢顷? 好吧,實際上 Git 只不過暫存了你運行 git add 命令時的版本捉蚤。 如果你現(xiàn)在提交抬驴,README.md 的版本是你最后一次運行 git add 命令時的那個版本,而不是你運行 git commit 時缆巧,在工作目錄中的當(dāng)前版本布持。 所以,運行了 git add 之后又作了修訂的文件陕悬,需要重新運行 git add 把最新版本重新暫存起來:

image

5题暖、狀態(tài)簡覽: git status -s

git status 命令的輸出十分詳細(xì),但其用語有些繁瑣捉超。 Git 有一個選項可以幫你縮短狀態(tài)命令的輸出胧卤,這樣可以以簡潔的方式查看更改。 如果你使用 git status -s 命令或 git status --short 命令拼岳,你將得到一種格式更為緊湊的輸出枝誊。

image

新建newfile.txt文件,修改two.txt文件并保存后:

image

修改test.txt 并存盤后:

image

暫存test.txt后:

image

再次修改test.txt后:

image

新添加的未跟蹤文件前面有 ?? 標(biāo)記惜纸,新添加到暫存區(qū)中的文件前面有 A 標(biāo)記叶撒,修改過的文件前面有 M 標(biāo)記。 輸出中有兩欄耐版,左欄指明了暫存區(qū)的狀態(tài)祠够,右欄指明了工作區(qū)的狀態(tài)。例如粪牲,上面的狀態(tài)報告顯示: two.txt 文件在工作區(qū)已修改但尚未暫存古瓤,而 Excel.xlsx 文件已修改且已暫存。 test.txt 文件已修腺阳,暫存后又作了修改落君,因此該文件的修改中既有已暫存的部分滴须,又有未暫存的部分。

image

6叽奥、忽略文件:.gitignore

一般我們總會有些文件無需納入 Git 的管理,也不希望它們總出現(xiàn)在未跟蹤文件列表痛侍。 通常都是些自動生成的文件朝氓,比如日志文件,或者編譯過程中創(chuàng)建的臨時文件等主届。 在這種情況下赵哲,我們可以創(chuàng)建一個名為 .gitignore 的文件,列出要忽略的文件的模式君丁。 來看一個實際的 .gitignore 例子:

$ cat .gitignore
*.[oa]
*~

第一行告訴 Git 忽略所有以 .o.a 結(jié)尾的文件枫夺。一般這類對象文件和存檔文件都是編譯過程中出現(xiàn)的。

第二行告訴 Git 忽略所有名字以波浪符(~)結(jié)尾的文件绘闷,許多文本編輯軟件(比如 Emacs)都用這樣的文件名保存副本橡庞。 此外,你可能還需要忽略 log印蔗,tmp 或者 pid 目錄扒最,以及自動生成的文檔等等。

要養(yǎng)成一開始就為你的新倉庫設(shè)置好 .gitignore 文件的習(xí)慣华嘹,以免將來誤提交這類無用的文件吧趣。

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

    • 所有空行或者以 # 開頭的行都會被 Git 忽略。
    • 可以使用標(biāo)準(zhǔn)的 glob 模式匹配耙厚,它會遞歸地應(yīng)用在整個工作區(qū)中强挫。
    • 匹配模式可以以(/)開頭防止遞歸。
    • 匹配模式可以以(/)結(jié)尾指定目錄薛躬。
    • 要忽略指定模式以外的文件或目錄俯渤,可以在模式前加上嘆號(!)取反。

所謂的 glob 模式是指 shell 所使用的簡化了的正則表達(dá)式型宝。 星號(*)匹配零個或多個任意字符稠诲;[abc] 匹配任何一個列在方括號中的字符 (這個例子要么匹配一個 a,要么匹配一個 b诡曙,要么匹配一個 c)臀叙; 問號(?)只匹配一個任意字符;如果在方括號中使用短劃線分隔兩個字符价卤, 表示所有在這兩個字符范圍內(nèi)的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的數(shù)字)劝萤。 使用兩個星號(**)表示匹配任意中間目錄,比如 a/**/z 可以匹配 a/z 慎璧、 a/b/za/b/c/z 等床嫌。

我們再看一個 .gitignore 文件的例子:

#忽略所有的 .a 文件

*.a

#跟蹤所有的 lib.a跨释,即便你在前面忽略了 .a 文件

!lib.a

#只忽略當(dāng)前目錄下的 TODO 文件,而不忽略 subdir/TODO

/TODO

#忽略任何目錄下名為 build 的文件夾

build/

#忽略 doc/notes.txt厌处,但不忽略 doc/server/arch.txt

doc/*.txt

忽略 doc/ 目錄及其所有子目錄下的 .pdf 文件

doc/*/.pdf

GitHub 有一個十分詳細(xì)的針對數(shù)十種項目及語言的 .gitignore 文件列表:https://github.com/github/gitignore

7鳖谈、查看已暫存和未暫存的修改:git diff

如果 git status 命令的輸出對于你來說過于簡略,而你想知道具體修改了什么地方阔涉,可以用 git diff 命令缆娃。 稍后我們會詳細(xì)介紹 git diff,你通彻迮牛可能會用它來回答這兩個問題:當(dāng)前做的哪些更新尚未暫存贯要? 有哪些更新已暫存并準(zhǔn)備好下次提交? 雖然 git status 已經(jīng)通過在相應(yīng)欄下列出文件名的方式回答了這個問題椭住,但 git diff 能通過文件補丁的格式更加具體地顯示哪些行發(fā)生了改變崇渗。

假如再次修改 README.md 文件后暫存,然后編輯 test.txt 文件后先不暫存京郑, 運行 status 命令將會看到:

image
image
image

要查看尚未暫存的文件更新了哪些部分宅广,不加參數(shù)直接輸入 git diff,此命令比較的是工作目錄中當(dāng)前文件和暫存區(qū)域快照之間的差異些举。 也就是修改之后還沒有暫存起來的變化內(nèi)容乘碑。

image

若要查看已暫存的將要添加到下次提交里的內(nèi)容,可以用 git diff --staged 命令金拒。 這條命令將比對已暫存文件與最后一次提交的文件差異:

image

請注意兽肤,git diff 本身只顯示尚未暫存的改動,而不是自上次提交以來所做的所有改動绪抛。 所以有時候你一下子暫存了所有更新過的文件资铡,運行 git diff 后卻什么也沒有,就是這個原因幢码。

像之前說的笤休,暫存 README.md 后再編輯,可以使用 git status 查看已被暫存的修改或未被暫存的修改症副。

修改README.md

image

暫存README.md

image

暫存README.md后再修改:

image

此時我們的環(huán)境(終端輸出)看起來如下:

image

現(xiàn)在運行 git diff 看暫存前后的變化:(綠色為尚未暫存的)

image

然后用 git diff --cached 查看已經(jīng)暫存起來的變化( --staged--cached 是同義詞):(綠色是已經(jīng)暫存的)

image

Git Diff 的插件版本: 使用 git diff 來分析文件差異店雅,也可以使用圖形化的工具或外部 diff 工具來比較差異。 可以使用git difftool 命令來調(diào)用 emergevimdiff 等軟件(包括商業(yè)軟件)輸出 diff 的分析結(jié)果贞铣。 使用 git difftool --tool-help 命令來看你的系統(tǒng)支持哪些 Git Diff 插件闹啦。

8、提交更新:git commit

現(xiàn)在的暫存區(qū)已經(jīng)準(zhǔn)備就緒辕坝,可以提交了窍奋。 在此之前,請務(wù)必確認(rèn)還有什么已修改或新建的文件還沒有 git add 過, 否則提交的時候不會記錄這些尚未暫存的變化琳袄。 這些已修改但未暫存的文件只會保留在本地磁盤江场。 所以,每次準(zhǔn)備提交前窖逗,先用 git status 看下址否,你所需要的文件是不是都已暫存起來了, 然后再運行提交命令 git commit

$ git commit

image

這樣會啟動你選擇的文本編輯器來輸入提交說明:

image

可以看到碎紊,默認(rèn)的提交消息包含最后一次運行 git status 的輸出佑附,放在注釋行里,另外開頭還有一個空行矮慕,供你輸入提交說明。 你完全可以去掉這些注釋行啄骇,不過留著也沒關(guān)系痴鳄,多少能幫你回想起這次更新的內(nèi)容有哪些。

[Git(4)-- 如何退出 git log 和 git commit 狀態(tài)](Git(4)-- 如何退出 git log 和 git commit 狀態(tài))

退出編輯器時缸夹,Git 會丟棄注釋行痪寻,用你輸入的提交說明生成一次提交。

另外虽惭,你也可以在 commit 命令后添加 -m 選項橡类,將提交信息與命令放在同一行,如下所示:git commit -m "FIRST time commit"

image

好芽唇,現(xiàn)在你已經(jīng)創(chuàng)建了第一個提交顾画! 可以看到,提交后它會告訴你匆笤,當(dāng)前是在哪個分支(main)提交的研侣,本次提交的完整 SHA-1 校驗和是什么(7fa71a1),以及在本次提交中炮捧,有多少文件修訂過庶诡,多少行添加和刪改過。

請記住咆课,提交時記錄的是放在暫存區(qū)域的快照末誓。 任何還未暫存文件的仍然保持已修改狀態(tài),可以在下次提交時納入版本管理书蚪。 每一次運行提交操作喇澡,都是對你項目作一次快照,以后可以回到這個狀態(tài)殊校,或者進(jìn)行比較撩幽。

9、跳過使用暫存區(qū)域:git commit -a

盡管使用暫存區(qū)域的方式可以精心準(zhǔn)備要提交的細(xì)節(jié),但有時候這么做略顯繁瑣窜醉。 Git 提供了一個跳過使用暫存區(qū)域的方式宪萄, 只要在提交的時候,給 git commit 加上 -a 選項榨惰,Git 就會自動把所有已經(jīng)跟蹤過的文件暫存起來一并提交拜英,從而跳過 git add 步驟:

git commit -a -m "skip add commit"

image

看到了嗎?提交之前不再需要 git add 文件“testdiff.txt”了琅催。 這是因為 -a 選項使本次提交包含了所有修改過的文件居凶。 這很方便,但是要小心藤抡,有時這個選項會將不需要的文件添加到提交中侠碧。

10、移除文件:git rm

要從 Git 中移除某個文件缠黍,就必須要從已跟蹤文件清單中移除(確切地說弄兜,是從暫存區(qū)域移除),然后提交瓷式。 可以用 git rm 命令完成此項工作替饿,并連帶從工作目錄中刪除指定的文件,這樣以后就不會出現(xiàn)在未跟蹤文件清單中了贸典。

如果只是簡單地從工作目錄中手工刪除文件视卢,運行 git status 時就會在 “Changes not staged for commit” 部分(也就是 未暫存清單)看到:

image
image

然后再運行 git rm 記錄此次移除文件的操作:

image

下一次提交時,該文件就不再納入版本管理了廊驼。 如果要刪除之前修改過或已

經(jīng)放到暫存區(qū)的文件据过,則必須使用強制刪除選項 -f(即 force 的首字母)。 這是一種安全特性妒挎,用于防止誤刪尚未添加到快照的數(shù)據(jù)蝶俱,這樣的數(shù)據(jù)不能被 Git 恢復(fù)。

image

另外一種情況是饥漫,我們想把文件從 Git 倉庫中刪除(亦即從暫存區(qū)域移除)榨呆,但仍然希望保留在當(dāng)前工作目錄中。 換句話說庸队,你想讓文件保留在磁盤积蜻,但是并不想讓 Git 繼續(xù)跟蹤。 當(dāng)你忘記添加 .gitignore 文件彻消,不小心把一個很大的日志文件或一堆 .a 這樣的編譯生成文件添加到暫存區(qū)時竿拆,這一做法尤其有用。 為達(dá)到這一目的宾尚,使用 --cached 選項:

image

git rm --cached testdiff.txt

image

git rm 命令后面可以列出文件或者目錄的名字丙笋,也可以使用 glob 模式谢澈。比如:

$ git rm log/*.log

注意到星號 * 之前的反斜杠 \, 因為 Git 有它自己的文件模式擴展匹配方式御板,所以我們不用 shell 來幫忙展開锥忿。 此命令刪除 log/ 目錄下擴展名為 .log 的所有文件。 類似的比如:

$ git rm *~

</pre>

</pre>

該命令會刪除所有名字以 ~ 結(jié)尾的文件怠肋。

11敬鬓、移動(重命名)文件:git mv file_from file_to

git mv 命令用于移動或重命名一個文件、目錄或軟連接笙各。

不像其它的 VCS 系統(tǒng)钉答,Git 并不顯式跟蹤文件移動操作。 如果在 Git 中重命名了某個文件杈抢,倉庫中存儲的元數(shù)據(jù)并不會體現(xiàn)出這是一次改名操作数尿。 不過 Git 非常聰明,它會推斷出究竟發(fā)生了什么惶楼。

要在 Git 中對文件改名右蹦,可以這么做:git mv file_from file_to

它會恰如預(yù)期般正常工作。 實際上鲫懒,即便此時查看狀態(tài)信息嫩实,也會明白無誤地看到關(guān)于重命名操作的說明: git mv test.txt testnew.txt

image

其實刽辙,運行 git mv 就相當(dāng)于運行了下面三條命令:

$ mv test.txt testnew.txt

$ git rm test.txt

$ git add testnew.txt

如此分開操作窥岩,Git 也會意識到這是一次重命名,所以不管何種方式結(jié)果都一樣宰缤。 兩者唯一的區(qū)別是颂翼,mv 是一條命令而非三條命令,直接用 git mv 方便得多慨灭。 不過有時候用其他工具批處理重命名的話朦乏,要記得在提交前刪除舊的文件名,再添加新的文件名氧骤。

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呻疹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子筹陵,更是在濱河造成了極大的恐慌刽锤,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朦佩,死亡現(xiàn)場離奇詭異并思,居然都是意外死亡,警方通過查閱死者的電腦和手機语稠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門宋彼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弄砍,“玉大人,你說我怎么就攤上這事输涕∫羯簦” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵占贫,是天一觀的道長桃熄。 經(jīng)常有香客問我,道長型奥,這世上最難降的妖魔是什么瞳收? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮厢汹,結(jié)果婚禮上螟深,老公的妹妹穿的比我還像新娘。我一直安慰自己烫葬,他們只是感情好界弧,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著搭综,像睡著了一般垢箕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上兑巾,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天条获,我揣著相機與錄音,去河邊找鬼蒋歌。 笑死帅掘,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的堂油。 我是一名探鬼主播修档,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼府框!你這毒婦竟也來了吱窝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤迫靖,失蹤者是張志新(化名)和其女友劉穎院峡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袜香,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡撕予,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜈首。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片实抡。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡欠母,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吆寨,到底是詐尸還是另有隱情赏淌,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布啄清,位于F島的核電站六水,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏辣卒。R本人自食惡果不足惜掷贾,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望荣茫。 院中可真熱鬧想帅,春花似錦、人聲如沸啡莉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咧欣。三九已至浅缸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間魄咕,已是汗流浹背衩椒。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蚕礼,地道東北人烟具。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親炼幔。 傳聞我的和親對象是個殘疾皇子卸留,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

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