6 Git pogreške koje ćete napraviti - i kako ih popraviti

Veliki razlog zbog kojeg programeri koriste sustav upravljanja izvorima poput Gita jest izbjegavanje katastrofa. Ako učinite nešto jednostavno, poput greške izbrišete datoteku ili otkrijete da su promjene koje ste unijeli u desetak datoteka bile neprosudne, možete poništiti ono što ste učinili s malo gnjavaže.

Neke su Git pogreške zastrašujuće i teže ih je poništiti, čak i za iskusne Git korisnike. Ali uz malo pažnje - i pod uvjetom da ne paničite - možete se povući iz nekih od najgorih Git katastrofa poznatih programerima.

Evo popisa nekoliko većih Git boo-boo-ova, zajedno sa savjetima za njihovo povlačenje i sprječavanje nekih od njih. Što se više spuštate niz popis, katastrofe postaju veće.

Git pogreška # 1: Zaboravili ste dodati promjene posljednjem urezivanju

Ovo je jedna od najlakših grešaka u Gitu od koje se možete oporaviti. Recimo da ste predali posao lokalnoj podružnici, a zatim shvatili da niste postavili određeni broj potrebnih datoteka. Ili ste zaboravili dodati određene detalje u poruku urezivanja.

Bez straha. Prvo, ako imate nove promjene koje treba izvesti, učinite to. Zatim upišite git commit --amendza uređivanje poruke urezivanja. Kada završite, pritisnite Esc, a zatim upišite :xqza spremanje i izlaz iz uređivača. (Ovaj posljednji korak je onaj koji često uznemirava pridošlice iz Gita, koji ne shvaćaju uvijek da je ugrađeni Git editor u stvari njegova vlastita životinja.)

Ako samo mijenjate datoteke, a ne trebate mijenjati poruku urezivanja, možete git commit --amend --no-editdodati datoteke i preskočiti postupak uređivanja poruke.

Jedan od načina da se izbjegne takva vrsta pogreške je prilagoditi način na koji pravite obveze u Gitu. Ako radite na nečemu gdje neprestano pravite male obveze kako biste pratili inkrementalne revizije, napravite ih u odbačenoj grani. Dok to radite, dokumentirajte glavne promjene koje negdje unosite - nemojte čekati dok se ne suočite s git commitnaredbenim retkom da biste sve to zapisali. Zatim, kada dosegnete glavnu prekretnicu, upotrijebite git merge --squashiz svoje odbačene grane da biste rezultate spremili u granu koja je u tijeku kao jedan, čisti urez i upotrijebite bilješke koje ste zabilježili za poruku urezivanja.

Git pogreška # 2: Izvršili ste promjene na (lokalnom) masteru

Još jedna uobičajena glupost: Pokorno ste počinili hrpu promjena ... ali u glavnoj grani vašeg repo-a greškom. Ono što ste stvarno željeli bilo je posvetiti ih novoj grani ili onoj devgrani koju imate posebno za razbijanje promjena.

Nije sve izgubljeno. Ova se pogreška može ispraviti u tri naredbe:

git grana nova grana

git reset HEAD ~ --tvrd

git checkout nova grana

Prva naredba stvara novu granu s kojom želimo raditi. Druga naredba resetira glavnu granu na neposredno prije posljednjeg urezivanja, ali ostavlja promjene koje ste upravo napravili u novoj grani. Napokon, prelazimo na novu granu gdje vas očekuju vaše promjene.

Ako ste napravili više obveza, upotrijebite git reset HEAD~ --hard, gdje je broj vraćenih izvršavanja koje želite izvršiti. Ili možete koristiti git reset , gdje je hash ID ciljnog urezivanja ako vam je pri ruci.

Da biste izbjegli ovu pogrešku, stvorite naviku stvarati nove grane i prebaciti se na njih, čak i ako će ih se samo odbaciti, kad god započnete bilo koju sesiju svojim kodom.

Git error # 3: Prebacili ste datoteku ili direktorij u otpad

Još jedna uobičajena katastrofa je pogrešno razbacivanje sadržaja datoteke ... i saznavanje o njoj tek se mnogo obvezuje u podružnicu nakon činjenice. Srećom postoji lako rješenje.

Prvo upotrijebite git logili ugrađeni Git alat za vaš IDE da biste pronašli hash ID za urezivanje od prije promjene datoteke. Dalje koristite git checkout hash_id -- /path/to/fileza provjeru samo one datoteke iz predmetnog urezivanja. Imajte na umu da bi staza trebala biti u odnosu na korijen projekta. Ovo će smjestiti stariju verziju datoteke u mjesto za pripremu vašeg projekta.

Ako se jednostavno želite vratiti n obveza, ne treba vam hash ID. Možete samo izdati naredbu git checkout HEAD~ -- /path/to/file, gdje je broj vraćenih predavanja koje želite izvršiti.

