一底燎、簡介
每個Git項目中都需要一個“.gitignore”文件,這個文件的作用就是告訴Git哪些文件不需要添加到版本管理中弹砚。
二双仍、常用的規(guī)則
/mtk/ 過濾整個文件夾
*.zip 過濾所有.zip文件
/mtk/do.c 過濾某個具體文件
被過濾掉的文件就不會出現(xiàn)在你搭建的GitHub庫中了,當(dāng)然本地庫中還有桌吃,只是push的時候不會上傳朱沃。
除了以上規(guī)則,還可以指定要將哪些文件添加到版本管理中茅诱。
!src/ 不過濾該文件夾
!*.zip 不過濾所有.zip文件
!/mtk/do.c 不過濾該文件
1逗物、配置語法:
以斜杠/
開頭表示目錄;
以星號*
通配多個字符瑟俭;
以問號?
通配單個字符
以方括號[]
包含單個字符的匹配列表翎卓;
以嘆號!
表示不忽略(跟蹤)匹配到的文件或目錄;
此外摆寄,git 對于 .ignore 配置文件是按行從上到下進行規(guī)則匹配的失暴,意味著如果前面的規(guī)則匹配的范圍更大,則后面的規(guī)則將不會生效椭迎;
2锐帜、示例說明
a田盈、規(guī)則:fd1/*
說明:忽略目錄 fd1 下的全部內(nèi)容畜号;注意苍碟,不管是根目錄下的 /fd1/ 目錄认罩,還是某個子目錄 /child/fd1/ 目錄,都會被忽略碟摆;
b述暂、規(guī)則:/fd1/*
說明:忽略根目錄下的 /fd1/ 目錄的全部內(nèi)容痹升;
c、規(guī)則:
/*
!.gitignore
!/fw/bin/
!/fw/sf/
說明:忽略全部內(nèi)容畦韭,但是不忽略 .gitignore 文件疼蛾、根目錄下的 /fw/bin/ 和 /fw/sf/ 目錄;
三艺配、創(chuàng)建.gitignore文件
1察郁、常規(guī)的windows操作
- 根目錄下創(chuàng)建gitignore.txt衍慎;
- 編輯gitignore.txt,寫下你的規(guī)則皮钠,例如加上node_modules/稳捆;
- 打開命令行窗口,切換到根目錄(可以直接在文件夾上面的地址欄輸入cmd回車)麦轰;
- 執(zhí)行命令ren gitignore.txt .gitignore乔夯。
2、 用Git Bash
- 根目錄下右鍵選擇“Git Bash Here”進入bash命令窗口款侵;
- 輸入
vim .gitignore
或touch .gitignore
命令末荐,打開文件(沒有文件會自動創(chuàng)建); - 按i鍵切換到編輯狀態(tài)新锈,輸入規(guī)則鞠评,例如node_modules/,然后按Esc鍵退出編輯壕鹉,輸入:wq保存退出剃幌。
如圖:
# dependencies npm包文件
/node_modules
# production 打包文件
/build
# misc
.DS_Store
npm-debug.log*
.DS_Store:這個文件是Mac OS X用來存儲文件夾的一些諸如自定義圖標(biāo),ICON位置尺寸晾浴,窗口位置负乡,顯示列表種類以及一些像窗體自定義背景樣式,顏色這樣的元信息脊凰。默認情況下抖棘,Mac OS X下的每個文件夾下應(yīng)該都會生成一個,包括網(wǎng)絡(luò)介質(zhì)存儲盤和U盤這樣的外部設(shè)備狸涌。
npm-debug.log:項目主目錄下總是會出現(xiàn)這個文件切省,而且不止一個,原因是npm i 的時候帕胆,如果報錯朝捆,就會增加一個此文件來顯示報錯信息,npm install的時候則不會出現(xiàn)懒豹。
最后需要強調(diào)的一點是芙盘,如果你不慎在創(chuàng)建.gitignore文件之前就push了項目,那么即使你在.gitignore文件中寫入新的過濾規(guī)則脸秽,這些規(guī)則也不會起作用儒老,Git仍然會對所有文件進行版本管理。
簡單來說记餐,出現(xiàn)這種問題的原因就是Git已經(jīng)開始管理這些文件了驮樊,所以你無法再通過過濾規(guī)則過濾它們。因此一定要養(yǎng)成在項目開始就創(chuàng)建.gitignore文件的習(xí)慣,否則一旦push囚衔,處理起來會非常麻煩铝穷。
三、將已忽略文件取消忽略
1佳魔、從Git存儲庫中刪除文件曙聂,請使用rm命令:
git rm <file>
remove命令將在本地刪除文件并停止對其進行跟蹤。 因此鞠鲜,您可以提交更改并將其推送到存儲庫宁脊。 現(xiàn)在應(yīng)該將其清除。
2贤姆、在某些情況下榆苞,您可能希望保留本地文件,僅將其從存儲庫中刪除霞捡。 為此坐漏,我們可以使用--cached
標(biāo)志。 它將刪除文件并保存碧信,無論是否修改赊琳,就像在本地存儲庫中一樣
git rm --cached <file>
3、對于目錄砰碴,您需要添加-r
標(biāo)志躏筏,如下所示:
git rm --cached -r <folder>
4、讓Git取消跟蹤本地存儲庫中的所有內(nèi)容呈枉,使用--cached
標(biāo)志以避免誤刪除它們趁尼,然后重新添加所有內(nèi)容。 這樣猖辫,Git將被迫根據(jù)您的.gitignore文件重新評估所有文件酥泞,最后,應(yīng)逐步刪除當(dāng)前正在跟蹤的所有忽略文件啃憎。 為此芝囤,請在存儲庫的根文件夾中使用以下命令:
git rm --cached -r .git add .
最后添加的點( .
)代表當(dāng)前目錄的路徑。 因此荧飞,這些命令:從存儲庫中刪除所有內(nèi)容凡人,但不要從計算機中刪除文件(由于--cached
標(biāo)志)名党; 遞歸( -r
); 并且叹阔,從當(dāng)前目錄( .
)開始。
在執(zhí)行第二個命令( git add .
)之后传睹,Git將再次跟蹤所有文件耳幢,并將忽略的文件標(biāo)記為已刪除。 理想情況下,它將顯示僅包含刪除操作的跟蹤更改列表睛藻,因為存儲庫的其余部分完全沒有更改启上。 然后,您可以提交并推送店印。
git add src -f
四冈在、清潔歷史
在某些情況下,從存儲庫中刪除對象是不夠的按摘。 具有敏感信息的數(shù)據(jù)(例如存儲在代碼中的密碼)應(yīng)從Git歷史記錄中刪除包券,就好像它們不存在一樣。
這同樣適用于將繼續(xù)使用存儲庫內(nèi)存的大型文件炫贤,即使您按照此處顯示的先前步驟將其刪除溅固。 之所以如此,是因為它們?nèi)匀皇菤v史記錄的一部分兰珍,并且任何用戶都可以將其重置為包含這些文件的提交侍郭。 因此,Git需要保留它們掠河。
最簡單但受限的選擇是使用amend
標(biāo)志亮元。 當(dāng)使用amend
標(biāo)志提交時, Git將用新分支替換當(dāng)前分支的尖端唠摹。 可以將其想像為要將新提交與上一個提交合并苹粟,從而產(chǎn)生一個新提交。
如果最后一次提交(當(dāng)前分支的尖端)是添加不需要的文件的提交跃闹,則可以對其進行修改嵌削,使用以下方法刪除該文件:
git commit --amendgit push -f
必須使用-f
標(biāo)志,它代表“強制”望艺, 并忽略某些Git檢查苛秕,強制其按要求進行操作。 在這種情況下找默,它將強制重寫歷史記錄艇劫,刪除先前的提示,并用新的提交替換它惩激。 這樣店煞,不需要的文件將不會成為其中的一部分。
重寫Git歷史記錄是從其中完全刪除文件的方法风钻,因此對于所有效果而言顷蟀,仿佛文件從未存在過。
五骡技、 通過變基重寫歷史
如果您的文件是在較早的提交中添加的鸣个,而現(xiàn)在您希望從歷史記錄中刪除它們羞反,則需要使用rebase
命令。 作為上一部分中提到的分支技巧的基礎(chǔ)囤萤,是另一個提交昼窗。
可以使用-i
標(biāo)志將提交交互地應(yīng)用到基礎(chǔ)中。 該標(biāo)志允許用戶在這樣做之前編輯提交列表涛舍,從而進行更改澄惊,例如重新排列提交或刪除它們。 要執(zhí)行變基富雅,請使用以下命令缤削。 <base>
變量應(yīng)該是第二次提交的哈希值,該第二次提交在添加不需要的文件之前吹榴。
git rebase -i <base>
例如亭敢,給定以下提交順序:
123ac60 Commit with code321ab56 Commit with unwanted files213ad23 Commit with code413ee26 Commit with code...324cc15 Initial commit
如果您要使用提交213ad23
進行213ad23
Git可能不允許您刪除提交321ab56
因為它是重新設(shè)置操作中的第一個提交。 還有其他選擇图筹,但最簡單的選擇是使用上一次提交413ee26
帅刀。 因此,您可以安全地刪除提交321ab56
远剩。
在我們的示例中扣溺,使用rebase命令,如下所示:
git rebase -i 413ee26
執(zhí)行此命令后瓜晤,將允許您為每個提交選擇一個操作锥余,包括刪除一個提交的放置操作。 根據(jù)您的配置痢掠,使用交互式rebase命令將在您的終端中啟動Vim驱犹。更改Git使用的默認程序。 在變基之前執(zhí)行此操作足画。
之后雄驹,提交和操作的列表將如下所示:
pick 123ac60 Commit with codepick 321ab56 Commit with unwanted filespick 213ad23 Commit with code
選擇操作按原樣使用提交。 您應(yīng)該保留所有其他提交作為選擇淹辞,并將不需要的提交更改為丟棄医舆。 drop命令不會刪除提交,而是將其從要在新基礎(chǔ)中應(yīng)用的提交列表中刪除象缀。 由于以后我們將更改歷史記錄以重新建立新的歷史記錄蔬将,因此不需要的提交將不會在那里,就好像已被刪除一樣央星。
您的提交列表應(yīng)如下所示:
pick 123ac60 Commit with codedrop 321ab56 Commit with unwanted filespick 213ad23 Commit with code
完成此操作后(在Vim中霞怀,您必須保存并關(guān)閉文件),Git將以交互方式對提交進行基礎(chǔ)更改等曼。 這樣里烦,您的分支便與遠程分支發(fā)生沖突凿蒜。 發(fā)生這種情況是因為您的分支歷史記錄與我們期望的遠程分支有所不同禁谦。 要更改遠程分支并反映所做的更改胁黑,必須執(zhí)行push -f
命令。
請注意州泊,通過此操作丧蘸,您將重寫分支歷史記錄,這是一個破壞性操作遥皂,請謹慎使用力喷! 為了安全起見,請嘗試首先在本地檢查存儲庫演训,以查看操作是否對存儲庫造成了損害弟孟。 僅在確保一切正常后,才應(yīng)推送更改样悟。
或者拂募,您可能需要保留該提交中的某些更改( 321ab56
),而不是完全刪除它窟她。 為此陈症,您可以使用編輯操作。 在重新設(shè)置基準(zhǔn)期間震糖,Git在開始為已編輯的提交重新設(shè)置基礎(chǔ)時將停止录肯,并允許您像對其進行提交一樣對其執(zhí)行操作。 在我們的示例中吊说,您可以刪除或取消跟蹤不需要的文件论咏。
使用edit命令的提交列表應(yīng)如下所示:
pick 123ac60 Commit with codeedit 321ab56 Commit with unwanted filespick 213ad23 Commit with code
編輯提交以刪除不需要的文件后,您需要使用git rebase --continue
要求Git繼續(xù)進行重新設(shè)置操作颁井。 其他所有操作均應(yīng)按照之前的說明進行:完成變基并push -f
潘靖。
六、 更糟的情況
使您的.gitignore文件保持最新狀態(tài)蚤蔓,并在推送之前始終仔細檢查您的提交卦溢。 如果失敗, --amend
使用--amend
方法秀又,以避免在以后產(chǎn)生影響单寂。 在最壞的情況下,請重新進行大型調(diào)整并檢查所有內(nèi)容吐辙,然后再將更改推送到您的倉庫宣决。 在這種情況下,單元測試和良好的CI是方便的工具昏苏,并且可以節(jié)省時間尊沸。
例:
target
work
# eclipse project file
.settings
.classpath
.project
# ctags
tags
# OS X
.DS_Store
# mvn versions:set
pom.xml.versionsBackup
*.deb
*.pkg
*.zip
.java-version
*.doc
*.docx
*.xls
*.xlsx
*.bak
*.jar
*.war
*.class
### Windows template
# Windows thumbnail cache files
Thumbs.db
ehthumbs.db
ehthumbs_vista.db
# Dump file
*.stackdump
# Folder config file
[Dd]esktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Windows Installer files
*.cab
*.msi
*.msm
*.msp
# Windows shortcuts
*.lnk
### Eclipse template
.metadata
bin/
tmp/
target/
*.tmp
*.bak
*.swp
*~.nib
local.properties
.settings/
.loadpath
.recommenders
.classpath
.project
# External tool builders
.externalToolBuilders/
# Locally stored "Eclipse launch configurations"
*.launch
# PyDev specific (Python IDE for Eclipse)
*.pydevproject
# CDT-specific (C/C++ Development Tooling)
.cproject
# CDT- autotools
.autotools
# Java annotation processor (APT)
.factorypath
# PDT-specific (PHP Development Tools)
.buildpath
# sbteclipse plugin
.target
# Tern plugin
.tern-project
# TeXlipse plugin
.texlipse
# STS (Spring Tool Suite)
.springBeans
# Code Recommenders
.recommenders/
# Scala IDE specific (Scala & Java development for Eclipse)
.cache-main
.scala_dependencies
.worksheet
### macOS template
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
### JetBrains template
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff:
.idea/
*.iml
# CMake
cmake-build-debug/
cmake-build-release/
# Mongo Explorer plugin:
.idea/**/mongoSettings.xml
## File-based project format:
*.iws
## Plugin-specific files:
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
node_modules/
.history/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties