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 reset filepath
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 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:
git reset --soft HEAD^
lub
git reset --soft HEAD~1
Następnie zresetuj niechciane pliki, aby wykluczyć je z zatwierdzenia:
git reset HEAD path/to/unwanted_file
Teraz zatwierdzaj ponownie, możesz nawet ponownie użyć tego samego komunikatu zatwierdzenia:
git commit -c ORIG_HEAD
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, np git 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 cofania
git reset
ale chciałem wpłynąć na istniejące zatwierdzenie „na miejscu”. Właśnie się dowiedziałem git commit -C
. Więc dla mnie to, czego chcę, to twoja dokładna recepta z jeszcze jednym krokiem, „nowe zatwierdzenie ponownie” zapisane jako git 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 samego rm
polecenia!
git rm --cached
do przechowywania plików na dysku
rm
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.
git checkout <commit_id> <path_to_file>
możesz to zrobić wiele razy, jeśli chcesz usunąć wiele plików.
2)
git commit -am "remove unwanted files"
3)
Znajdź commit_id zatwierdzenia, do którego pliki zostały błędnie dodane , powiedzmy tutaj „35c23c2”
git rebase 35c23c2~1 -i // notice: "~1" is necessary
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
:
pick 35c23c2 the first commit
fixup 0d78b28 remove unwanted files
Powinieneś być dobry po zapisaniu pliku.
Skończyć :
git push -f
Jeśli niestety występują konflikty, musisz je rozwiązać ręcznie.
git rm --cached <file(s)>
.
--fixup=35c23c2
do git 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
do git 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.
git reset HEAD^ -- path/to/file
git commit --amend --no-edit
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.
Jeśli nie opublikowałeś zmian na serwerze, możesz użyć
git reset --soft HEAD~1
Zresetuje wszystkie zmiany i powróci do jednego zatwierdzenia z powrotem
Jeśli wprowadziłeś zmiany, postępuj zgodnie z instrukcjami udzielonymi przez @CharlesB
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:
git checkout <commit_id> <path_to_file>
lub aby przywrócić go do stanu na zdalnej GŁOWICY:
git checkout origin/master <path_to_file>
następnie zmień zatwierdzenie i powinieneś zobaczyć, że plik zniknął z listy (i nie został usunięty z twojego dysku!)
git checkout HEAD~ path/to/file
git commit --amend
Poniższa operacja usunie scenę tylko z zamierzonego pliku, o co poprosił OP.
git reset HEAD^ /path/to/file
Zobaczysz coś takiego ...
Zmiany do zatwierdzenia: (użyj „git reset HEAD ...”, aby wycofać się ze sceny)
zmodyfikowano: / path / to / file
Zmiany, które nie zostały wprowadzone dla zatwierdzenia: (użyj „git add ...”, aby zaktualizować, co zostanie zatwierdzone) (użyj „git checkout - ...”, aby odrzucić zmiany w katalogu roboczym)
zmodyfikowano: / path / to / file
W tym momencie możesz zrobić, co chcesz z plikiem, na przykład zresetować do innej wersji.
Kiedy będziesz gotowy do zatwierdzenia:
git commit --amend -a
lub (jeśli wprowadzasz jakieś inne zmiany, których nie chcesz jeszcze zatwierdzać)
git commit add /path/to/file
git commit --amend
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.
git log # take A commit_id
git rebase -i "A_commit_ID" # do an interactive rebase
change commit to 'e' in rebase vim # means commit will be edited
git rm unwanted_file
git rebase --continue
git push --force-with-lease <branchName>
noop
na edit [A_commit_ID]
lube [A_commit_ID]
Możesz po prostu spróbować.
git reset --soft HEAD~1
i utwórz nowy zatwierdzenie.
Istnieje jednak niesamowite oprogramowanie „gitkraken”. co ułatwia pracę z git.
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
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "removed unwanted file from git"
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ć:
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit --squash <commit_id>
git add <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "brand new file!"
git rebase --interactive <commit_id>^
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.
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:
git gui citool --amend
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ń).
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ępnie git 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:
git checkout origin/<remote-branch> <filename>
git commit --amend
Wykonaj sekwencję następujących poleceń:
//to remove the last commit, but preserve changes
git reset --soft HEAD~1
//to remove unneded file from the staging area
git reset HEAD `<your file>`
//finally make a new commit
git commit -m 'Your message'
Chciałem tylko uzupełnić najwyższą odpowiedź, ponieważ musiałem uruchomić dodatkowe polecenie:
git reset --soft HEAD^
git checkout origin/master <filepath>
Twoje zdrowie!
Coś, co zadziałało dla mnie, ale nadal uważam, że powinno być lepsze rozwiązanie:
$ git revert <commit_id>
$ git reset HEAD~1 --hard
Po prostu zostaw zmianę, którą chcesz odrzucić w drugim zatwierdzeniu, sprawdź inne
$ git commit --amend // or stash and rebase to <commit_id> to amend changes
Myślę, że szybszym i łatwiejszym sposobem jest użycie interaktywnego trybu git rebase.
git rebase -i head~1
(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.
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
Jeśli używasz GitHub i jeszcze nie wypchnąłeś zatwierdzenia, GitHub Desktop łatwo rozwiązuje ten problem:
Jeśli chcesz usunąć pliki z poprzednich zatwierdzeń, użyj filtrów
git filter-branch --prune-empty --index-filter 'git rm --ignore-unmatch --cached "file_to_be_removed.dmg"'
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
$ rm -rf .git/refs/original/refs
jeśli jeszcze nie wypchniesz swoich zmian do git
git reset --soft HEAD~1
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:
git rm <file>
git commit --amend
lub nawet lepiej:
najpierw zresetuj
git reset --soft HEAD~1
zresetuj niechciany plik
git reset HEAD path/to/unwanted_file
popełnić ponownie
git commit -c ORIG_HEAD
Here is the step to remove files from Git Commit.
>git reset --soft HEAD^1(either commitid ) -- now files moved to the staging area.
>git rm --cached filename(it will removed the file from staging area)
>git commit -m 'meaningfull message'(Now commit the required files)
Ż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
git --uncommit <nazwa pliku>
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.