Programovanie

6 Git chyby, ktoré urobíte - a ako ich opraviť

Veľkým dôvodom, prečo vývojári používajú systém riadenia zdrojov, ako je Git, je predchádzanie katastrofám. Ak urobíte niečo také jednoduché, ako ste omylom odstránili súbor, alebo ak zistíte, že zmeny, ktoré ste vykonali v tucte súborov, boli neuvedomené, môžete bez problémov vrátiť späť svoju prácu.

Niektoré chyby Git sú zastrašujúce a ťažko sa dajú zvrátiť, a to ani pre skúsených používateľov Git. Ale s trochou opatrnosti - a za predpokladu, že neprepadáte panike - sa môžete vrátiť späť od niektorých najhorších katastrof Git, ktoré programátori poznajú.

Tu je zoznam niekoľkých väčších boo-boos Git spolu s tipmi, ako z nich vycúvať a zabrániť niektorým z nich. Čím ďalej v zozname sa nachádzate, tým väčšie sú katastrofy.

Git error # 1: Zabudli ste pridať zmeny do posledného potvrdenia

Toto je jeden z najjednoduchších omylov Gitu, z ktorého sa dá zotaviť. Povedzme, že ste sa zaviazali pracovať v miestnej pobočke, a potom ste si uvedomili, že ste nezostavili niekoľko potrebných súborov. Alebo ste zabudli pridať určité podrobnosti do správy o potvrdení.

Nebojácne. Najskôr, ak máte zavedené nové zmeny, urobte to. Potom napíšte git commit --amend upravte správu o potvrdení. Po dokončení stlačte kláves Esc a zadajte : xq uložiť a opustiť editor. (Tento posledný krok často zamotá hlavu nováčikom Gitu, ktorí si nie vždy uvedomujú, že vstavaný editor Git je vlastne jeho vlastným zvieraťom.)

Ak práve meníte súbory a nepotrebujete meniť správu o potvrdení, môžete použiť git commit --amend --no-edit pridať súbory a preskočiť proces úpravy správ.

Jedným zo spôsobov, ako sa vyhnúť tomuto druhu chyby, je doladiť spôsob, akým sa dopúšťate záväzkov v Gite. Ak pracujete na niečom, kde neustále dávate malé záväzky na sledovanie prírastkových revízií, urobte to vo vetve na zahodenie. Keď to urobíte, zdokumentujte hlavné zmeny, ktoré niekde robíte - nečakajte, až kým sa nestretnete s git spáchať príkazový riadok, aby ste si to všetko zapísali. Potom, keď dosiahnete hlavný míľnik, použite git merge - squash z vašej odhodenej vetvy, aby ste uložili výsledky do vetvy, ktorá sa práve rozpracováva, ako jeden čistý príkaz na potvrdenie a použite poznámky, ktoré ste si vzali pre správu o potvrdení.

Chyba Git č. 2: Vykonali ste zmeny v (miestnom) hlavnom serveri

Ďalšia obyčajná chyba: Svedomite ste vykonali množstvo zmien ... ale omylom do hlavnej pobočky vášho repo. Čo ty naozaj chcel urobiť, bolo zaviazať ich k Nový pobočka, alebo k tomu dev vetvu, ktorú máte špeciálne na prelomenie zmien.

Všetko nie je stratené. Túto chybu je možné opraviť v troch príkazoch:

git branch new-branch

git reset HEAD ~ --hard

git checkout nová pobočka

Prvý príkaz vytvorí novú vetvu, s ktorou chceme pracovať. Druhý príkaz resetuje hlavnú vetvu na tesne pred posledným odovzdaním, ale ponecháva zmeny, ktoré ste práve vykonali v priečinku Nový pobočka. Nakoniec prejdeme do novej pobočky, kde vás čakajú zmeny.

Ak ste vykonali viac záväzkov, použite git reset HEAD ~ --hard, kde je počet záväzkov, ktoré chcete vrátiť. Alebo môžete použiť git reset , kde je hash ID cieľového potvrdenia, ak ho máte po ruke.

Ak sa chcete vyhnúť tejto chybe, zvyknite si robiť nové pobočky a prepínať na ne, aj keď sa práve chystajú vyhodiť, kedykoľvek začnete akýkoľvek relácia s vaším kódom.

Chyba Git # 3: Zhodili ste súbor alebo adresár do koša

Ďalšou častou katastrofou je omylom zničenie obsahu súboru ... a až keď sa o nej dozviete, veľa sa zaviaže k pobočke po fakt. Našťastie existuje jednoduchá oprava.

Najprv použite git log alebo integrované nástroje Git vášho IDE na nájdenie hash ID pre potvrdenie z doby pred úpravou súboru. Ďalej použite git checkout hash_id - / cesta / k / súboru skontrolovať iba ten spis z predmetného spáchania. Upozorňujeme, že cesta by mala byť relatívna k koreňu projektu. Toto umiestni staršiu verziu súboru do pracovnej oblasti vášho projektu.

Ak sa chcete jednoducho vrátiť n zaviaže, nepotrebujete hash ID. Môžete len vydať príkaz git checkout HLAVA ~ - / cesta / k / súboru, kde je počet záväzkov, ktoré chcete vrátiť.

