Usuwanie plików z git commit
Używam Gita i mam kilka plików za pomocą
git commit -a
Później odkryłem, że plik został omyłkowo dodany do commita.
Jak mogę usunąć plik z ostatniego commita?
21 answers
Myślę, że inne odpowiedzi tutaj są błędne, ponieważ jest to kwestia przeniesienia błędnie popełnionych plików z powrotem do strefy przejściowej z poprzedniego commita, bez anulowania wprowadzonych zmian. Można to zrobić tak jak zasugerował Paritosh Singh:
git reset --soft HEAD^
Lub
git reset --soft HEAD~1
Następnie zresetuj niechciane pliki, aby pominąć je w commicie:
git reset HEAD path/to/unwanted_file
Teraz commit ponownie, możesz nawet użyć tego samego komunikatu commit:
git commit -c ORIG_HEAD
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-04 09:36:14
Uwaga ! Jeśli chcesz tylko usunąć plik z poprzedniego commita i zachować go na dysku, przeczytaj odpowiedź juzzlina tuż powyżej.
Jeśli jest to twój ostatni commit i chcesz całkowicie usunąć plik z lokalnego i zdalnego repozytorium, możesz:
- usuń plik
git rm <file>
- Zatwierdź z poprawką:
git commit --amend
Znacznik amend mówi gitowi o ponownym zatwierdzeniu, ale " merge "(nie w sensie scalania dwie gałęzie) ten commit z ostatnim commitem.
Jak wspomniano w komentarzach, użycie git rm
Tutaj jest jak użycie samej komendy rm
!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-06 03:19:55
Istniejące odpowiedzi mówią o usunięciu niechcianych plików z Ostatni / align = "left" /
Jeśli chcesz usunąć niechciane pliki z stare commit (nawet wciśnięty) i nie chce tworzyć nowego commita, co jest niepotrzebne, ze względu na działanie:
1.
Znajdź commit, do którego plik ma być zgodny.
git checkout <commit_id> <path_to_file>
Możesz to zrobić wiele razy, jeśli chcesz usunąć wiele pliki.
2.
git commit -am "remove unwanted files"
3.
Znajdź identyfikator commit , do którego pliki zostały dodane przez pomyłkę , powiedzmy "35c23c2" tutaj
git rebase 35c23c2~1 -i // notice: "~1" is necessary
To polecenie otwiera edytor zgodnie z Twoimi ustawieniami. Domyślnym jest vim.
Przenieś ostatni commit, który powinien być "Usuń niechciane pliki", do następnego wiersza nieprawidłowego commita( w naszym przypadku"35c23c2") i ustaw komendę jako fixup
:
pick 35c23c2 the first commit
fixup 0d78b28 remove unwanted files
Powinieneś być dobry po zapisaniu plik.
Do końca:
git push -f
Jeśli niestety masz konflikty, musisz je rozwiązać ręcznie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-28 11:40:57
Jak wskazuje przyjęta odpowiedź, możesz to zrobić, zresetując cały commit. Ale to raczej ciężkie podejście.
Czystszym sposobem na to byłoby zachowanie commita i po prostu usunięcie z niego zmienionych plików.
git reset HEAD^ -- path/to/file
git commit --amend --no-edit
git reset
pobierze plik tak, jak w poprzednim commicie i ustawi go w indeksie. Plik w katalogu roboczym jest nietknięty.git commit
następnie zatwierdzi i przekaże indeks do bieżącego zatwierdzenia.
To zasadniczo pobiera wersję pliku, który był w poprzednim zatwierdzeniu i dodaje go do bieżącego zatwierdzania. Nie powoduje to żadnych zmian w sieci, a więc plik jest skutecznie usuwany z zatwierdzania.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-27 05:58:07
Jeśli nie wypchnąłeś zmian na serwerze możesz użyć
git reset --soft HEAD~1
Zresetuje wszystkie zmiany i powróci do jednego commita Wstecz
Jeśli przesunąłeś zmiany, wykonaj kroki, na które odpowiedział @CharlesB
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-18 18:40:43
Usunięcie pliku za pomocą rm spowoduje jego usunięcie!
Zawsze dodajesz commit w git zamiast usuwać, więc w tym przypadku zwracasz plik do stanu sprzed pierwszego commita (może to być akcja delete 'rm' jeśli plik jest nowy), a następnie ponownie zatwierdzasz i plik zostanie usunięty.
Aby przywrócić plik do poprzedniego stanu:
git checkout <commit_id> <path_to_file>
Lub przywrócić go do stanu na zdalnej głowie:
git checkout origin/master <path_to_file>
Następnie zmień commit i powinieneś znaleźć plik, który ma zniknął z listy (i nie został usunięty z dysku!)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-28 14:00:04
git checkout HEAD~ path/to/file
git commit --amend
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-23 19:01:20
Poniższy plik usunie tylko zamierzony plik, o co prosiło OP.
git reset HEAD^ /path/to/file
Zobaczysz coś takiego jak poniżej...
Zmiany do zatwierdzenia: (użyj " GIT reset HEAD ..."do unstage)
Modified: / path / to / file
Zmiany nie wystawione dla commit: (użyj "git add ..."do aktualizacji co zostanie popełnione) (użyj "git checkout -- ..."do wyrzucenia zmiany w katalogu roboczym)
Zmodyfikowany: /ścieżka / do / pliku
- "zmiany do zatwierdzenia" to poprzednia wersja pliku przed zatwierdzeniem. Będzie to wyglądało jak usunięcie, jeśli plik nigdy nie istniał. Jeśli zatwierdzisz tę zmianę, nastąpi zmiana, która przywróci zmianę do pliku w Twojej gałęzi.
- "Changes not staged for commit" to zmiana, którą zatwierdziłeś i aktualny stan pliku
W tym momencie możesz zrobić z plikiem co chcesz, np. zresetować do inna wersja.
Kiedy będziesz gotowy do popełnienia:
git commit --amend -a
Lub (jeśli masz inne zmiany, których jeszcze nie chcesz wprowadzić)
git commit add /path/to/file
git commit --amend
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-07 07:13:42
Jeśli chcesz zachować swój commit (być może poświęciłeś już trochę czasu na pisanie szczegółowej wiadomości o commicie i nie chcesz jej stracić), a chcesz tylko usunąć plik z commita, ale nie całkowicie z repozytorium:
git checkout origin/<remote-branch> <filename>
git commit --amend
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-17 20:07:30
Wyjaśnię ci przykład.
Niech A, B, C będą 3 kolejnymi commitami. Commit B zawiera plik, który nie powinien być 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 <branchName>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-06 11:16:40
Używanie GUI git może uprościć usuwanie pliku z poprzedniego commita.
Zakładając, że nie jest to współdzielona gałąź i nie masz nic przeciwko przepisywaniu historii , Uruchom:
git gui citool --amend
Możesz odznaczyć plik, który został błędnie zatwierdzony, a następnie kliknąć "Zatwierdź".
Plik jest usuwany z commita, ale będzie przechowywany na dysku. Jeśli więc nie zaznaczono pliku po omyłkowym dodaniu, pojawi się on na liście plików nie śledzonych (a jeśli nie zaznaczony plik po omyłkowej modyfikacji pojawi się na liście zmian, które nie zostały wystawione do zatwierdzenia).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-20 15:56:07
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "removed unwanted file from git"
Pozostawi Ci plik lokalny. Jeśli nie chcesz, aby plik był przechowywany lokalnie, możesz pominąć opcję --cached.
Jeśli cała praca jest na twojej lokalnej gałęzi, musisz zachować plik w późniejszym commicie i podobnie jak mieć czystą historię, myślę, że prostszym sposobem na to 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>^
I możesz z łatwością zakończyć rebase bez konieczności zapamiętywania bardziej złożonych poleceń lub wiadomości zatwierdzania lub wpisywania.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-23 06:28:27
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'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-17 01:16:48
Chciałem tylko uzupełnić górną odpowiedź, ponieważ musiałem uruchomić dodatkowe polecenie:
git reset --soft HEAD^
git checkout origin/master <filepath>
Zdrówko!Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-25 15:24:40
Coś, co u mnie działało, 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 innym commicie, sprawdź inne
$ git commit --amend // or stash and rebase to <commit_id> to amend changes
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-14 05:34:23
git reset --soft HEAD^
kiedy wpiszesz git status
, powie Ci co masz robić:
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-08 08:40:30
Właściwie, myślę, że szybszym i łatwiejszym sposobem jest użycie Git rebase interactive mode.
git rebase -i head~1
(lub head~4, how ever far you want to go)
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.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-16 16:50:19
Miałem ten sam problem, w którym mam zmiany w lokalnej gałęzi, w której chciałem przywrócić tylko jeden plik. To, co dla mnie działało, to -
(feature / target_branch Poniżej znajdują się wszystkie moje zmiany, w tym te, które chciałem cofnąć dla konkretnego pliku)
(origin / feature / target_branch jest zdalną gałęzią, do której chcę przenieść moje zmiany)
(feature / staging to moja tymczasowa gałąź staging, z której będę naciskał wszystkie moje pożądane zmiany z wyjątkiem zmiany w tym jednym pliku)
Utwórz lokalną gałąź z mojego origin / feature / target_branch - nazwałem ją feature/staging
-
Połączyłem działającą lokalną gałąź feature / target_branch z feature / staging branch
Sprawdź feature / staging then git reset --soft ORIG_HEAD (Teraz wszystkie zmiany z funkcji / staging ' będą wystawiane, ale / align = "left" / )
-
Odinstalowałem plik, który wcześniej sprawdziłem z niepotrzebnymi zmianami
Zmieniono gałąź upstream dla feature / staging na origin / feature / target_branch
Zatwierdził resztę zmian i wypchnął pod prąd do mojego Zdalnego origin / feature/target_branch
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-23 05:03:08
Jeśli nie potrzebujesz już tego pliku, możesz zrobić
git rm file
git commit --amend
git push origin branch
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-28 21:49:21
Jeśli używasz Githuba i nie wcisnąłeś jeszcze commita, GitHub Desktop rozwiązuje ten problem z łatwością:
- Wybierz Repozytorium - > Cofnij Najnowszy Commit
- Usuń zaznaczenie błędnie dodanego pliku. Twoja poprzednia wiadomość o zatwierdzeniu będzie już w oknie dialogowym.
- Naciśnij przycisk Commit!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-26 14:32:50
To działa dla mnie, aby usunąć plik z repo wiadra bitów, które pchnąłem plik do gałęzi początkowo.
git checkout origin/develop <path-to-file>
git add <path-to-file>
git commit -m "Message"
git push
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-14 16:19:26