Jakie są typowe błędy w Git i jak je naprawić?

Cofnij najczęstsze błędy podczas wersjonowania kodu w narzędziu systemowym git do przechowywania wersji i chroń integralność danych.

Z boomem technologia ta staje się nieunikniona dla każdego informatyka, aby pracować na wielu danych jednocześnie, a dane te ewoluują w czasie. Ważne jest również, aby śledzić każdą zmianę danych i być przygotowanym na cofnięcie lub cofnięcie wszelkich niepożądanych zmian w razie potrzeby.



Muszę przyznać, że wersjonowanie moich danych w Git pozwala mi na bardziej eksperymentalne rozwijanie projektu. Jeśli coś zepsuję, wiem, że git zawsze ma sposób na cofnięcie i / lub przywrócenie tej wersji mojego projektu do stanu, w jakim było, zanim schrzaniłem. Każdy warstwa została zaprojektowana tak, aby umożliwić przeglądanie i modyfikowanie i / lub poprawianie zmian danych przed przeniesieniem danych do następnego etapu. Oto błędy omówione na tym blogu:



Pliki / katalogi z poziomu pliku index

Podczas dodawania i / lub modyfikowania plików często używasz domyślnego zachowania polecenia „git add”, które polega na dodaniu wszystkich plików i katalogów do indeksu.Często odczuwasz potrzebę cofnięcia niektórych plików ze sceny lub zmodyfikowania ich po raz ostatni przed ich zatwierdzeniem.



Składnia: reset git


usuwanie plików z indeksu - typowe błędy git -Edureka

Cofnięcie przemieszczania plików z obszaru indeksu daje kolejną szansę na ponowne przetworzenie danych przed przekazaniem ich do lokalnego repozytorium.



Edytuj ostatnią zatwierdzoną wiadomość

Komenda: git commit --amend
Możesz edytować najnowszy komunikat dotyczący zmiany bez tworzenia nowego. Aby wyświetlić dzienniki zatwierdzeń, ustawiłem alias „hist”:
Komenda: git config --global alias.hist 'log --pretty = format: '% C (żółty)% h% Creset% ad | % C (zielony)% s% Creset% C (czerwony)% d% Creset% C (niebieski) [% an] '--graph --decorate --date = short'x


Nie zmieniaj komunikatu o zatwierdzeniu, który jest już przesłany do zdalnego repozytorium i udostępniony innym, ponieważ spowodowałoby to unieważnienie wcześniejszej historii zatwierdzeń, a tym samym może wpłynąć na pracę opartą na tym.

Zapomniałem o niektórych zmianach w ostatnim zatwierdzeniu

Powiedzmy, że zapomniałeś dokonać pewnych modyfikacji i już zatwierdziłeś migawkę, a także nie chcesz robić kolejnego zatwierdzenia, aby podkreślić swój błąd.
Komenda: git commit --amend


Podkreśliłem, jak został odtworzony i zmieniony identyfikator sha-1 obiektu ostatniego zatwierdzenia. Udałem, że wykonałem jedno zatwierdzenie, łącząc obie zmiany w jedną.

Odrzuć zmiany lokalne

Oto przypadek, w którym zmodyfikowałem plik „README” i umieściłem go w poczekalni. Następnie zmodyfikowałem ten sam plik po raz drugi, ale zdałem sobie sprawę, że nie chcę drugiej zmiany.

Teraz nie pozwolę sobie ręcznie cofnąć całej zmiany, mogę po prostu wyciągnąć wersję tymczasową pliku.
Składnia:
kasy git -–Lokalne zmiany w pliku
kasy git -–Lokalne zmiany we wszystkich plikach w katalogu & nieśmiały i nieśmiały

Komenda: git checkout - README

Dlatego odrzuciłem ostatnie zmiany w pliku i zaakceptowałem wersję przejściową pliku. W następnym zatwierdzeniu tylko wersja pomostowa pliku trafia do lokalnego repozytorium.

Przekazane dane osobowe do lokalnego repozytorium

Chcę usunąć niektóre dane z lokalnego repozytorium, ale zachować pliki w katalogu roboczym.
Składnia:
git reset --mixed HEAD ~
git reset --mixed

Komenda: git reset --mixed HEAD ~ 1
HEAD ~ 1 oznacza zatwierdzenie tuż przed ostatnim zatwierdzeniem wskazanym przez bieżącą gałąź HEAD.

Pliki z bieżącej migawki zostały usunięte zarówno z repozytorium lokalnego, jak i obszaru przemieszczania. Dodaj następujące wzorce w globalnym pliku .gitignore, aby wykluczyć je ze śledzenia przez git.
vim ~ / .gitignore_global
# pliki haseł #
*.przechodzić
*.klucz
* .passwd