Ak chcete skontrolovať celý adresár súborov, potom pre cesty k súborom použite zástupný formát Gitu. Napríklad zadaniegit checkout HLAVA ~ 1 - ./src/** vás vezme späť jeden spáchať a obnoviť všetko v / src adresár z koreňa vášho projektu.

Chyba Git č. 4: Pobočku ste omylom odstránili

Tu je scenár, ktorého sa všetci bojíme: nechceného odstránenia celej pobočky z nášho úložiska. Z tejto môže byť buď veľmi ľahké sa spamätať, alebo o niečo zložitejšia, podľa okolností.

Najprv použite git reflog nájsť posledný záväzok vykonaný na pobočke. Potom pomocou hash ID vytvorte novú vetvu:

git checkout -b obnovena-vetva

Upozorňujeme, že to vašu slaninu odpečie, iba ak bola príslušná vetva už zlúčená. Ak ste vynútene vymazali nezlúčený pobočka, máte ešte jeden spôsob, ako ju nájsť, ak ste nebežali git gc v úložisku:

git fsck --full --no-reflogs - nedosiahnuteľný - nájdený

Týmto sa vypíše zoznam všetkých hašovaní potvrdení pre objekty, ktoré už nie sú dostupné, vrátane odstránených vetiev. V dolnej časti zoznamu vyhľadajte položku „nedosiahnuteľného potvrdenia“ a skúste obnoviť toto hash ID do novej vetvy, aby ste zistili, či je to tá, ktorú ste vyhodili do koša. Ak nie je, prepracujte sa v zozname na ďalší a pozrite sa, čo môžete obnoviť.

Spravidla spravidla vetvu štandardne nikdy neodstraňujte, pretože by ste mohli ľahko skončiť s ukladaním odpadu do nezlúčenej vetvy, ktorá má stále v sebe niečo cenné. Ak zvyčajne vymažete pobočky, znamená to, že vaše pracovné návyky s pobočkami musia byť menej chaotické.

Chyba Git č. 5: Odkryli ste vzdialenú vetvu pomocou git push

Raz som pracoval na lokálnej kópii úložiska GitHub a omylom som tlačil svoju hlavnú vetvu na vzdialenú kópiu pomocou - sila možnosť. Skončil som s verejnou kópiou repa, ktoré nebolo v tom čase použiteľné. Veľké ups.

Ak ste takúto chybu urobili a vaše úložisko bolo nedávno synchronizované so vzdialeným úložiskom, môžete to napraviť pomocou vlastnej kópie pobočky vzdialeného úložiska. Prejdite na pobočku, ktorú potrebujete znova synchronizovať, za predpokladu, že tam ešte nie ste, a zadajte tento príkaz:

git reset --hard / @ {1}

Týmto sa obnoví vaša kópia súboru na poslednú synchronizovanú verziu . V mojom prípade bola pobočka pán a vzdialené repo bolo pôvodu, takže som mohol použiť git reset --hard origin / master @ {1}.

Potom použite git push -f obnoviť vzdialené úložisko do pôvodného stavu.

Jedným zo spôsobov, ako zabrániť tomu, aby sa to už nezopakovalo, je zakázať tlačenie silou. Môžete to nakonfigurovať na vzdialenom Git repo pomocou tohto príkazu:

git config --system receive.denyNonFastForwards true

Môže prísť čas, keď budete musieť stlačiť silu, ale je asi najlepšie zapnúť túto funkciu, keď to potrebujete, a vypnúť ju, keď to nepotrebujete.

Chyba Git # 6: Zadali ste súkromné ​​informácie do verejnej správy

Toto môže byť najhorší a najťažší problém v Gite, s ktorým sa treba vyrovnať. Omylom ste odovzdali citlivé údaje verejnému repo a chcete súbory z repozície chirurgicky vystrihnúť. Musíte sa ubezpečiť, že citlivé údaje nemožno nájsť ani návratom k predchádzajúcemu potvrdeniu, ale musíte to urobiťbez toho, aby ste sa dotkli čohokoľvek iného.

Je to dvojnásobne ťažké, ak bol predmetný spis spáchaný, ach, pred šiestimi týždňami a medzitým bol spáchaný nákladný automobil s inými dôležitými prácami. Pred pridaním súboru sa nemôžete vrátiť späť. zničíte pri tom všetko ostatné.

Dobrá správa: Niekoľko neohrozených Git mavenov vytvorilo nástroj, BFG Repo-Cleaner, špeciálne za účelom odstránenia zlých údajov z repozitárov Git. BFG Repo-Cleaner vám umožňuje rýchlo vykonávať bežné úlohy v repo, ako napríklad odstránenie všetkých súborov zodpovedajúcich konkrétnemu zástupnému znaku alebo obsahujúcich určité texty. Môžete dokonca vložiť súbor so zoznamom všetkých nežiaducich textov.

BFG Repo-Cleaner je v podstate automatizácia pre použitie viacstupňového procesu git filter-vetva. Ak chcete radšej robiť veci ručne, GitHub má podrobný návod na postup. Nástroj BFG však pokrýva prevažnú väčšinu bežných prípadov použitia, z ktorých mnohé sú prepracované do možností príkazového riadku tohto nástroja. Tento proces je navyše dlhý a zložitý a je príliš ľahké streliť si niekde pozdĺž cesty, ak to robíte ručne.

Upozorňujeme, že ak čistíte údaje z miestnej pobočky, ktorá sa musí synchronizovať inde, nebudete ich môcť synchronizovať, iba ak na vzdialené vetvy kliknete silou. Celý strom potvrdenia musí byť prepísaný, takže v podstate píšete na diaľkový ovládač úplne novú históriu. Tiež sa budete musieť uistiť, že všetci ostatní po vykonaní zmien stiahnu novú kópiu prepísaného repo, pretože ich repozície už tiež nebudú platné.

$config[zx-auto] not found$config[zx-overlay] not found