Jak odrzucić wszystkie zmiany wprowadzone w gałęzi?


116

Pracuję w gałęzi (tj. design) I dokonałem wielu zmian, ale muszę je wszystkie odrzucić i zresetować, aby pasowała do wersji repozytorium. Myślałem, że git checkout designto zrobię, ale po prostu mówi mi, że jestem już w gałęzi designi mam 3 zmodyfikowane pliki.

Jak odrzucić te zmiany i uzyskać gałąź, która jest teraz na serwerze zdalnym?

Odpowiedzi:


207

Uwaga: NIE MOŻESZ tego Cofnąć .

Spróbuj git checkout -fto odrzucić wszelkie lokalne zmiany, które nie zostały zatwierdzone we WSZYSTKICH gałęziach i wzorcu.


86

git reset - hard może ci pomóc, jeśli chcesz odrzucić wszystko od ostatniego zatwierdzenia


6
lubgit reset --hard HEAD^
Deadfish

28
git reset --hard HEAD^naprawdę powinna być akceptowaną odpowiedzią. OP nie pytał o inne branże ...
vphilipnyc

2
Próbowałem tego i myślę, że usunęło wszystko od mojego ostatniego naciśnięcia, a nie tylko mojego ostatniego zatwierdzenia.
Chase Roberts,

3
Próbowałem zresetować git - hard HEAD ^ i nadal pozostawiało to kilka niezarejestrowanych plików. Teraz przejdź do Google, jak je usunąć jednym prostym poleceniem.
John Deighan,

20
git diff master > branch.diff
git apply --reverse branch.diff

Te kroki mogą być bardzo przydatne, jeśli Twoim celem jest ustawienie stanu określonej gałęzi tak, aby był równy gałęzi głównej. Aby to zrobić, uruchom to z poziomu określonej gałęzi, a następnie usuń plik [nazwa gałęzi] .diff po git rm [branch name].diff
zakończeniu

18

Jeśli nie chcesz żadnych zmian designi na pewno chcesz, aby pasował tylko do gałęzi zdalnego, możesz także po prostu usunąć gałąź i utworzyć ją ponownie:

# Switch to some branch other than design
$ git br -D design
$ git co -b design origin/design            # Will set up design to track origin's design branch

7
także: projekt kasy git; git reset --hard origin / design
Dan,

Zrobiłbym również zobowiązanie przed usunięciem gałęzi
Asarluhi

Jeśli w lokalnym oddziale masz commity, których nie ma na pilocie, to moim zdaniem jest to przepis na wpadanie w naprawdę kłopotliwe sytuacje. Zdecydowanie nie skorzystałbym z tego rozwiązania.
erewok

1
@erewok: Cóż, pytanie konkretnie mówi, że pytający chce odrzucić wszystkie zmiany.
mipadi

I nie sądzę, aby ta odpowiedź to osiągnęła.
erewok

7

@Will, git immersion to naprawdę fajny i prosty samouczek git. pokaże ci, jak cofnąć zmiany w następujących przypadkach: niestacjonarnych, wystawionych i zatwierdzonych. laboratoria 14-18


2
Chciałbym tylko powiedzieć, że już zanurzyłem się w gita ... ponad rok później. OI! Powinienem był to zrobić znacznie wcześniej ...
Will

1
To musi Rubyzostać zainstalowane ... co nie zawsze wydaje się wyborem
Wisznu

5

Jeśli chcesz odrzucić zmiany w lokalnym oddziale, możesz je ukryć za pomocą polecenia git stash.

git stash save "some_name"

Twoje zmiany zostaną zapisane i możesz je później odzyskać, jeśli chcesz, lub możesz je usunąć. Po wykonaniu tej czynności Twoja gałąź nie będzie zawierała żadnego niezatwierdzonego kodu i możesz pobrać najnowszy kod z gałęzi głównej za pomocą git pull.


4

W źródłowym katalogu głównym: git reset ./ HEAD <--un-stage any staged changes git checkout ./ <--discard any unstaged changes


0

ODWRACALNA metoda odrzucenia wszystkich zmian:

Znalazłem to pytanie po dokonaniu scalenia i zapomnieniu o kasie, pojawiło się zaraz potem. Zgadłeś: zacząłem modyfikować kilka plików bezpośrednio na master . D'Oh! Ponieważ moja sytuacja nie jest wyjątkowa (wszyscy to zrobiliśmy, prawda; ->), zaoferuję odwracalny sposób, w jaki zwykłem odrzucać wszystkie zmiany, aby mistrz wyglądał jak rozwijaj się ponownie.

Po zrobieniu a git diffżeby zobaczyć jakie pliki zostały zmodyfikowane i ocenić zakres mojego błędu wykonałem:

git stash
git stash clear

Po pierwszym zachowaniu wszystkich zmian, zostały one następnie usunięte. Wszystkie zmiany wprowadzone w plikach z błędem wzorcowym zniknęły i przywrócono parzystość.

Powiedzmy, że chciałem teraz przywrócić te zmiany. Mogę to zrobić. Pierwszym krokiem jest znalezienie skrótu skrytki, którą właśnie wyczyściłem / upuściłem:

git fsck --no-reflog | awk '/dangling commit/ {print $3}'

Po nauczeniu się skrótu pomyślnie przywróciłem niezatwierdzone zmiany za pomocą:

git stash apply hash-of-cleared-stash

Naprawdę nie chciałem przywracać tych zmian, chciałem tylko sprawdzić, czy mogę je odzyskać, więc ponownie je wyczyściłem.

Inną opcją jest przeniesienie skrytki do innej gałęzi , zamiast wymazywania zmian. Więc jeśli chodzi o usuwanie zmian dokonanych podczas pracy na niewłaściwej gałęzi, stashdaje ci dużą elastyczność w odzyskaniu sprawności po twoim boo-boo.

W każdym razie, jeśli chcesz odwracalnego sposobu usuwania zmian w gałęzi, powyższe jest mniej niebezpiecznym sposobem w tym przypadku użycia.


-1

git checkout -f

To wystarczy na twoje pytanie. Jedyną rzeczą jest to, że kiedy już to zrobione, to się skończy Nie można cofnąć.

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.