instancja klasy java

Dzięki temu zatwierdzenie, które zawierało migawkę plików haseł, zostanie usunięte, a otrzymasz czysty obszar przemieszczania. Moje pliki są nadal obecne w moim katalogu roboczym, ale nie ma ich już w lokalnym repozytorium, również nie zostaną przesłane do zdalnego repozytorium.

Uwaga: Jeśli je zgubisz, git nie będzie mógł ich odzyskać, ponieważ o tym nie wie.

Zastąp najnowsze zatwierdzenie nowym zatwierdzeniem

Składnia: reset git --soft [/ HEAD ~ n>]

Opcja „–soft” po prostu usuwa zatwierdzone pliki z lokalnego repozytorium, gdy są one nadal w indeksie i można je ponownie zatwierdzić po przejrzeniu. to sha-1 migawki, którą chcesz usunąć z lokalnego repozytorium. gdzie n to liczba zatwierdzeń przed zatwierdzeniem HEAD

Komenda :reset git - soft HEAD ~ 1


Zmodyfikuj pliki i ponownie je przygotuj

Komenda: git commit -m 'Dodawanie index.html i style.css'
Twoja historia zatwierdzeń okazuje się teraz następująca:

Popełnił złe dane

Składnia:
reset git --hard HEAD ~ n–Zresetuj projekt na „n” zatwierdzeń przed ostatnią zatwierdzoną migawką
git reset --hard–Resetuj projekt na podaną migawkę identyfikatora zatwierdzenia

Komenda: reset git --hard HEAD ~ 1


Najnowsze zatwierdzenie i uszkodzone pliki są usuwane z lokalnego repozytorium, obszaru przemieszczania oraz katalogu roboczego.

Uwaga: To niebezpieczne polecenie, ponieważ w końcu tracisz pliki w katalogu roboczym. Niezalecane w zdalnie udostępnionym repozytorium.

Wróć do mojego starego stanu projektu

Możesz przejść do starszego stanu swojego projektu w historii czasu. Jeśli popełnisz błąd w najnowszej wersji lub potrzebujesz ulepszeń w starszym kodzie, możesz utworzyć inną gałąź z tej starej migawki projektu, aby nie utrudniać bieżącej pracy. Zobaczmy, jak:
za. Wypisz historię projektu i wybierz starszy identyfikator zatwierdzenia, polecenie:idź hist
b. Utwórz kolejną gałąź z identyfikatora zatwierdzenia:git checkout -b stary stan e7aa9a5
do. Kontynuuj pracę nad kodem, a następnie połącz / przebuduj bazę z gałęzią „master”.

Odzyskaj usunięty oddział lokalny

Istnieje możliwość odtworzenia utraconej pracy na gałęzi odniesienia. Powiedzmy, usunąłem gałąź „stary_kod” bez łączenia się z gałęzią główną i straciłem pracę. I nie, nie wysłałem też gałęzi do zdalnego repozytorium, co wtedy? Cóż, git śledzi i prowadź dziennik wszystkich zmian wprowadzonych w każdym odwołaniu, zobaczmy moje:przejdź do reflog

Tak więc HEAD @ {2} jest wskaźnikiem, kiedy przeniosłem się do gałęzi „stary_kod”, przywróćmy to:

Składnia:git checkout -b
Komenda:git checkout -b stary_kod HEAD @ {2}

Musisz teraz znajdować się w gałęzi „old_code” z najnowszą pracą w momencie jej utworzenia. Dodatkowo, wskaźnik „reflog” w HEAD @ {1} był ostatnim zatwierdzeniem dokonanym w gałęzi „old_code”. Aby przywrócić to unikalne commituj po prostu uruchom polecenie jako:git reset --hard HEAD @ {1}.Spowoduje to również przywrócenie zmodyfikowanych plików w katalogu roboczym.

Jeśli chcesz dowiedzieć się szczegółowo, jak działa to polecenie i jak zarządzać wpisami „reflog”, równie dobrze możesz przeczytać mój wcześniejszy post naodzyskiwanie usuniętej gałęzi z git reflog.

Cofnij zmiany wprowadzone w zatwierdzeniu

udać sięOdwracaćjest używany do rejestrowania nowych zatwierdzeń, aby odwrócić efekt niektórych wcześniejszych zatwierdzeń.
Składnia: git revert
Z moich dzienników zatwierdzeń chciałbym cofnąć zmianę dokonaną w podświetlonym identyfikatorze zatwierdzenia:

