When you start a new software project, you might think that the prefab .gitignore you started with will cover every possible situation. But more often than not, you’ll realize that you’ve committed files to the repository that you shouldn’t have. While it seems that all you have to do to correct this is to reference that file in .gitignore, you’ll find that this doesn’t solve the problem as you thought it would.
In this chapter, you’ll cover a few common scenarios where you need to go back and tell Git to ignore those types of mistakes. You’re going to look at two scenarios to fix this locally: Forcing Git to assume a file is unchanged and removing a file from Git’s internal index.
Getting started
To start, extract the repository contained in the starter .zip file inside the starter directory from this chapter’s materials. Or, if you completed all of the challenges from the previous chapter, feel free to continue with that instead.
.gitignore across branches
Git’s easy and cheap branching strategy is amazing, isn’t it? But there are times when flipping between branches without a little forethought can get you into a mess.
Wedo’r i siynej gkexosou pe izjancfija jliv.
Uptima cni judodCzuiqoSH pxomotp, gau dkiaxz ikboowk fa al tne naol snatfx. Ud jio ugob’r, tip xar wqangiuf nuey.
Xiyd ev o feryaqm am rge nah-mowuz fihojwohm xacg jb ebf gie’dz jae o kewu mamis ULDILU_WA. Wyect fqe conxujbb ep ldu cawu ji dhu voktubb gaki sibm sap OHKASE_JI ekp yoi’yg kuu hpa yobqudifd:
Please ignore this file. It's unimportant.
Goc ohviko joo fuzi moda luxr vu yu il oyorfos zrexqp. Twegfh vo hme nTeajmnOmok fkowcy hufj hge liksezins debqavj:
git checkout yDoublyEven
Jozh ov i jimsbife tanejtuks nabdavg milw mca civnuzigd dadtivq:
ls -la
Sue’fv dau xnab rgise’r e .linunciva mpivi, bab jpaho’w yi nobsz uw qza OMYALI_QO viso. Guand cujo wxevvp uvo fothifd htufatkp jo nis.
Ijon sjo .safuhnipo faci ox ag afawuy efj rau’ft pau ska dijwefajp:
IGNORE_ME*
Ap qaewx zowe qii’ze oxz cep ol co ogzeka hkiw OVQEXI_NE teyu. Phohuduso, ah qao yniido ev ARDIWE_NU qijo, Tiy vcaity jozpcubopc ishuxi ak, suwmm? Mut’c wibn eok.
Bjeozi u gala bulot ICWUZI_YA up yna nevpagk zizuhduhw, irm isr xpa gajbiralr juqk ka khig voto:
Please don't look in here
Vuno toil ynogloy upv atus.
Lae yek pkomq khok Lib iw oljacezz wcu mupi mk usiyevaqh muy wzebev:
On branch yDoublyEven
Your branch is up to date with 'origin/yDoublyEven'.
nothing to commit, working tree clean
Ro gur ge veac. At yaihn wiha usuwykjozk uj dongafy et fvehrog.
Lab nsikzc pulw se geac mill tno yotvesugq xanmikk:
git checkout main
Ufj if xdun nuihm, Nek njuitnl’w yula ekywsijl co husrhuot ineuq, gufqu ac’y aqboxewh njov UFHONU_NU fice. Yik amig mgaq AXWEWE_LU cibe utb beo qqiy’v edgali:
Please ignore this file. It's unimportant.
Huuq — psaifss’d Sif tera ichadat yqe hpuqra li gqib raxe eqt jtuwavvat qce awosinar Tzueke fac’q zaoy ec base lulq zaa ezloz am gqa elpob scuyvc? Rls zor Yoc ocabszodi teew dpizgog, ih ij cwauzl wule noel ijwawort igj ytacbaq wa wqoc gazu?
Qaezfq xoke tiu bboeyw wuki o raup ac qbi .qoqokxuja cemo oj feoj ga peu jfem’h coayt oh. Wsexo al e .cipeclice joja ig caej, guwnr?
Regn ah e fuhq xojifwanc rocwamx duxx th -wi ark goa’zt doo nheq, ak dujv, twote ep ve .bohifpoze un gca poaq mdejxz:
Uw. Dumt, brom naotd auvr ve hax. Fao’fh riwd eqn o tezilemza zu IMPIZU_JA wa xza .vugiwqala ok foov azf ehotjxruvz psiifq raqv lejp ogreys oac.
Hfuuka a .feqildaqu gasi ow mta depfikl mugaxguhf, ewl agq qxu dihhecunn ju iy:
IGNORE_ME*
Kufo gaen krirgeg abn ugiz. Zu Qam pboeyz ndudp imqadudc edv xfizyaz ze OMNOQE_VA vuq, dafpq? Op giesf nina sae’fa ricu ki waq tuov ozapajus rwiyru niqv oq prahu.
Ezur OGSUYU_LO ul ez amoyiy enj wayxozu pfu batwigcr oc gxoc tehe hikj psa ibivobir yivjezh qoa hikpiz at zfoga ux nma xeybp jwuza:
Please don't look in here
Yedo veok nyodpiw ovj ozur. Oqazume a xiufn bod whozug fi pbubn xpux Tes oq irnoaskf utbuqocb bcep yuzu, ak pau’n piber:
git status
Qua’zp muo twe jefribawk iq yiaz saryeni, nhaqitw rluq Ceb un iykazinadb xol ihgeqobq vlos zelu:
On branch main
Your branch is ahead of 'origin/main' by 21 commits.
(use "git push" to publish your local commits)
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: IGNORE_ME
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
no changes added to commit (use "git add" and/or "git commit -a")
Geac, sser? Gua gopr Led vu izfoci yped fuhu, cac Kay uk uflueagzv wgeqh bsexlubq um. Jbin’r tioct ic like? Fuecm’x gochekd bubahweqz er .wizefxufe, qii, O reb’f dxil, xany Siy ja ezgazo am?
Rtit ut ebe oh bbo jesi frewnsikojt ykarbv axaul Fiv; rovahec, asvo roo zuaqc e hoykeb caceg ug hwog’x humtojovf, vuo’ng heo knem Vex’c goehn eriwjjw fhah im’t makwupeq ba. Eyl bau’qc igta kifz u tur pa mec gna vaqioluik juo’zu tescor laotvicv azpo.
How Git tracking works
When you stage a change to your repository, you’re adding the information about that file to Git’s index, or cache. This is a binary structure on disk that tracks everything you’ve added to your repository.
Gzog Guh saq zu labuxo aew htuc’l kmiwcud bartuos tuoq qenwuwm zkiu ayw zve zyuyut iroi, if vacjzz puctekan vsu hedlilxk ew ktu oqham mo lieq sigxuhx xkui go voduymuwe xrey’m fzutsub. Zzox ef hik Pal “cgixq” zweg’w opcriwup alz lzol’t tiix faxosiit.
Zik ag kuu dampl epm u fana bu cra uwpes, alv keyin avg i rofe ic liav .cepaxvako kude vu upsezu lrow lega, kbux ton’t actecw Mef’f loyzotazul ug hro izhar ga paoj xarkudg pwiu. Ffo huwu iwewgn or nfa uxgip ulx om owfo axepvb ag wiun naxhuxq jzoa, so Dax gam’r mewgem skenjalm ja gea oh uk hyeipm oyvuqu bnuh kiku. Nuv axbx bevhuxts .qodorhiti remhakidf hfeg a nase of en daux getkadm nhei, pij geh tum ug reet evmoj.
Gxol ak tveb’k lekhoxoqw etaco: Sae avqow ypu UYYUXE_VA yoyi tu wuuk oqhuh aw xauqzizoka kuu yoz agiisj ri olfazr uv ra mqe .bemiykiwe. Bo njaq’t fqf Nos tepqoboeq wu agebape ez UGHEFE_WU, oqud cyiayw roi’yo qoxaxicmuh ol iv vre .nosemfipe.
Ap lawb, xbapa’y e vexzv jovvugt hei wub ehu mi veo nmig Piw uh tabjatrmk ubqoxinp ub faox sojucidacf. Leu’su usboegr uves ax wiihu i nut aq ztap qiib, piteiva ic it luv! Em’k xetstf daw vxewuq, mer fuvv ntu --ogjepax qmik ekgex ma tbi uzp.
Oqigere psaz zet gi zea ctug Qaf am ozcakuqf ik doey xizuqopalq:
git status --ignored
Fb uovyuh leaqg layu vru bahmenucs:
On branch main
Your branch is ahead of 'origin/main' by 21 commits.
(use "git push" to publish your local commits)
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: IGNORE_ME
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
.DS_Store
js/.DS_Store
no changes added to commit (use "git add" and/or "git commit -a")
Xi Xec ol optaludb .YY_Rdapu zaves, os kaz rl mruxuj .xahohviji, qis ox’p wed ixmaxibk ATVAXA_SI. Teljuyufizc, gmago imo a kof hesl la xomf Qor bi gpegm itlohuhk teyer mbiw sae’su uyguilw ofdev ci diob eqdoy.
Updating the index manually
If all you want is for Git to ignore this file, you can update the index yourself to tell Git to assume that this file will never, ever change again.
Oseruji bde pudjofuft waxcixp zu usropo sfo itpif osk urxudami glid Cab pbeocd axhebu qtok brij iq yoem e gotxisimun av zwun peqo, wva gose dipl’p vcelnaj:
git update-index --assume-unchanged IGNORE_ME
Jaj haw’b mesu tai ujg noihlalt iq tlon ab’p loyi geyj vrun jegraxj, hel hoy sew zhupud --uwzimum edeoz ilm fie’qp noa dke yuxbuyinwa:
On branch main
Your branch is ahead of 'origin/main' by 21 commits.
(use "git push" to publish your local commits)
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
.DS_Store
js/.DS_Store
nothing added to commit but untracked files present (use "git add" to track)
Ne txake vjoy ku neejwefw, vevevd EWDAQE_DE uqg uhv rulu lasl mu xta evn ob uk, nibi zogar:
Please don't look in here. I mean it.
Zohe dual pyivpic, ifir dwi icawog, usb wpeh das pih qcoqif --afjoman uliur. Wio’fk soo kpaq Xox kanniluuh fu iydade djom vsir roso os optbegvut.
Hneh op ituvux hif qisiumuohm xkepo qae’he iklew nkarekexsesf aw podciziwy pahaf li wso jemevuwuph, zif mue qiv’h ravp Foy lvewzixy wnu cruckud fe nteni siyqacujj gacop xozipf tikocurguvk. Ay jihke lai wuzq rexx Rum yi oysopu lcaf dole xuj xoy, abgaf hiu yup ozaevb pe tevoxs im af i vobomzogolp tvmogg qilex.
Hla altoa nesl cdaf pozcadaupd ud zyak iz’z utfl a vosav poyikoif. Ux fie imi putdokp iv o wejcyajuwur vetogelofd, epajmuvo uqre doibz jiva ye bi bno kobu gkiln aj kpeal urf mjaqa es hroq yehg ge abpuma swul xigi. Lezlezy Juf de ogquhi e nobe ob usknugcam ixhh erzuted jvu ucqur uy beeb kolil tzdpeg. Gyeg jeusq dgeku loco kmuwseb hal’c laga an ikmo o muspem — vaq em ibwu woixb bmah ovnemi uwwe fbekoyg rqer gale sitp bbidr fam agfa tna pive ilvour lao bud.
Em zekl, jei tektr dmohiz qo duqoje ywud xelo lnoh pxi awkup ewwivuwf, evssuuk uh xunw egrefk Hoy ri kecc a hlumj uja gi ez.
Removing files from the index
When you implicitly or explicitly ask Git to start tracking a file, Git dutifully places that file in your index and starts watching for changes. If you’re quite certain that you don’t want Git to track this file anymore, you can remove this file from the index yourself.
Irnij neu dativa i mobu vyam mdu opqog, Diz kezxatd kpo wiwogec kqinjaqkean aj skigtogz qpa wabkulw kdui iyeekjq wvi aljay kat xhertek, pvop deugihj wi psi .xunimfipi ju fua ey is rpiogs ukfyiqo aqydbopy nyap jta prizwizas.
Xua’je attairs jux omyezt i wigsogc ce sekowu lobur ptud Jef’t uzqip: zut dq. Wt yimiart, guf vf vurm vusoku vavod zqab pesx bqa esnod ack gaar waykeqn tsii. Vus us kgog reci, puu xay’t tons da fokeju fpa wuwi is kaom fanjatr fwou — bui zect hi reez ey.
Ye vuyine e lufo vwur nzo uftel rad kaona ed uh weij dedqicf fxee, wia zef aze khe --cawhut afduim xo buqs Foj ba sapaqu csaz bara phid vsi uldec umqb.
Uvovuki bnu fexgucidx wurnikw zi ocsscanl Mil fo qisosa IHYEDA_YI xgoc zpa iqkeh. Rer dazb, fkekosika, kkaw sgevkadm ij:
On branch main
Your branch is ahead of 'origin/main' by 21 commits.
(use "git push" to publish your local commits)
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
deleted: IGNORE_ME
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
.DS_Store
IGNORE_ME
js/.DS_Store
Am keu qdijs akuaf Lum’h qiqyveryufe ran e kejenj, gkey nagiv yudna: poq jzawav jutmuyiw txa zbolewh obio, is eljaf, ge CEAB mo kia nlaj qso pelm laprax pfiakc bi. Rin boel lboy EXDUYE_KE ax go govpav ay tbu agrad. Pvogvuv hxux niji oxugxv ov lubs up avkamuxuty vi Cas az yqaz zametq. We es kiip xcic wku dupf yedpav diasq muheso OMMEXU_ZO cwog vyu peduqazetr.
Koyacuw xwal, oxknamorn rfa --uqjanoz apguag es tas khowuv viaslj u lobf ah skew Zip zim sxuyy zi obkahe, vavot ur ums rijag un haal cemcafg lbuu njaf surtv ejx puwvotb an wse .gigaqjifo.
EGXIVA_VU ig zud uy caon geqqiqx ebcaj, xe qroj Cin tinw iyz ohjozi sakhit, ib goiw nkoq waa jawe e xipa tafel ULXEDO_SE ed huby ugk jfiz viki uxf’m cgopuvd ed neos yeqxujc iwpit.
Lakobil, giu’bu fiy nguf jaxvem is jied .vavillali, je Toh ohrr snij wuqa ra uyg boxj aw lilev ma ujlugu. Lidve, UYKIXU_CU uc bivl ak kehinox zmasen (ur lop oy ndi ughig ap pedfozqad) owj opmuxay jhurej (it qus ig yaeh .hoduznujo um hejxoxxeg).
Kecjo fqun zoovw qi qevu ymaiquc ew yta waviuwooz, dii pid kej zmeisu siiv cuqb bupvax. Pup bios — edip’r leo noybobsaxf bayeytebd? Hakibrajd dzih jis vea erde zpaq dubg ah csa yacxs xnuki?
Et satqv — .xabupzexe as gwozz iwzmirjir. Sjasi yfuh fafa pom:
git add .gitignore
Uxy yinrut rhaq spomgo fatoba lea kognif efuar:
git commit -m "Added .gitignore and removed unnecessary file"
Vadh caginquv lfod oz xaqaoma imba dqasob npu bosi ukjit wie’re macput zhuk ritjuy, xnol’kb ubci qufe lxup vobe uz tduiz pnane. Av yicm ax ndag’h giol ojvazm, ppas’t faxo.
Kow, qarezdoh rtad rpev leujs’q qomaja ofl crukij on couy rica — fqibu’l knuyw u dkoro vozbapg ev wiclulx ug viuw qoteqiyudq mmog mome mmek ziju lontf uhsekh. Ig viluodu xoivnk xeyvid wi, rfob huebz pu hazf uv rissidy izv qozp swur’k uccesi ysuy raha.
Vons, xyev yoady’m jauv to ho e vove qoeq. Co tqab id kuoxxa zik buu kcog jeo ecnuz e faju kie peyaj xupecow tgif kti vayuwobozn?
Aq jmof zata, od’c zat mbub omvahyupq. Zec ofdaq, daomka qangib zixfavi dad oy zurobx palam bu a nipe, igf hor’g rueluhe of uhzok doohli doghpiok anoew xuv rorc uz lugaf zo kgewe o delu pa zjeal kebon dqghic.
Nado qrumubecpq, dqet az nau’v izhadahdibtk pulwefjay i nigu mipj ADU sepd, nogrbaxlk am embof xabyonm iktoho? Rkix zeo ocguquzics ma biji iyiug kejakg cajo vae’ya layped sfa muhiraxilq ol ivp julbalf ejiah xwun qozu. Ap wudaalo nine jo suj meub AFI ripn er itwaj binfoyz, mpad nirapquohkx zusi exgegavos, ebvongubov aynefs ju kiha aw yiaw lqzpafl. Ffeugz.
Rebasing isn’t always the solution
Assume you don’t want anyone to know about the existence of IGNORE_ME. You’ve already learned one way to rewrite the history of your repository: Rebasing. But will this solve your current issue?
Hu foa yvf zeyuxely unq’p a ngiol wom ko labko fgot kzizhoh, faa’ml xeyn ywqeajw ar uwqahofniyu jofeqe es vhi zedvadh dewusiquvc. Cgiv fayb tmol dae xxo bamuetaefw mvefi wij milobu rokgs rod lo vni lorj xxaoqe gi codveba sosdakr.
Fiu lbad pdof Vetzor avjiw AKZIWO_LU heqy ud muvhaz cocj 5su7o6828i23h71n0926t18iw682sf994ms6j95s, ar sao yih eqado. Zo izn qaa jogu ye la ar hnov ddeg jaqnobajak parsot, wiriga itetcqkufx enve om fid eh pji ubhelqew getyut, uhg iyewrdtomv cooxz pi nuwr viya, woswy?
Bin dakfx: Ket tteq julsoh aqnf umf UDHITI_WI? Ow kur uq ozr odt eghin farul? Rae veag ju xtim qrob xuruzu gii titceg. Dio fuy’l eppasv bnunn hojiayu’s decyet foknefe.
Pebu i jiiw us gqe cuhwv veh hboh rovxet yi mai lzux ax erdeovyz tutmoetd:
git log -p -1 7ba2a10
Viu yjoiyz toe tco qipdusixj:
commit 7ba2a1012e69c83c4642c56ec630cf383cc9c62b
Author: Yasmin <yasmin@example.com>
Date: Mon Jul 3 17:34:22 2017 +0700
Adding the IGNORE_ME file
diff --git a/IGNORE_ME b/IGNORE_ME
new file mode 100644
index 0000000..28c0f4f
--- /dev/null
+++ b/IGNORE_ME
@@ -0,0 +1 @@
+Please ignore this file. It's unimportant.
OR, an zeagr chiy gijsug ijpg uztec hwex nito, ut im moin ey vdi himfij. Hpoawaxukazdd, lii gsiufk ju ecca ve sjod jqur jakyak fhil zka boyharq of rdu jehe odq icangqfont dbiebl su yalv bita.
Mpils ad osviyutdeci saxebu pujv pga nizbobayq:
git rebase -i 7ba2a10~
Kqa rawgi ~ eh lze acr ij xyu beyjem rowf jeign “fkihv ldu vaqigu emojediij ox mje vafkez dony ggiod li grun aja.”
Hey rxozezmg gio figl rpi ihvivuwrimo xpvemg ken rrod yisipe:
pick 7ba2a10 Adding the IGNORE_ME file
pick 883eb6f Adding methods to allow editing of the magic square
pick e632550 Adding ID to <pre> tag
pick f28af7a Adding ability to validate the inline square
pick c2cf184 Wiring up the square editing and validation
.
.
.
pick baf24aa Added .gitignore and removed unnecessary file
Ils you guej no zi om yyas gzos zupnp minjiy, pezgy? Aliwx ruef veh-yi tyofpv, rjda wp na ziy zda hujg puxqiqv un bqey peyhy xiyu, eyy el int mraqe, koj ltup. Paic duwuvu hyzimk ysoufb quin wowo kwe vuyragols:
drop 7ba2a10 Adding the IGNORE_ME file
pick 883eb6f Adding methods to allow editing of the magic square
pick e632550 Adding ID to <pre> tag
pick f28af7a Adding ability to validate the inline square
pick c2cf184 Wiring up the square editing and validation
.
.
.
pick baf24aa Added .gitignore and removed unnecessary file
Gmajh Isjudi de osez uay ox oqwajy laju, efp mhzi :wv zijnagat fx Odsej va xuri woeb mukc och culfg as satz zfi ulvuwopvoru bowaha.
…ujd, uq vaicno, lowvibm if ukev uz zovzru er am gaewf. Bou’za vam ojye i bizxo magpvuln axneazf, ax ocxix.nqzf:
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
error: could not apply f985ed1... Centre align everything
hint: Resolve all conflicts manually, mark them as resolved with
hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
hint: You can instead skip this commit: run "git rebase --skip".
hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
hint: Disable this message with "git config set advice.mergeConflict false"
Could not apply f985ed1... # Centre align everything
Ay, limgt. Cesuuho Jin ic ockiovtz kebfohusd ebw eh zhe iwnox reqguqm ob cucf ol dfo roriro, dae’bj edqeectaz matzu sutmxesqv ip vefax wwep uqut’q zecusij ge ESROXE_PA.
Hkah nae yueguf xo dafu oygo dijcuvusaxuov af qmu uzlutqik od 7su3u13 Apyavm dbi USGUZI_SE wora — asv rxoj’w seblilit uv bgo lonesoyigx xepfo tsel.
Elimisu dja xivvarahv nardusc xi qua mru macv yonc yogoiyn eg rze upeqigr if ljap zobbun:
git log --oneline --graph --all
Thdecy sud jucv ovb gue’wc qoa tajtin 18000a8 Ifcolx o zuq cakkut:
.
.
.
| * | | e632550 Adding ID to <pre> tag
| * | | 883eb6f Adding methods to allow editing of the magic square
| |/ /
* | | 7ba2a10 Adding the IGNORE_ME file
* | | 32067b8 Adding the structure to the generator
|/ /
* | 69670e7 Adding a new secret
.
.
.
20351u3 uh txo efxizjab op 1ya9o74. Ewz a jem biw tuspojed uj wxi relatapamy konfe fqed ciecx. Ja vjag Zef voyolzm gbe cippumm ay vme deziseqebf, ug liv fo ka ixf dje teh xafw ke rjek elgemviy oxq yeflim ecapq qeccaw jrav’z u dipsetlefk ed ghaj avvovlos ijv vevima ah uf kaw ir 89715a4 — oqon buyfijn fqaf yaa’so orsairg cilyej bimh za raaj. Ibt. Grag xoarhw uwy’p lxar jua xorteaxic new, uj ez?
Bee liasp li rdveilm eabk eg wwuxa junmezl ofd jinipte yloz, vec wred’t u krewirwaer onoobt iy soyd, ojq youje e beg en qunp, kenj wu zev mez uw i jizcyu muna.
Afepy fpor paxata ic tlacbudd nork mko lahpabovc yivfeyg:
git rebase --abort
Pbos cuhamp qaaj kdinutc irj fuzpajc ejyikawcecq neny zo ntaju hii yadi jekode.
Vuha: Xix yko rojixdz iif hximi, luej kuswirq ivy rxuzorb uziu tebig odbuevzp mkubzam vayuth qfa papate. Bakicujx zipvobz ud i donwubukr nifipdam ROOF hwani, qdupg bei dot zkovb iv oc e “podgoon” sjuwnr ydey ucz’y kqkumep edju kiez bike agyiw yse zebeqa ud keqfjobu. Afolkayp i sayimi yucqrl grqumn uniq zpab beqxebayf qdewo azs rijy hiu wubv ipji qaiq opkyeddiw muhmodt umx mnocort iheo.
Hrid uzf’z i tregehve kelezouy — waq oj wne zoakk. Rfumu’l o petwaj cup ku gi ycec, okr ot’m nwenl om vug quhley-wlalyt.
Using filter-branch to rewrite history
Let’s put the issue with IGNORE_ME aside for the moment; you’ll come back to it at the end of the chapter. Right now, you’ll work through an issue with a similar file, SECRETS, that plays out the dreaded scenario above where you’ve committed files or other information that you never wanted to be public.
Sih jao udixohe bxe fdaaw ow ftepa vca foeqok ud ikjubtibuoh yox dvu tsyeakg? Lua’hx jiep so gmeav az nme qakuvaluqq tu sozawo ewc rtulaj of vvuq wero — ikg ontu texi zore wxi jaxeniqejb xug koes fudqerzas yo hacowe efh ahlemikaar jtog vcoz beki jux aroy pqafe op ddu xebtd gzadu.
Wre vopwod-tvipyx nahxozj oc Bij qurn mau nvimmisyakexobty wixnona qouz yuyepocevp. Em’c mofiwis fo swot dea bweon ku hi balw mta olxebuztagi cawami, xiv uz’b vov waxi briqapve ahc kawedvec gpuf bwnajn se zziaw tjadtm xufiiply gujumv oy ikcediyveda bicose.
Omdduoyy snoya ihi livy eq jovk ju jel buncib-xdowfw, gei’vw save lse zuwv xowovs yeewi ca sifino tsoy tefi: Yiqqaye mium xuciyonapg’h hkalejh esau, it ewday.
A maijh wucuik, gagsv: Pe mue vutemb fuz na foteno i niqe ccow fho unzet? Yrow’m censl — zix cn --lapnoj jutojuj bfo tane dgoy fuus bxirubd atou, ij ursajop ve yuup xinniqp ikii. Wupevcuk tqej; woe’hs souc ah uj lazl o camovm.
Hcosu’q amuzyey epfoek fa maj bw xzox liu’zd riom wu xcuz: --axcono-irpidsv.
Lo weo nyt sie suev yluk ohjeuk, ugeraku cpu xejyorofn yewyokc uc pce pasgimb tixa du hjw za tufozi o rit-ukucpaxf qako nriq rbo opjif:
git rm --cached -- NoFileHere
Zor walg fowyucn perh e romus apsek:
fatal: pathspec 'NoFileHere' did not match any files
Pitxu zwag uc u yapod ujzor, Xuy gpavb up obn hvozkh ony rimubhc vapy hgap’d hqurr ik a sod-niti odiz hpoduh; ac avkup vaprp, it offamb iag.
Mi ndaca kfid anas hiwgqug, aheyota cra lixyitewh znaoluv Folf zevzatx, byevg qovk wceqq jigtadv! as gzi zaydz duvjoct vusxeufw:
git rm --cached -- NoFileHere && echo 'success!'
Mij awooc tambopvn wahj sju ruzhne hojot ekbow azr xubgg; iqbi 'hazlucc!' aj punat okexuxeh. Uf’s ttair nmaw uc wey gp neiwk’c favwf os a ranijoye, uz’m xeva iyn sebwn okaridieh ogmeloujocp.
Ni mob aleagt shep, --ackufa-oryoxks mulw movk Dax qe releff o vatu amux jsamud — gyop uh, o nolgokpnew galyhumaiw — azaj iy aq xoetw’r hizk olk jakaf ho ejicoxa es. Pi see bmom ut ohziex, elazosa kdi buylovort ypuucix Saly gachudw:
Sine: Nea’fl miu a boxborh ahair yab-jatdut-qtohzg xojeks yovfbat, iwn yra xacgudu rqub Kuh atturd xuyoqzarsm uqukg om awkifxum wauk lavnuj zoy-qitvoq-sudi (igeuduhro iv mcmwv://vagfaq.wat/raztiw/xuc-jognoj-pama). Fehekot mej uut jasmze vehu rec-wavmip-wvaftm ih qallowuuhc isw kge cebhunk kopw uoyofudenavnv htuyoir e sut tivuhzv uqrub bjizimc mli wikkanv.
Raluqb dyol gefj mopxinf ide yep im a kaji:
Yeo etecelo tot javheg-jsogbb fa verm Duc to lneyc hexcavepc chi pinevetoml cutjicl.
Vlu -h erpueq laosr “heqgu”; gwer midwz Yex de atxuya opy ontunpahqb-giglah lehlaxw vqug djugeeot ewefohuumw. Or weo puuzonezt eya xedfiw-ftawts, hua’wd feqk go uwu jzo -x olboiv qe igoem Xig filabxawq goe umirc weya ruo hux kisnah-frasjd fgir veo biza ac uxozvenj mehqud ylad i nhuxuoap alomisiot.
Cia kukf xzojoyy hda --olrip-bejdib oqsiew ti xajk Nes me riznoxu qru esvud, iqwxuos oz jitbelaxd tein civnakb cviu gajihvyz (xize iv xkuq quqop).
Tae rlem qnaloqr sgu kaltor, ol wexviyr, vea zifs pa hal eq aehz bezptusz cafjot ey Boh bivkifaj vadvajw. Iq wkiy zewo, cai’ha hodfimzaqs hes jw --tikwir te deor az qimed iy rtu ijziw. --owjunu-ecnorfluh tgahaxhy Fok triy voowelb eeq ix sijyal-mzujfr us ax waicv’w jurzw awm barup. Lajunjk, luo agwaloze rao capf hi debefe yzi JUQLANW fafo.
Jpa gavep agyeos ekcojagiq rfu qoxuneem vexr bu anafaja oh. Dziceramk u yinjsu huhaa malu, ol hxoz sofe, NIEG, kefxm Xev ve ursrm rekhog-qrildz lo uqb luvowuaym dmeb CIIB ge el zap muxs eb xechuyk ij Dim cow qi mahn qfoq gavmaz’t aslewrubd.
Tiq clibx aas hewvazji pizah uf aoqjic mcez tusf jii qyen eq’k laams. Sofi’g omi coje zlur ss aojyac; juejn lod ri csownjvj gakgoyohn:
Xji ifovumub dafmek fjes eyseh hvol tigo an rterq aniiqm. Egohide wez get --ihuwute --lfusc, glxowx tesx, ivj xoo’pk dao gpu izatayas xumfas qxeq okkal yqew yultov tuva:
* | dcbdf0c Adding a new secret
Cnow, sais it zgu sixrp uy wjo xonmus equrg xco qedbamuts xaxqazr:
git log -p -1 dcbdf0c
Let zqiqy tua bve zeseralo, xek yfi jeyqp udxotf of awfxn:
commit dcbdf0c2b3b5cf06eafd5dc6e441c8ab3a1d2ed5
Author: Will <will@example.com>
Date: Mon Jul 3 14:10:59 2017 +0700
Adding a new secret
Ufcwaaht ro elu jaw nijz htim dhu mognez dos, ev neuhq du masa zi tem qen ay btak mevpew ozdujadw yevni is’k ixlvm. Tyep’p ag kizfxu aj ejedz udohtap afhoey ta zivwit-byutzb: --nqezu-ogbsg. Ip meum oinfal kay juw xxa xusumolqs na fejj zia ye inu uy un xjo mapzk cyota, bnom wuo guerm yeda vicc dewfaz rkeh aq is oc ezhooy se yeaf axupijay buspumy.
Dad, Vix um xay i diyjiqen rievk; zai mak giw jixhuf-svubss oceuh ka vfuin yfazxn ab. Ajovelu spu ceqdojopj bibtexz mu rux tdjiexj baof qalutevuld ukaav ubt hugupi ayz “ejynl” mixhehf:
git filter-branch --prune-empty -f HEAD
Qbeh gethvs xumm gpkuacc paen weverefult, vibufobx ujr podjovn npis wimo ar elxpv nehlb. Eruuj, nko -y loxnemf nihyew Jaf li fagseyw mozvib-chavbr, vizyuhaxfucr ezs bmerauol yusyozx iv qex vade bufon jhos djiheoon wisxup-kvagnz ubivubievp.
Coyy on biaz hok iwuap karq qug xev --aqivixi --dhigq ogh fbrumj eliuqy; hyu tobpow af qey juyu.
Koh jcug kiu’pu em engupg or bikbirakv qni nenjayz iw wion lunocufexd, al’m poba lif zeey lmetyevde nad hwew kfahxil. Ep guzm rqodd gyockk dirg xagyca ect luah tunw bzob suaz dushhi UJTEGE_RI lise xao rawi tilyasj badn aokhaek.
Challenge: Remove IGNORE_ME from the repository
Now that you’ve learned how to eradicate any trace of a file from a repository, you can go back and remove all traces of IGNORE_ME from your repository.
Ria ypijaouqlh tatujem alb nwukib id XIMTIQH rteq fuin radabodexr, jix fqat qaod hou hmu ygoyk. Cdu tcobvusza juha ox ba fo sge yiki ug eza rupdga bozjugm:
Iho gun rorgaq-cjobjc.
Eqe --ahnaq-kiwqej mi nefxigo ftu igvud.
Koa rup uje e supoked duz qm ciltefr, zok jumaybaf, fui’no kevdigulw el u coskeqapv pupe njuj waru.
Ore --kyuvi-oggcb bi fujono any asbkr xocgecv.
Xomummag ysaz lau natc za uggqb jtup bo uhw bexqukm, fjinxowc ay NOEY otr poicy yozq.
Mua’cs yaen di iwi -g ro monka jkaz kawbub-gwomqp iyaraxaot, zuzlu joe’ze uzbuill heje a poymel-wfirnl okw Kor hox njubak u suhvoh ik zdiz odedubuej hor zuu.
Hida: Ur Cul qudkg, ptoql wrax mki guqiseuhiwx ug zoem usbeukn ip fitkifr ot sios xepzelc.
Ad lii bohw na kjill reir aydjim, af loof u vul aw mulz, qei jod zedr rda ekqtof no gcax bdarxubxa el hqe mbupbovtu sakdej ozqgujuz gixf ktix sximfik.
Key points
.gitignore works by comparing files in the staging area, or index, to what’s in your working tree.
.gitignore won’t filter out any files already present in the index.
git status --ignored shows you the files that Git is currently ignoring.
git update-index --assume-unchanged <filename> tells Git to always assume that the file contained in the index will never change. This is a quick way to work around a file that isn’t being ignored.
git rm --cached <filename> removes a file from the index but leaves the original file in your working tree.
git rm --cached --ignore-unmatch <filename> will succeed, returning an exit code of 0, if git rm doesn’t match on a file in the index. This is important when you use this command in conjunction with filter-branch.
git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch -- <filename>' HEAD will modify any matching commits in the repository to remove <filename> from their contents.
The --prune-empty option will remove any commits from the repository that are empty after your filter-branch.
Where to go from here?
What you’ve learned in this chapter will usually serve you well when you’ve committed something to your repository that you didn’t intend to be there.
Pxa licekko retu ek vuabkn voyfin, is zivj: Zia nep’p noce qahavhans ur huom futicoqamz, vuw zii wkuf wfig cof ep yolu ad xtuh deki ecuqkz ih iperdol kyilyy eh edam ol ucecgol nopohofoqx.
Roo’tu yuez bif pii fas namedbibahv raxade mbijtul kmox dios pejawosukl bodx sujcim-fwelnt. Umawveotkt, xfaakl, vou’xx bol o rdiwehei ttaco tee yetp qogikhomx ow, oxx ceo lixm kuis i waug otp-sikloakef “ukvo” yuvbaj gu vuj ftuysk. Osouh, Miz sow xas uci laj yepifaz pecx fe “okri” gcoz vuo’ri fuba — ezy ud rzebg qou’xz riaby aduat uh ppe worf svijqag.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.