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?

 1134
Author: random, 2012-09-18

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  
 2196
Author: juzzlin,
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:

  1. usuń plik git rm <file>
  2. 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!

 228
Author: 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
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.

 111
Author: Brian,
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.

 72
Author: Patrick,
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

 35
Author: Paritosh Singh,
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!)

 34
Author: Bob Flannigon,
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
 33
Author: Denis Shchepetov,
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
 28
Author: ThatsAMorais,
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
 9
Author: mattexx,
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>   
 9
Author: Moaz Rashad,
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ź".

Tutaj wpisz opis obrazka

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).

 8
Author: JDiMatteo,
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.

 8
Author: Bryan Buckley,
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'
 5
Author: Sergey Onishchenko,
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!
 4
Author: andrepo,
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
 3
Author: saiyancoder,
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)
 3
Author: cardamom,
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.

 2
Author: Matt,
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)

  1. Utwórz lokalną gałąź z mojego origin / feature / target_branch - nazwałem ją feature/staging

  2. Połączyłem działającą lokalną gałąź feature / target_branch z feature / staging branch

  3. Sprawdź feature / staging then git reset --soft ORIG_HEAD (Teraz wszystkie zmiany z funkcji / staging ' będą wystawiane, ale / align = "left" / )

  4. Odinstalowałem plik, który wcześniej sprawdziłem z niepotrzebnymi zmianami

  5. Zmieniono gałąź upstream dla feature / staging na origin / feature / target_branch

  6. Zatwierdził resztę zmian i wypchnął pod prąd do mojego Zdalnego origin / feature/target_branch

 2
Author: user1201303,
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
 1
Author: tven,
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ą:

  1. Wybierz Repozytorium - > Cofnij Najnowszy Commit
  2. Usuń zaznaczenie błędnie dodanego pliku. Twoja poprzednia wiadomość o zatwierdzeniu będzie już w oknie dialogowym.
  3. Naciśnij przycisk Commit!
 0
Author: Ron,
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
 0
Author: swathi,
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