Komenda: git revert 827bc0d

Lepiej jest, aby nie resetować „twardych” wspólnych zatwierdzeń, ale zamiast tego „przywracać” je git, aby zachować historię, dzięki czemu wszystkim łatwiej będzie wyśledzić dzienniki historii, aby dowiedzieć się, co zostało cofnięte, przez kogo i dlaczego?

Możesz użyć tej samej logiki odwoływania się do zatwierdzeń dotyczących wskaźnika HEAD zamiast podawania identyfikatora zatwierdzenia, jak w HEAD ~ 3 lub HEAD ~ 4 i tak dalej.

Nadałem niewłaściwej nazwie mojemu oddziałowi

Możesz zmienić nazwę lokalnego oddziału. Często zdarza się, że możesz chcieć zmienić nazwę swojego oddziału w oparciu o problem, nad którym pracujesz, bez przechodzenia przez ból związany z przenoszeniem całej swojej pracy z jednego miejsca do drugiego. Na przykład możesz być w tej samej gałęzi lub innej gałęzi i nadal mieć możliwość zmiany nazwy żądanej gałęzi, jak pokazano poniżej:
Składnia: git branch -m
Komenda: git branch -m stary_kod stary_ # 4920

Jak możesz się zastanawiać, czy git śledzi tę zmianę nazwy? Tak, to odnosi się do Twoich wpisów „reflog”, oto moje:

Zmiana nazwy oddziału nie wpłynie na jej gałąź zdalnego śledzenia. W sekcji zdalnej zobaczymy, jak zastąpić gałąź w zdalnym repozytorium

Ponownie uporządkuj dzienniki historii przed wysłaniem do zdalnego

Jakże żałuję, że nie zrobiłbym pewnych zatwierdzeń wcześniej niż inne i nie zrobiłbym w ogóle niektórych. Interaktywnie przeorganizuj i edytuj stare zatwierdzenia, aby skutecznie naprawić lub ulepszyć kod
Składnia: git rebase -i
Komenda: git rebase -i fb0a90e–Rozpocznij zmianę bazy zatwierdzeń, które zostały wykonane po identyfikatorze zatwierdzenia fb0a90e

Odwiedź ponownie git rebase dokumentacja, aby zrozumieć, czym różni się rebase „–interactive lub -i” od zwykłego rebase.

Zatwierdzono niepowiązane zmiany w jednym zatwierdzeniu

W takim przypadku musisz podzielić stare zakopane zatwierdzenie na wiele zatwierdzeń logicznych.
Składnia: git rebase -i
Komenda: git rebase -i fb0a90e
W edytorze rebase musisz wybrać identyfikator zatwierdzenia e7aa9a5 i zmienić go na „edytuj” zamiast „wybierz”.

niepowiązane zmiany - typowe błędy git -Edureka

Byłbyś teraz w wersji projektu commita id-e7aa9a5. Najpierw zresetuj historię zmian i obszar przemieszczania do poprzedniej komendy zatwierdzania:git reset HEAD ~ 1
Po drugie, edytuj + etap + zatwierdzaj pliki indywidualnie
Polecenia:
git add code && git commit -m 'Dodawanie początkowych kodów'
git add nowy kod && git commit -m 'Dodawanie nowego kodu'

Po trzecie, kontynuuj rebase i zakończ.

Komenda :git rebase --continue
Po czwarte, wyświetl historię z dodatkowymi zatwierdzeniami.

Komenda: idź hist

dzielenie zatwierdzenia na wiele za pomocą rebase - typowe błędy git - Edureka

Zmień adres e-mail autora we wszystkich zatwierdzeniach we wszystkich gałęziach

Wersjonowałem i zatwierdzałem pliki projektu w git od dłuższego czasu, ale do tej pory nigdy nie dotarło do mnie, że mój identyfikator e-mail został naruszony w dziennikach historii zatwierdzeń, które są nawet publikowane w zdalnych repozytoriach. Cóż, może się to zdarzyć każdemu, gdy początkowo konfigurujesz konfiguracje w pliku „.gitconfig”. Na moją ulgę git może przepisać zmienne środowiskowe, które udostępniamy podczas tworzenia obiektu commit.

Najpierw otrzymuję listę identyfikatory e-mail zdecydować, które z nich chcę zmienić:
Komenda: git log --all --pretty = format: '% an% d'–W ten sposób wypisuje nazwisko autora (refname / branch name)

