Korzystam z Git i wykorzystałem kilka plików
git commit -a
Później odkryłem, że plik został błędnie dodany do zatwierdzenia.
Jak mogę usunąć plik z ostatniego zatwierdzenia?
git
git-commit
Lolly
źródło
źródło
git reset filepath
Odpowiedzi:
Myślę, że inne odpowiedzi tutaj są błędne, ponieważ jest to kwestia przeniesienia błędnie zatwierdzonych plików z powrotem do obszaru testowego z poprzedniego zatwierdzenia, bez anulowania wprowadzonych do nich zmian. Można to zrobić tak, jak sugerował Paritosh Singh:
lub
Następnie zresetuj niechciane pliki, aby wykluczyć je z zatwierdzenia:
Teraz zatwierdzaj ponownie, możesz nawet ponownie użyć tego samego komunikatu zatwierdzenia:
źródło
git push
naprawić swoją repo, będzie narzekaćUpdates were rejected because the tip of your current branch is behind its remote counterpart.
. Jeśli masz pewność, że chcesz je popchnąć (np. To twój widelec), możesz skorzystać z-f
opcji wymuszenia pchnięcia, npgit push origin master -f
. (Nie rób tego z repozytorium nadrzędnym, z którego inni sięgit reset --soft HEAD^
to moja najczęstsza operacja cofaniagit reset
ale chciałem wpłynąć na istniejące zatwierdzenie „na miejscu”. Właśnie się dowiedziałemgit commit -C
. Więc dla mnie to, czego chcę, to twoja dokładna recepta z jeszcze jednym krokiem, „nowe zatwierdzenie ponownie” zapisane jakogit commit -C [hash of original HEAD commit from first step]
.UWAGA ! Jeśli chcesz tylko usunąć plik z poprzedniego zatwierdzenia i zachować go na dysku , przeczytaj odpowiedź juzzlin tuż powyżej.
Jeśli jest to twój ostatni zatwierdzenie i chcesz całkowicie usunąć plik z lokalnego i zdalnego repozytorium , możesz:
git rm <file>
git commit --amend
Flaga zmiany nakazuje gitowi ponowne zatwierdzenie, ale „scal” (nie w sensie łączenia dwóch gałęzi) to zatwierdzenie z ostatnim zatwierdzeniem.
Jak stwierdzono w komentarzach, użycie
git rm
tutaj jest jak użycie samegorm
polecenia!źródło
git rm --cached
do przechowywania plików na dyskurm
git
rm
git commit --amend
jest nadal dostępne i można je znaleźć na przykład za pomocągit reflog
. Więc nie jest tak źle, jak sugerują inne komentarze.Istniejące odpowiedzi mówią o usunięciu niechcianych plików z ostatniego zatwierdzenia.
Jeśli chcesz usunąć niechciane pliki ze starego zatwierdzenia (nawet wypchnięte) i nie chcesz tworzyć nowego zatwierdzenia, co jest niepotrzebne z powodu akcji:
1.
Znajdź zatwierdzenie, z którym ma być zgodny plik.
możesz to zrobić wiele razy, jeśli chcesz usunąć wiele plików.
2)
3)
Znajdź commit_id zatwierdzenia, do którego pliki zostały błędnie dodane , powiedzmy tutaj „35c23c2”
To polecenie otwiera edytor zgodnie z Twoimi ustawieniami. Domyślnym jest vim.
Przenieś ostatnie zatwierdzenie, które powinno być „usuń niechciane pliki”, do następnego wiersza niepoprawnego zatwierdzenia (w naszym przypadku „35c23c2”) i ustaw polecenie jako
fixup
:Powinieneś być dobry po zapisaniu pliku.
Skończyć :
Jeśli niestety występują konflikty, musisz je rozwiązać ręcznie.
źródło
git rm --cached <file(s)>
.--fixup=35c23c2
dogit commit
polecenia. Spowoduje to automatyczne skonfigurowanie zatwierdzenia jako poprawki wymaganego zatwierdzenia, więc nie będziesz musiał określać go w bazie. Dodatkowo, jeśli dodasz--autosquash
dogit rebase
polecenia, git automatycznie przeniesie zatwierdzenie do właściwej lokalizacji, więc nie musisz nic robić w interaktywnej bazie - po prostu zapisz wynik (co oznacza, że nawet nie musisz-i
oznaczać, mimo to lubię go używać, aby upewnić się, że wszystko wygląda tak, jak się spodziewam).Jak wskazuje zaakceptowana odpowiedź, możesz to zrobić poprzez zresetowanie całego zatwierdzenia. Ale jest to dość ciężkie podejście.
Lepszym sposobem na to byłoby zachowanie zatwierdzenia i po prostu usunięcie z niego zmienionych plików.
The
git reset
Odbędzie plik, jak to było w poprzednim commit, a etapie w indeksie. Plik w katalogu roboczym pozostaje nietknięty. Wtedy popełnić i zgnieść indeks do prądu popełnić.git commit
To zasadniczo pobiera wersję pliku, która była w poprzednim zatwierdzeniu i dodaje ją do bieżącego zatwierdzenia. Powoduje to brak zmian sieci, a zatem plik jest skutecznie usuwany z zatwierdzenia.
źródło
Jeśli nie opublikowałeś zmian na serwerze, możesz użyć
Zresetuje wszystkie zmiany i powróci do jednego zatwierdzenia z powrotem
Jeśli wprowadziłeś zmiany, postępuj zgodnie z instrukcjami udzielonymi przez @CharlesB
źródło
Usunięcie pliku za pomocą rm spowoduje jego usunięcie!
Zawsze dodajesz do zatwierdzenia w git, zamiast go usuwać, więc w tym przypadku przywróć plik do stanu, w jakim znajdował się przed pierwszym zatwierdzeniem (może to być akcja usuwania „rm”, jeśli plik jest nowy), a następnie ponów zatwierdzenie, a plik pójdzie.
Aby przywrócić plik do poprzedniego stanu:
lub aby przywrócić go do stanu na zdalnej GŁOWICY:
następnie zmień zatwierdzenie i powinieneś zobaczyć, że plik zniknął z listy (i nie został usunięty z twojego dysku!)
źródło
źródło
Poniższa operacja usunie scenę tylko z zamierzonego pliku, o co poprosił OP.
Zobaczysz coś takiego ...
W tym momencie możesz zrobić, co chcesz z plikiem, na przykład zresetować do innej wersji.
Kiedy będziesz gotowy do zatwierdzenia:
lub (jeśli wprowadzasz jakieś inne zmiany, których nie chcesz jeszcze zatwierdzać)
źródło
Wyjaśnię ci przykład.
Niech A, B, C będą 3 kolejnymi zatwierdzeniami. Zatwierdzenie B zawiera plik, który nie powinien był zostać zatwierdzony.
źródło
noop
naedit [A_commit_ID]
lube [A_commit_ID]
Możesz po prostu spróbować.
i utwórz nowy zatwierdzenie.
Istnieje jednak niesamowite oprogramowanie „gitkraken”. co ułatwia pracę z git.
źródło
git commit --amend
zaktualizować usunięcie pliku w swoim ostatnim zatwierdzeniu; a następnie możesz sprawdzić, czy rzeczywiście został usunięty za pomocągit log -1 --stat
pozostawi ci nadal plik lokalny. Jeśli nie chcesz też pliku lokalnie, możesz pominąć opcję --cached.
Jeśli cała praca jest w twoim oddziale lokalnym, musisz zachować plik w późniejszym zatwierdzeniu, i podobnie jak w przypadku czystej historii, myślę, że prostszym sposobem może być:
a następnie możesz z łatwością dokończyć zmianę bazy bez konieczności zapamiętywania bardziej złożonych poleceń lub zatwierdzania wiadomości lub pisania.
źródło
Korzystanie z git GUI może uprościć usuwanie pliku z wcześniejszego zatwierdzenia.
Zakładając, że nie jest to gałąź udostępniona i nie masz nic przeciwko przepisywaniu historii , uruchom:
Możesz odznaczyć plik, który został błędnie popełniony, a następnie kliknąć „Zatwierdź”.
Plik jest usuwany z zatwierdzenia, ale będzie przechowywany na dysku . Więc jeśli odznaczyłeś plik po pomyłkowym dodaniu go, pojawi się on na liście nieśledzonych plików (a jeśli odznaczysz plik po pomyłkowej modyfikacji, pokaże się na twoich zmianach, które nie zostały ustawione na liście zatwierdzeń).
źródło
sudo apt-get install git-gui
git rebase -i HEAD~4
a następnie uruchomiłem polecenie, aby otworzyć edytor. Kolejna uwaga: „Unstaging” można znaleźć w menu „Commit”.git reset --soft HEAD^
(pamiętanie --soft arg), a następniegit commit -c ORIG_HEAD
(zamiast --amend, co psuje wszystko).Jeśli chcesz zachować swoje zatwierdzenie (być może poświęciłeś już trochę czasu na napisanie szczegółowej wiadomości zatwierdzenia i nie chcesz jej zgubić) i chcesz tylko usunąć plik z zatwierdzenia, ale nie całkowicie z repozytorium:
źródło
Wykonaj sekwencję następujących poleceń:
źródło
Chciałem tylko uzupełnić najwyższą odpowiedź, ponieważ musiałem uruchomić dodatkowe polecenie:
Twoje zdrowie!
źródło
Coś, co zadziałało dla mnie, ale nadal uważam, że powinno być lepsze rozwiązanie:
Po prostu zostaw zmianę, którą chcesz odrzucić w drugim zatwierdzeniu, sprawdź inne
źródło
git reset --soft HEAD^
wycofuje zatwierdzenie, a kiedy piszeszgit status
, mówi ci, co masz zrobić:źródło
Myślę, że szybszym i łatwiejszym sposobem jest użycie interaktywnego trybu git rebase.
(lub głowa ~ 4, jak daleko chcesz się posunąć)
a następnie zamiast „pick” użyj „edit”. Nie zdawałem sobie sprawy, jak potężna jest „edycja”.
https://www.youtube.com/watch?v=2dQosJaLN18
Mam nadzieję, że okaże się to pomocne.
źródło
Miałem ten sam problem, gdy mam zmiany w lokalnym oddziale, w którym chciałem przywrócić tylko jeden plik. Dla mnie zadziałało -
( funkcja / target_branch poniżej to miejsce, w którym mam wszystkie moje zmiany, w tym te, które chciałem cofnąć dla określonego pliku)
( origin / feature / target_branch to gałąź zdalna, do której chcę przekazać moje zmiany)
( funkcja / inscenizacja jest moją tymczasową gałęzią inscenizacji, w której będę wypychać wszystkie pożądane zmiany oprócz zmiany tego jednego pliku)
Stwórz lokalną gałąź z mojego pochodzenia / funkcji / docelowej gałęzi - nazywanej to cechą / inscenizacją
Połączyła moją pracę lokalnym oddziale fabularny / target_branch do funkcji / inscenizacja oddział
Wyrejestrowany cecha / inscenizacja następnie git resetowania --soft ORIG_HEAD (obecnie wszystkie zmiany z funkcji / inscenizacji”odbędzie się jednak niezakończonej).
Nieustawiony plik, który wcześniej sprawdziłem, z niepotrzebnymi zmianami
Zmieniono odgałęzienie upstream dla feature / staging na origin / feature / target_branch
Zatwierdził resztę zmian etapowych i przekazał do mojego zdalnego źródła / funkcji / docelowej gałęzi
źródło
Jeśli nie potrzebujesz już tego pliku, możesz to zrobić
źródło
Jeśli używasz GitHub i jeszcze nie wypchnąłeś zatwierdzenia, GitHub Desktop łatwo rozwiązuje ten problem:
źródło
Jeśli chcesz usunąć pliki z poprzednich zatwierdzeń, użyj filtrów
Jeśli widzisz ten błąd:
Nie można utworzyć nowej kopii zapasowej. Poprzednia kopia zapasowa już istnieje w refs / original / Force nadpisując kopię przy pomocy -f
Wystarczy usunąć kopie referencyjne na lokalnym repozytorium
źródło
jeśli jeszcze nie wypchniesz swoich zmian do git
Zresetuje wszystkie zmiany i powróci do jednego zatwierdzenia z powrotem
Jeśli jest to ostatni zatwierdzony plik i chcesz usunąć plik z lokalnego i zdalnego repozytorium, spróbuj tego:
lub nawet lepiej:
najpierw zresetuj
zresetuj niechciany plik
popełnić ponownie
źródło
Pracowałem nad tym, aby usunąć plik z repozytorium bitów, które początkowo wypchnąłem do gałęzi.
źródło
Skopiowałem bieżące pliki do innego folderu, a następnie pozbyłem się wszystkich niepoprawnych zmian poprzez:
Następnie skopiuj rzeczy z powrotem. Commit, Push.
źródło
Możesz po prostu użyć tego polecenia:
źródło
źródło
Żadna z odpowiedzi w tym momencie nie jest rozsądna. Wygląda na to, że istnieje wystarczające zapotrzebowanie na zaproponowanie prawdziwego rozwiązania: https://github.com/git/git/blob/master/Documentation/SubmittingPatches
byłoby miło. Rozumiem, że nie chcemy modyfikować historii, ale jeśli jestem lokalny i przypadkowo dodałem lokalny plik „hack” i chcę go usunąć z zatwierdzenia, byłoby to bardzo pomocne.
źródło