2013-05-01 9 views
5

Jedną z mocnych stron Gita jest to, że ponieważ obsługuje wskaźniki, stosunkowo łatwo jest cofnąć szeroki zakres zadań, w tym deleting a commit or commits lub creating and deleting remote branches. W wielu przypadkach wszystko, co naprawdę musisz zrobić, to poprawnie zresetować wskaźnik HEAD bieżącego odgałęzienia do żądanego miejsca i voila, krok cofnąć. Obejmuje to dość szeroki zestaw przypadków.Co to są niektóre czynności w Git, które są trudne/niemożliwe do cofnięcia?

Oprócz usuwania całego repozytorium lub nieprawidłowego pchnięcia, jakie jest najbardziej nietuzinkowe działanie, którego nie można cofnąć lub czy jest bardzo trudne do cofnięcia w standardowym repozytorium Git?

+3

Nie rozumiem sensu tego pytania. – Mat

+1

I * do * rozumiem punkt tego pytania i podobne. W zasadzie pyta: "Gdzie są smoki?" To pytanie jest dalekie od "nie konstruktywnego", ale jest lepiej dostosowane do wymiany stosów programistów. Rozpoczynając nową technologię, programiści często chcą wiedzieć, gdzie znajdują się smoki, pułapki i pułapki. –

Odpowiedz

3
  • git clean usuwa nieśledzone pliki. Nie można ich przywrócić gitem.

  • Scalenie z brudnym drzewem roboczym może zaowocować czymś trudnym do przywrócenia.

Krótko mówiąc, rzeczy, które nie są śledzone przez git, nie mogą zostać przywrócone przez git. Wszystko inne jest renesansowe.

+0

W rzeczywistości nie wszystko, co śledzone przez git, może zostać przywrócone. Usunięcie gałęzi wydaje się być trwałe. Istnieją nawet nieoczywiste sposoby usuwania gałęzi, np. 'git push --mirror REMOTE'; gdy lokalny nie ma oddziałów znajdujących się na zdalnym, zdalny oddział jest usuwany nieinteraktywnie. ([Fragment fragmentu stron pomocy git] (https://git-scm.com/docs/git-push#_options_a_id_options_a): "--mirror [...] Nowo utworzone lokalne dane zostaną przekazane do zdalnego koniec, lokalnie aktualizowane refs zostaną wymuszone na końcu zdalnym, a ** usunięte refs zostaną usunięte ** ze zdalnego końca ") –

3

Przykładem trudno cofnąć działanie byłoby:

git branch -D some-unmerged-branch-such-as-master 
git gc --prune=now --aggressive 

Pierwszy usuwa odniesienia do niektórych zobowiązuje. Drugi usuwa wszystkie zatwierdzenia bez odwołań.

Mam nadzieję, że to pytanie jest tylko kwestią leniwej ciekawości, a nie chęcią wyrzucenia komuś repozytorium, ale ze względu na redundancję związaną z rozproszoną kontrolą wersji, nie martwię się zbytnio.

+0

Czy ta kombinacja opcji nuke również obiektów odniesionych przez' reflog'? – Christopher

+0

To zdecydowanie bliższe leniwej ciekawości niż złośliwości. Jestem bardziej zainteresowany możliwymi ograniczeniami możliwości kontroli źródła Gita. – joshin4colours

3

Zdecydowanie najczęstszym „trudno cofnąć” błąd I natknąć się wśród tych nowych do git są nadużycia git stash, ponieważ git stash pop zawsze nie jest odwracalny z git stash. Rozważmy:

git init /tmp/trash && cd /tmp/trash  # make a new repo 
echo A > A        # create a file 
git add A 
git commit -m "Initial commit"   # add and commit it 
echo B > A        # ... now change it 
git stash        # ... and stash it 
echo C > A        # and change it and commit it again 
git add A 
git commit -m "Another commit" 
git stash pop       # now pop the stash 

pop będzie próbował automerge A i rzuci konflikt, ale nie można po prostu wycofać się z pop trafiając git stash ponownie. Jest to dość banalny przykład, ale łatwo jest dostać się w paskudne miejsce, jeśli często przechowujesz duże zestawy zmian i często zmieniasz rozbieżne gałęzie, popping po drodze. Wierzę, że git stash drop jest również trwały, tj. Nie ma siatki bezpieczeństwa, jeśli upuścisz nieprawidłową zawartość.

Generalnie, używaj stash dla tego, do czego został zaprojektowany: Zrób brudny indeks roboczy, aby przeskoczyć do innej gałęzi, napraw błąd, zatwierdz, naciśnij i wróć do swojego pierwotnego stanu. Jeśli spróbujesz użyć go do zarządzania wieloma zmianami w wielu branżach, nieuchronnie Cię ugryzie bez szczególnej troski.

+0

To stary wpis, ale w tym przypadku możesz po prostu "zresetować - ostro". 'skrytka pop' nie spowoduje automatycznego upuszczenia wpisu w skrzynce w przypadku. – MirMasej

0

Z mojego doświadczenia wynika, że ​​najczęstszą nieodwracalną czynnością wykonywaną przez ludzi jest git reset --hard. Kiedy wielu ludzi pisze git reset, --hard wydaje się zbyt naturalnie, kiedy naprawdę potrzebowali tylko reset, być może z --keep.