Git: Usuń zatwierdzony plik po wypchnięciu

112

Czy istnieje możliwość przywrócenia zatwierdzonego pliku w Git? Po wysłaniu zatwierdzenia do GitHub zdałem sobie sprawę, że jest plik, którego nie chciałem wypchnąć (nie dokończyłem zmian).

kmaci
źródło
1
Czy chcesz całkowicie usunąć plik z GitHub po wypychaniu? W przeciwnym razie po prostu: git rm <file>, git push.
rdrmntn

Odpowiedzi:

153

aktualizacja: dodano bezpieczniejszą metodę

preferowana metoda:

  1. sprawdź poprzedni (niezmieniony) stan twojego pliku; zwróć uwagę na podwójną kreskę

    git checkout HEAD^ -- /path/to/file
    
  2. popełnij to:

    git commit -am "revert changes on this file, not finished with it yet"
    
  3. popchnij, bez użycia siły:

    git push
    
  4. wróć do swojej niedokończonej pracy, ponownie wykonaj (3 razy strzałka w górę):

    git checkout HEAD^ -- /path/to/file
    

skutecznie „niezobowiązujący”:

Aby zmodyfikować ostatnie zatwierdzenie repozytorium HEAD, zaciemniając przypadkowo wypchniętą pracę, jednocześnie potencjalnie wpadając w konflikt z kolegą, który mógł już to zrobić, i który zapuści siwe włosy i straci dużo czasu, próbując pogodzić głowę lokalnego oddziału z centralnym:

Aby usunąć zmianę pliku z ostatniego zatwierdzenia:

  1. aby przywrócić plik do stanu sprzed ostatniego zatwierdzenia, wykonaj:

    git checkout HEAD^ /path/to/file
    
  2. aby zaktualizować ostatnie zatwierdzenie z przywróconym plikiem, wykonaj:

    git commit --amend
    
  3. aby przekazać zaktualizowane zatwierdzenie do repozytorium, wykonaj:

    git push -f
    

Naprawdę rozważ użycie preferowanej metody wspomnianej wcześniej.

xor
źródło
1
Jeśli nie jesteś jedynym programistą w projekcie, naprawdę nie powinieneś używać git push -f. Stwarza o wiele więcej problemów, niż jest to warte. Po prostu usuń plik, a następnie wykonaj nowe zatwierdzenie.
richardm
1
@ user553086 nie może się bardziej zgodzić. Lepiej teraz?
xor
Czy jest to wykonalne w przypadku zatwierdzeń w późniejszych czasach? Np. Czy mógłbym to zrobić z git checkout HEAD~2 /path/to/file? Edycja: Wygląda na to, że chciałem w moim przypadku po prostugit rm /path/to/file
starscream_disco_party
1
Właśnie uratowałeś mi 4 godziny brachu!
Tosin Onikute
57

Jeśli chcesz usunąć plik ze zdalnego repozytorium, najpierw usuń go z projektu opcją --cache, a następnie wypchnij:

git rm --cache /path/to/file
git commit -am "Remove file"
git push

(Działa to nawet jeśli plik został dodany do zdalnego repozytorium kilka zatwierdzeń temu). Pamiętaj, aby dodać do .gitignore rozszerzenia plików, których nie chcesz przesyłać.

micoru
źródło
2
To usuwa pliki z tego zatwierdzenia do przodu, ale pliki są nadal widoczne w starszych zatwierdzeniach.
Ken
30

Możesz przywrócić tylko jeden plik do określonej wersji.

Najpierw możesz sprawdzić, w których zatwierdzeniach plik został zmieniony.

git log path/to/file.txt

Następnie możesz pobrać plik z numerem wersji.

git checkout 3cdc61015724f9965575ba954c8cd4232c8b42e4 /path/to/file.txt

Następnie możesz zatwierdzić i wcisnąć ponownie.

René Höhle
źródło
7

Zresetuj plik do poprawnego stanu, zatwierdź i ponownie wypchnij.

Jeśli jesteś pewien, że nikt inny nie pobrał jeszcze twoich zmian, możesz użyć --amendpodczas zatwierdzania, aby zmodyfikować poprzednie zatwierdzenie (tj. Przepisać historię), a następnie wypchnąć. Myślę, że będziesz musiał użyć tej -fopcji podczas pchania, aby wymusić pchnięcie.

JB Nizet
źródło
4
  1. Pobierz kod skrótu ostatniego zatwierdzenia.

    • git log
  2. Cofnij zatwierdzenie
    • git revert <hash_code_from_git_log>
  3. Przenieś zmiany
    • git push

sprawdź w GHR. możesz dostać wszystko, czego potrzebujesz, mam nadzieję, że to się przyda

krish babu
źródło