有很多時(shí)候,git追蹤某一個(gè)文件的變化歷史和軌跡,是非常重要的,不管是代碼還是文檔。這里主要說(shuō)文檔。但是我們的筆記、文檔,總是喜歡改名和轉(zhuǎn)移目錄之類行蹤不定,那么一旦有這些改動(dòng),git還能追蹤嗎?
文件改名 rename
git倉(cāng)庫(kù)實(shí)際上對(duì)文件改名這個(gè)問(wèn)題是比較忌諱的,應(yīng)當(dāng)說(shuō)是盡量避免的。因?yàn)槿绻挥锰厥馓幚恚拿骻it只會(huì)認(rèn)為你刪了這個(gè)文件,又新建了另一個(gè)文件。
如果你在系統(tǒng)里面手動(dòng)把一個(gè)文檔1.txt改成了2.txt,那么這時(shí)候輸入git status只會(huì)看到1.txt被刪除,新增加文件2.txt。
同樣的,命令行里用mv 1.md 2.md改名,也是同樣的效果。
要保持這個(gè)文件歷史記錄不斷的話,正確做法是:
git mv 1.txt 2.txt
這樣再用git status查看就會(huì)看到,識(shí)別為renamed: 1.txt -> 2.txt。它的歷史記錄就沒(méi)有斷。
文件移動(dòng)
有時(shí)候會(huì)把文件移動(dòng)到另一個(gè)文件夾或者某個(gè)子文件夾,但是git卻認(rèn)為你是刪了一個(gè)而新建了另一個(gè)。
這是因?yàn)楹透拿粯?,只要是在git命令之外移動(dòng)的,git就識(shí)別不到。
所以,這里也要用git mv命令來(lái)移動(dòng)。
git mv 1.txt ./src/1.txt
這個(gè)時(shí)候在查看git狀態(tài)就會(huì)發(fā)現(xiàn),顯示為renamed: 1.txt -> src/1.txt
文件覆蓋
這個(gè)問(wèn)題邏輯要復(fù)雜點(diǎn):有時(shí)候我們需要批量抓取網(wǎng)上的一些資源到這個(gè)目錄里面,有些是重復(fù)的內(nèi)容一樣的,有些卻是新的,還有些是網(wǎng)上刪除了的,那么我們想要網(wǎng)上抓取的和本地的同步,應(yīng)當(dāng)怎么辦呢?
雖然這個(gè)方法不嚴(yán)謹(jǐn),但是非常簡(jiǎn)單有效:只要這些東西體積不是很大,那么就可以完全刪除本地現(xiàn)有的文件,然后再把新抓取的保存到本地。
這個(gè)時(shí)候就是考驗(yàn)git的追蹤識(shí)別能力了。
經(jīng)過(guò)一系列試驗(yàn)發(fā)現(xiàn):
- 首先不能用
git rm刪除文件,如果用了它那么不管怎么做,它都會(huì)知道你刪除了文件,而我們要做的是讓它誤以為沒(méi)有刪除。 - 如果文件位置和名字沒(méi)變,內(nèi)容也沒(méi)變,那么只要你沒(méi)有add或commit,即使新生成的文件的創(chuàng)建日期和修改日期都變化了,
git status也不會(huì)顯示任何變動(dòng)。 - 如果文件位置和名字沒(méi)變,內(nèi)容變化了,只要沒(méi)add或commit,那么
git status只會(huì)告訴你modified 某文件。 - 如果文件位置或名字變了,那么,git完全不知道。會(huì)認(rèn)為你刪除了老的,建了新的。像上面重命名的問(wèn)題一樣。這時(shí)候如果你還想要保持這個(gè)文件的追蹤歷史,要不你就盡量避免改名字,要不就想把法用
git mv命令告知git,但是這個(gè)邏輯比較麻煩,尤其是涉及文件比較多的時(shí)候。所以我一般選擇避免改名字,或干脆就斷了追蹤。