Jak odrzucić lokalne zatwierdzenia w Git?


262

Pracowałem nad czymś i doszedłem do wniosku, że to kompletnie zepsute ... Wypróbowałem więc następującą sekwencję:

git reset --hard
git rebase origin
git fetch
git pull
git checkout

W którym momencie dostałem wiadomość

Your branch is ahead of 'origin/master' by 2 commits.

Chcę odrzucić moje lokalne zatwierdzenia , bez konieczności czyszczenia mojego lokalnego katalogu i ponownego pobierania wszystkiego. Jak mogę to osiągnąć?


6
Nie trzeba wykonywać obu tych czynności, git fetcha git pullpull jest kombinacją pobierania i scalania.
Eter

12
Uwaga dla użytkowników: główny problem tego pytania nie ma nic wspólnego z komunikatem „Twój oddział wyprzedza„ origin / master ”przez N zatwierdzeń.” . Przestań zamykać inne pytania jako duplikaty tego z powodu tej wiadomości.

Odpowiedzi:


579
git reset --hard origin/master

usunie wszystkie zatwierdzenia poza miejscem, w origin/masterktórym originznajduje się nazwa repo i masternazwa oddziału.


1
Myślałem, że składnia „origin / master”, z ukośnikiem, odnosi się do lokalnego repozytorium?
Daniel C. Sobral,

9
mipadi: Dokładniej mówiąc, zresetuje bieżącą gałąź, aby wskazywała to samo zatwierdzenie co origin / master.
Christoffer Hammarström,

Odnosi się do oddziału. origin/masterto gałąź, która śledzi mastergałąź originzdalnego repozytorium.
mipadi

@ DanielC.Sobral Nie, origin/masterjest odniesieniem do mastergałęzi pilota o nazwie origin.
Matthew

1
@littletiger git nie śledzi folderów, tylko pliki i ich ścieżki. Dlatego całkowicie zignoruje puste foldery (foldery bez plików lub tylko pliki zignorowane). Nigdzie się nie pojawiają, bo nie ma w nich nic do roboty.
Mumbleskates,

33

Na marginesie, oprócz odpowiedzi mipadi (która powinna przy okazji działać), powinieneś wiedzieć, że robiąc:

git branch -D master
git checkout master

robi też dokładnie to, czego chcesz having to redownload everything( bez parafowania). Jest tak, ponieważ Twoje lokalne repozytorium zawiera kopię zdalnego repozytorium (a ta kopia nie jest taka sama jak lokalny katalog, nie jest nawet taka sama jak wyrejestrowana gałąź).

Usunięcie gałęzi jest całkowicie bezpieczne, a odtworzenie tej gałęzi jest bardzo szybkie i nie wymaga żadnego ruchu sieciowego. Pamiętaj, że git to przede wszystkim lokalne repozytorium. Nawet zdalne oddziały mają kopię na komputerze lokalnym. Jest tylko trochę metadanych, które mówią git, że konkretna lokalna kopia jest w rzeczywistości zdalną gałęzią. W git wszystkie pliki są cały czas na dysku twardym.

Jeśli nie masz żadnych oddziałów innych niż master, powinieneś:

git checkout -b 'temp'
git branch -D master
git checkout master
git branch -D temp

4
Ale w jaki sposób odróżnia to zobowiązania dokonane lokalnie od zobowiązań dokonanych u źródła? W rzeczywistości mówi mi toCannot delete the branch 'master' which you are currently on.
Daniel C. Sobral

1. Zasadniczo wszystkie zatwierdzenia są takie same, niezależnie od tego, czy zostały dokonane lokalnie czy w miejscu pochodzenia. Co ważne, historie są poprawnie zsynchronizowane. Twoje lokalne zatwierdzenie będzie istniało w miejscu pochodzenia dopiero po ich wypchnięciu i domyślnie git odmówi wypchnięcia, jeśli historia u źródła może skończyć się w stanie, który nie ma sensu.
slebetman

2
2. Oczywiście nie można usunąć oddziału, który jest obecnie wyewidencjonowany. Aby usunąć master, najpierw sprawdź inny oddział. Jeśli nie ma innej gałęzi, po prostu utwórz tymczasową:git checkout -b temp;git branch -D master;git checkout master;git branch -D temp
slebetman

Zwróć też uwagę na to, co powiedziałem o tym, że twoja lokalna kopia zdalnego repozytorium jest inna: git nie pozwoli ci edytować ani nawet wyświetlać plików w twojej kopii zdalnego oddziału. Pozwoli to tylko na utworzenie innej gałęzi ze zdalnej gałęzi, którą można następnie przeglądać i edytować. Zgodnie z konwencją ten oddział lokalny ma taką samą nazwę jak oddział zdalny. Częściowo masz rację, że origin/masterjest to na lokalnym komputerze. To twoja lokalna (pełna) kopia zdalnego oddziału. Prawdziwą zdalną gałęzią jest origin master.
slebetman

To zadziałało dla mnie. Być może git branch -D masternie było to jednak konieczne, ponieważ, jak wskazano, generuje błąd.
Alexis Wilke

15

To, co robię, to staram się zresetować mocno do HEAD. Spowoduje to usunięcie wszystkich lokalnych zatwierdzeń:

git reset --hard HEAD^

To najlepsza odpowiedź, która naprawdę działała. Odrzucono wszystkie lokalne zatwierdzenia i zresetowano do HEAD. Jaki jest pożytek z ^ char?
karim

@karim „^” to prawdopodobnie wyrażenie regularne, które prawdopodobnie jest czymś dość głębokim, czego nie znam ani nie przeczytałem dawno temu w pliku instrukcji .. przepraszam stary :)
giang nguyen

1
Późno, ale ^reprezentuje zatwierdzenie nadrzędne, więc resetowanie w celu HEAD^odrzucenia niezatwierdzonych zmian i przeniesienie gałęzi do poprzedniego zatwierdzenia, skutecznie „usuwa” ostatnie zatwierdzenie (chociaż zatwierdzenie nadal istnieje, gałąź po prostu go nie wskazuje). Odpowiedź będzie miała tylko jedno zatwierdzenie lokalne, a reszta to niezatwierdzone zmiany. @karim @giang
QuantumQuaver

3

Musisz biec

git fetch

Aby uzyskać wszystkie zmiany, a następnie nie otrzymasz wiadomości z informacją „Twój oddział jest przed nami”.


5
Pobieranie nie ma nic wspólnego z głównym problemem pytającego, jakim jest pozbywanie się lokalnych zatwierdzeń.

1
co jeśli już zatwierdziłem pliki lokalnie, a następnie próbuję uruchomić wspomniane polecenie. Wyświetli się ten sam komunikat o błędzie. Próbowałem też git fetch i git fetch -p. ale pokazuje ten sam błąd
Morez

1

Widziałem przypadki, w których pilot przestał być zsynchronizowany i musiał zostać zaktualizowany. Jeśli a reset --hardlub branch -Dnie działa, spróbuj

git pull origin
git reset --hard 

to nie odpowiada na pytanie, a reset --harddziała w tej sytuacji
CharlesB

1
Cześć Charles, masz rację, że reset --hardpowinno tu działać. Jednak po prostu zaznaczam, że czasami nie resetuje gałęzi prawidłowo i git pull originponownie zsynchronizuje pilota i pozwoli na reset --hardprawidłowe działanie.
Jim Clouse,

0

Musiałem zrobić:

git checkout -b master

jak powiedział git, że nie istnieje, ponieważ został wyczyszczony za pomocą

git -D master
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.