Po drugie, przebiegam każde zatwierdzenie na każdej gałęzi i ponownie napisz obiekt commit z nowym identyfikatorem e-mail
Komenda:
git filter-branch --env-filter '
jeśli ['$ GIT_AUTHOR_NAME' = 'divya']
następnie
GIT_AUTHOR_EMAIL = „divya@github.com”
być
' -- --wszystko

Zagubione i znalezione pliki

Przypuśćmy, że zgubiłeś pewien plik i nie pamiętasz jego nazwy, ale możesz sobie przypomnieć określone słowa z pliku. W takim przypadku możesz wykonać następujące kroki:
Krok 1: Wypisz wszystkie zatwierdzenia, które kiedykolwiek zawierały migawkę pliku z przeszukiwanym wzorcem
Komenda :git rev-list --all | xargs git grep -i 'sygnatura czasowa'



Krok 2 : Utwórz nową gałąź „zagubione znalezione” z tego podświetlonego identyfikatora zatwierdzenia
Składnia: git checkout -b zagubione-znalezione d8c6a76a6dcb1fc6e8c3f6b097e1bd07e7cd328f

Zapomniałem, która gałąź ma mój identyfikator zatwierdzenia

Czasami, po wykryciu błędnego identyfikatora zatwierdzenia, równie dobrze możesz chcieć poznać wszystkie gałęzie, które mają to zatwierdzenie, aby móc je wszystkie naprawić. Sprawdzanie historii każdego oddziału nie jest zbyt praktyczne w dużym, wielobranżowym projekcie.

Złe zatwierdzenie popełnione w mojej aplikacji do tworzenia nawigacji kiedyś złamało kod, wtedy użyłem Polecenie „git bisect”, aby wykryć identyfikator zmiany, który był zły po którym następujeKomenda:git branch --containswymienić gałęzie z tym złym zatwierdzeniem.

Więc teraz znam wszystkie gałęzie, które nadal mają złe zatwierdzenie, mogę albo przywrócić, albo zresetować ten zestaw zmian.

Usuń zmianę z historii

Czasami czuję potrzebę wymazania commita z historii i nie zostawiania po nim śladu. Nie polecałbym wypróbowania tego wyczynu na wspólnym oddziale, ale tylko w lokalnym oddziale.
Składnia: git rebase -i
Komenda :git rebase -i 93859d8
W edytorze rebase-> zamień „edit” na „drop” dla podświetlonego numeru zatwierdzenia: 69f4813

W niektórych przypadkach ponowne napisanie może spowodować konflikty. Musisz rozwiązać konflikty, a następnie przejść dalej.

Ostrzeżenie : Jest to niebezpieczne polecenie, ponieważ powoduje ponowne zapisanie historii i może spowodować utratę danych. Taka gałąź różni się od jej zdalnego odpowiednika i będzie musiała zostać wypchnięta z--siłalub--force-with-leaseopcja.

Pchnął niewłaściwą gałąź do pilota

Oto, co chcę zrobić - chcę usunąć plik oddział zdalny a także przestań go śledzić z mojego lokalnego oddziału ”.git push„Polecenie, gdy jest używane z--usunąćopcja usuwa zdalną gałąź Tak więc otrzymuję lokalną kopię sklonowanego projektu -

klon git https://github.com/greets/myProj.git
cd myProj


Gdy zdalna gałąź zostanie usunięta, inne osoby w udostępnionym repozytorium muszą odświeżyć i zaktualizować swoje zdalne odwołania za pomocą--suszona śliwkamożliwość usunięcia brakujących odniesień do obiektów:git fetch --prune -v pochodzenie

W tym poście wspomniałem o niektórych typowych błędach lub zmianach, które git może pomóc Ci naprawić. Każdy kod jest unikalny i opracowany na swój sposób, więc istnieją również różne sposoby podejścia do problemu i jego rozwiązania. Zawsze możesz zwrócić się do urzędnika dokumentacja git aby zrozumieć, w jaki sposób różne polecenia git chronią Twój kod źródłowy i jak najlepiej je wykorzystać.

Teraz, gdy zrozumiałeś typowe błędy w Git, sprawdź to autorstwa Edureka, zaufanej firmy zajmującej się edukacją online, z siecią ponad 250 000 zadowolonych uczniów rozsianych po całym świecie. Szkolenie Edureka DevOps Certification Training pomaga uczniom zrozumieć, czym jest DevOps i zdobyć wiedzę na temat różnych procesów i narzędzi DevOps, takich jak Puppet, Jenkins, Nagios, Ansible, Chef, Saltstack i GIT do automatyzacji wielu kroków w SDLC.

Masz do nas pytanie? Wspomnij o tym w sekcji komentarzy w tym „typowym błędzie Git”, a my skontaktujemy się z Tobą