Ako želite provjeriti cijeli direktorij datoteka, tada za putove datoteka upotrijebite Gitov zamjenski format. Na primjer, unos  git checkout HEAD~1 -- ./src/**će vam vratiti jedan urezivanje i oporavit ćete sve u /srcdirektoriju iz korijena vašeg projekta.

Git pogreška # 4: Slučajno ste izbrisali granu

Evo scenarija kojeg se svi bojimo: slučajnim brisanjem cijele grane iz našeg spremišta. Ovog se može vrlo lako oporaviti ili malo zamršenije, ovisno o okolnostima.

Prvo upotrijebite git reflogza pronalaženje zadnjeg urezivanja u poslovnicu. Zatim upotrijebite hash ID za stvaranje nove grane:

git checkout -b restored-branch

Imajte na umu da će ovo slaninu ispržiti samo ako je dotična grana već bila spojena. Ako ste prisilno izbrisali nesjedinjenu granu, imate još jedan način da je pronađete, pod uvjetom da niste pokrenuli git gcspremište:

git fsck --full --no-reflogs --unreachable --lost-found

To će izbaciti popis svih hashova urezivanja za objekte koji više nisu dostupni, uključujući izbrisane grane. Od dna popisa potražite unos "nedostižno urezivanje" i pokušajte vratiti taj hash ID u novu granu da biste vidjeli je li to onaj koji ste prebacili u otpad. Ako nije, prijeđite na sljedeći popis i pogledajte što možete oporaviti.

Općenito je da nikada prema zadanim postavkama nikad ne brišite granu, jer biste lako mogli završiti polaganjem otpada na neraspoređenu granu koja još uvijek sadrži nešto vrijedno. Ako uobičajeno prisilno brišete grane, to je znak da vaše radne navike s granama moraju biti manje neuredne.

Git pogreška # 5: Prekrili ste udaljenu granu git push

Jednom sam radio na lokalnoj kopiji GitHub spremišta i pogrešno gurnuo svoju glavnu granu na udaljenu kopiju s --forceopcijom. Završio sam s javnom kopijom repo-a koji u to vrijeme nije bio u upotrebljivom stanju. Veliki ups.

Ako ste pogriješili poput ove, a vaš je repo nedavno sinkroniziran s udaljenim repoom, možete ga popraviti pomoću vlastite kopije udaljene repo grane. Prebacite se na granu koju trebate ponovno sinkronizirati, pod pretpostavkom da već niste tu, i izdajte ovu naredbu:

git reset --hard /@{1}

Ovo će vratiti vašu kopiju na zadnju sinkroniziranu verziju . U mom slučaju grana je bila masteri udaljeni repo je origin, pa sam mogao koristiti git reset --hard origin/[email protected]{1}.

Zatim koristite git push -f za vraćanje udaljenog spremišta u prethodno stanje.

Jedan od načina da se ovo ne ponovi jest onemogućavanje prisilnog guranja. Ovo možete konfigurirati na udaljenom Git repo-u ovom naredbom:

git config --system receive.denyNonFastForwards true

Možda će doći trenutak kada trebate pritisnuti silu, ali vjerojatno je najbolje to uključiti kad vam zatreba i isključiti kad vam nije potrebno.

Git error # 6: Predali ste privatne podatke javnom repo-u

Ovo je možda najgori i najteži Git-ov problem. Pogrešno ste povjerili osjetljive podatke u javni repo i želite kirurški izrezati datoteke iz repoa. Morate osigurati da osjetljivi podaci ne mogu biti pronađeni čak ni vraćanjem na ranije urezivanje, ali to morate učiniti  ne dodirujući ništa drugo.

To je dvostruko teško ako je predmetni spis počinjen prije šest tjedana, a u međuvremenu je počinjen kamion drugih važnih poslova. Ne možete se jednostavno vratiti na prije dodavanja datoteke; uništit ćete sve ostalo u tom procesu.

Dobra vijest: Nekoliko neustrašivih Git mavensa stvorilo je alat, BFG Repo-Cleaner, posebno u svrhu uklanjanja loših podataka s Git repo-mjesta. BFG Repo-Cleaner omogućuje vam brzo izvršavanje uobičajenih zadataka na repo-u, poput uklanjanja svih datoteka koje odgovaraju određenom zamjenskom znaku ili sadrže određene tekstove. Možete čak i proslijediti datoteku koja navodi sve neželjene tekstove.

BFG Repo-Cleaner u osnovi je automatizacija za korištenje više koraka git filter-branch. Ako biste radije radili stvari ručno, GitHub ima detaljan opis postupka. Ali BFG alat pokriva veliku većinu uobičajenih slučajeva upotrebe, od kojih su mnogi uključeni u opcije naredbenog retka alata. Uz to, postupak je dug i složen, a previše je jednostavno pucati si u stopalo negdje usput ako to radite ručno.

Imajte na umu da ako očistite podatke iz lokalne grane koja se mora sinkronizirati negdje drugdje, nećete moći sinkronizirati, osim prisilnim pritiskom na udaljene grane. Cjelokupno stablo urezivanja mora se prepisati, tako da u biti na daljinu zapisujete potpuno novu povijest. Također ćete trebati osigurati da svi ostali povuku novu kopiju prepisanog repo-a nakon vaših promjena, jer ni njihovi repo-uredi više neće biti valjani.