Usuń commity z gałęzi w Git

Chciałbym wiedzieć, jak usunąć commit.

Przez delete, mam na myśli to tak, jakbym nie zrobił tego commita, a kiedy wykonam push w przyszłości, moje zmiany nie będą przesuwać się do zdalnej gałęzi.

Czytam git help I wydaje mi się, że poleceniem, którego powinienem użyć jest git reset --hard HEAD. Czy to prawda?

Author: Randall, 2009-08-27

27 answers

Ostrożnie.: git reset --hard usunie zmiany w katalogu roboczym . Pamiętaj, aby ukryć wszelkie lokalne zmiany, które chcesz zachować przed uruchomieniem tego polecenia.

Zakładając, że siedzisz na tym commicie, to ta komenda go zwali...

git reset --hard HEAD~1

HEAD~1 oznacza commit przed głową.

Lub, możesz spojrzeć na wyjście git log, znaleźć identyfikator commita, do którego chcesz utworzyć kopię zapasową, a następnie zrobić to:

git reset --hard <sha1-commit-id>

Jeśli już go popchnął, będziesz musiał wykonać siłę, aby się go pozbyć...

git push origin HEAD --force

Jednakże, jeśli inni mogli to zrobić, wtedy lepiej byłoby założyć nową gałąź. Bo kiedy pociągną, to po prostu połączy to z ich pracą, a Ty znów ją popchniesz.

Jeśli już nacisnąłeś, może być lepiej użyć git revert, aby utworzyć commit "lustrzane odbicie", który cofnie zmiany. Jednak oba commity będą w dzienniku.


FYI -- git reset --hard HEAD jest świetny, jeśli chcesz pozbyć się prac w toku. Zresetuje cię z powrotem do ostatniego commita i usunie wszystkie zmiany w działającym drzewie i indeksie.


Na koniec, jeśli chcesz znaleźć commit, który "usunąłeś", zazwyczaj jest on obecny w git reflog, chyba że masz śmieci zebrane w repozytorium.

 3388
Author: gahooa,
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-02 07:58:31

Jeśli jeszcze nigdzie nie wcisnąłeś commita, możesz użyć git rebase -i aby usunąć ten commit. Najpierw dowiedz się, jak daleko jest ten commit (w przybliżeniu). Więc zrób:

git rebase -i HEAD~N

The ~N oznacza rebase the last N commits (N musi być liczbą, na przykład HEAD~10). Następnie możesz edytować plik prezentowany przez Git, aby usunąć naruszający commit. Po zapisaniu tego pliku, Git przepisze wszystkie następujące commity tak, jakby ten, który usunąłeś, nie istniał.

The Git Książka zawiera dobrą sekcję dotyczącą rebasingu ze zdjęciami i przykładami.

Bądź ostrożny z tym, ponieważ jeśli zmienisz coś, co masz popchnął gdzie indziej, inne podejście będzie potrzebne, chyba że planujesz zrobić siłę push.

 617
Author: Greg Hewgill,
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-21 00:51:07

Inną możliwością jest jedna z moich ulubionych komend:

git rebase -i <commit>~1

Spowoduje to uruchomienie rebase w trybie interaktywnym -i w momencie tuż przed zatwierdzeniem, które chcesz usunąć. Od tego czasu edytor uruchomi listę wszystkich commitów. Usuń wiersz zawierający commit, który chcesz usunąć i zapisz plik. Rebase wykona resztę pracy, usuwając tylko ten commit i odtwarzając wszystkie pozostałe z powrotem do dziennika.

 420
Author: 1800 INFORMATION,
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
2009-08-27 03:49:27

Dodaję tę odpowiedź, ponieważ nie widzę powodu, dla którego ktoś, kto właśnie próbował zatwierdzić pracę, chciałby usunąć całą tę pracę z powodu jakiegoś błędu przy użyciu Git!

Jeśli chcesz zachować swoją pracę i po prostu "cofnąć" komendę commit (złapaną przed naciśnięciem repo):

git reset --soft HEAD~1

Nie używaj flagi --hard, chyba że chcesz zniszczyć swoją pracę w toku od ostatniego commita.

 287
Author: Rob,
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-10-15 18:17:58

Usuwanie całego commita

git rebase -p --onto SHA^ SHA

Oczywiście zastąp "SHA" odniesieniem, którego chcesz się pozbyć. "^"W tej komendzie jest dosłowne.

Http://sethrobertson.github.io/GitFixUm/fixup.html

 52
Author: raittes,
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-08-31 19:36:46

Jeśli nie opublikowałeś zmian, aby usunąć najnowszy commit, możesz wykonać

$ git reset --hard HEAD^

(zwróć uwagę, że spowoduje to również usunięcie wszystkich niezatwierdzonych zmian; używaj ostrożnie).

Jeśli już opublikowałeś commit do usunięcia, użyj git revert

$ git revert HEAD
 46
Author: Jakub Narębski,
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
2009-08-27 10:47:42
git reset --hard commitId

git push <origin> <branch> --force

PS: Commidid odnosi się do tego, do którego chcesz wrócić

 33
Author: sun34,
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-08-12 10:13:42

Jeśli chcesz naprawić swój najnowszy commit, możesz cofnąć ten commit i usunąć pliki w nim, wykonując:

git reset HEAD~1

Spowoduje to przywrócenie repozytorium do stanu przed poleceniami git add, które przechowywały pliki. Twoje zmiany będą w katalogu roboczym. HEAD~1 odnosi się do commita pod bieżącą końcówką gałęzi.

Jeśli Chcesz zatwierdzić N commitów, ale Zachowaj zmiany w kodzie w katalogu roboczym:

git reset HEAD~N

Jeśli chcesz pozbyć się swojego najnowszego zatwierdź, a nie chcesz zachować zmiany kodu, możesz zrobić" twardy " reset.

git reset --hard HEAD~1

Podobnie, jeśli chcesz odrzucić Ostatnie N commitów i nie chcesz zachować zmian w kodzie:

git reset --hard HEAD~N
 28
Author: Anurag-Sharma,
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-05-31 07:19:37

Forcefully Change History

Zakładając, że nie chcesz tylko usunąć ostatniego commita, ale chcesz usunąć konkretne commity z ostatnich n commitów, wybierz:

git rebase -i HEAD~<number of commits to go back>, więc git rebase -i HEAD~5 jeśli chcesz zobaczyć ostatnie pięć commitów.

Następnie w edytorze tekstu Zmień słowo pick na drop obok każdego commita, który chcesz usunąć. Zapisz i zamknij Edytor. Voila!

Addytywnie Zmień Historię

Spróbuj git revert <commit hash>. Revert utworzy nowy commit, który wycofuje określony commit.

 21
Author: IliasT,
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-27 06:06:50

Powiedzmy, że chcemy usunąć commity 2 i 4 z repo.

commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>

Uwaga: musisz mieć uprawnienia administratora nad repo ponieważ używasz --hard i -f.

  • git checkout b3d92c5 Sprawdź ostatni możliwy commit.
  • git checkout -b repair Utwórz nową gałąź do pracy.
  • git cherry-pick 77b9b82 Uruchom commit 3.
  • git cherry-pick 2c6a45b Uruchom commit 1.
  • git checkout master Checkout master.
  • git reset --hard b3d92c5 Zresetuj master do ostatniego commita.
  • git merge repair Połącz nasze nowe / align= "left" /
  • git push -f origin master Naciśnij master do zdalnego repo.
 19
Author: tk_,
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-03-19 04:02:24
git rebase -i HEAD~2

Tutaj '2' jest liczbą zmian, które chcesz zmienić.

'git rebase -i HEAD`

Jeśli chcesz zmienić wszystkie commity.

Wtedy będziesz mógł wybrać jedną z tych opcji.

p, pick = use commit

r, reword = use commit, but edit the commit message

e, edit = use commit, but stop for amending

s, squash = use commit, but meld into previous commit

f, fixup = like "squash", but discard this commit's log message

x, exec = run command (the rest of the line) using shell

d, drop = remove commit

Te linie mogą być ponownie uporządkowane; są wykonywane od góry do dołu. Jeśli usuniesz linię, COMMIT zostanie utracony. Jeśli jednak usuniesz wszystko, rebase zostanie przerwany. Zauważ, że puste commity są komentowane

Możesz po prostu usunąć ten commit używając opcji " d " lub usuwając linię zawierającą Twój commit.

 15
Author: Siva Praveen,
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-18 23:39:53

Aby usunąć w lokalnej gałęzi, użyj

git reset --hard HEAD~1

Aby usunąć w zdalnej gałęzi, użyj

git push origin HEAD --force
 11
Author: thestar,
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-28 16:06:07

Oto inny sposób na to:

Sprawdź gałąź, którą chcesz przywrócić, a następnie zresetuj lokalną kopię roboczą z powrotem do commita, który chcesz być najnowszym na zdalnym serwerze (wszystko po nim przejdzie do pa-pa). Aby to zrobić, w SourceTree kliknąłem prawym przyciskiem myszy i wybrałem "Resetuj nazwę gałęzi do tego commita". Myślę, że linia poleceń to:

git reset --hard COMMIT_ID

Ponieważ właśnie sprawdziłeś swoją gałąź zdalnie, nie będziesz musiał martwić się o żadne lokalne zmiany przegrywam. Ale to by ich straciło, gdybyś to zrobił.

Następnie przejdź do katalogu lokalnego repozytorium i uruchom polecenie:

git -c diff.mnemonicprefix=false -c core.quotepath=false \
push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

Spowoduje to usunięcie wszystkich zmian po bieżącym w lokalnym repozytorium, ale tylko dla tej gałęzi.

 7
Author: CommaToast,
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-05-14 06:47:06

Błąd:

I git rebase -i --root'ed swoją gałąź, nieświadomie myśląc, że mogę przerobić pierwszy commit różniący się od master (GitHub Dla Windows domyślny widok jest porównaniem do master, ukrywając go w całości).

Zapuściłem brodę z Doliny Krzemowej, podczas gdy 900 + angażuje się w Sublime. Wychodząc bez zmian, naładowałem baterię i przystąpiłem do golenia, ponieważ wszystkie 900 + Indywidualne commity nonszalancko zmieniały się - resetując czas ich commitów do teraz.

Zdeterminowany, aby pokonać Gita i zachować oryginalne czasy, usunąłem to lokalne repozytorium i ponownie sklonowałem je z pilota.

Teraz ponownie dodał najnowszy niepotrzebny commit do mistrza, który chciałem usunąć, więc tak postępował.

Wyczerpanie opcji:

Nie chciałem git revert - stworzyłoby to dodatkowy commit, dający Gitowi przewagę.

git reset --hard HEAD nie zrobił nic, po sprawdzeniu reflog, ostatnim i jedynym HEAD był clone-Git wygrywa.

Aby uzyskać najnowszy SHA, sprawdziłem zdalne repozytorium na github.com -mała Wygrana.

Po pomyśleniu, że git reset --hard <SHA> zadziałało, zaktualizowałem kolejną gałąź do master i 1... 2... puf! commit był back-Git wygrywa.

Sprawdzanie z powrotem do mistrza, czas spróbować git rebase -i <SHA>, a następnie usunąć linię... na próżno, przykro mi to mówić. "jeśli usuniesz linię, COMMIT zostanie utracony ". Ah...nowa funkcja troll the n00b w wydaniu 2.8.3 uwagi .

Rozwiązanie:

git rebase -i <SHA> Następnie d, drop = remove commit.

Aby zweryfikować, sprawdziłem w innej gałęzi i voila-no hiding commit to fetch / pull from the master.

Https://twitter.com/holman/status/706006896273063936

Dzień dobry.
 7
Author: Leo,
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 20:54:19

Wszystkie powyższe polecenia przywracają stan drzewa pracy i indeksu w taki sam sposób, jak przed dokonaniem commitu, ale nie przywracają stanu repozytorium. Jeśli spojrzysz na to, commit "usunięty"nie jest w rzeczywistości usunięty, po prostu nie jest ten na końcu bieżącej gałęzi.

Myślę, że nie ma możliwości usunięcia commita za pomocą poleceń. Jedynym sposobem jest usunięcie go z dziennika i reflogu, a następnie wykonanie git prune --expire -now.

 6
Author: Angelo Borsotti,
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-10-31 04:31:08

Jeśli właśnie zepsułeś swój ostatni commit (błędna wiadomość, zapomniałeś dodać kilka zmian) i chcesz go naprawić przed przepchnięciem go do publicznego repo, dlaczego nie użyć:

git commit --amend -m "New message here"

Jeśli masz nowo wprowadzone zmiany, zostaną one połączone z ostatnim commitem (którego próbujesz się pozbyć) i zastąpią ten commit.

Oczywiście, jeśli zmienisz commit po jego naciśnięciu, przepisujesz historię, więc jeśli to zrobisz, pamiętaj, aby zrozumieć implikacje.

Można również zdać opcja' --no-edit 'zamiast'- m', jeśli wolisz użyć poprzedniego commita.

Docs: http://git-scm.com/docs/git-commit.html

 5
Author: Pwnrar,
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-05-26 23:24:22

Jeśli chcesz zachować historię, pokazując commit i rewert, powinieneś użyć:

git revert GIT_COMMIT_HASH

Wprowadź wiadomość wyjaśniającą, dlaczego cofasz, a następnie:

git push  

Po wydaniu git log zobaczysz zarówno " zły " commit, jak i rewert wiadomości dziennika.

 5
Author: Paulo Fidalgo,
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-01-07 15:13:35

Co zwykle robię kiedy commit i push (jeśli ktoś nacisnął jego commit to Rozwiąż problem):

git reset --hard HEAD~1

git push -f origin

Hope this help

 3
Author: Chris Sim,
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-06-14 09:22:56

Jeśli już nacisnąłeś, najpierw znajdź commit, który chcesz mieć na głowie ($GIT_COMMIT_HASH_HERE), a następnie uruchom następujące polecenie:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

Następnie każde miejsce repo zostało sklonowane, Uruchom:

git reset --hard origin/master
 2
Author: Justin,
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-30 00:31:00

Źródło: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8

Usuń ostatni commit

Na przykład twój ostatni commit

Git push origin +aa61ab32^: master

Teraz chcesz usunąć ten commit, a następnie w prosty sposób wykonać następujące czynności

Kroki

  1. Najpierw zresetuj gałąź do rodzica bieżącego commita

  2. Force-push it to the zdalnie.

git reset HEAD^ --hard

git push origin -f

Dla poszczególnych commitów, które chcesz zresetować, wykonujemy

git reset bb676878^ --hard

git push origin -f
 2
Author: sagar jethi,
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-06-22 13:40:59

Reset na lokalnym oddziale

git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3

Force push to origin

git push -f origin
 1
Author: Ashish 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
2018-05-29 07:38:04

Zakładając, że nie zostały przeniesione do zdalnego repozytorium, można ponownie sklonować repozytorium. To była moja metoda wyboru kilka razy.

 0
Author: zacharydl,
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-31 06:54:56

Git reset --hard

Git push origin HEAD --force

Jeśli jeden lub więcej commitów jest oznaczonych, najpierw usuń znaczniki. W Przeciwnym Razie oznaczony commit nie zostanie usunięty.

 0
Author: BillChan,
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-07-24 14:45:51

Użyj git revert https://git-scm.com/docs/git-revert . zwróci cały kod, a następnie wykonasz następny commit.Wtedy head wskaże ostatni commit. cofnięte commity nigdy nie są usuwane, ale nie będą miały wpływu na ostatnie commity.

 0
Author: Uttam Rahane,
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-03-01 15:15:44

Usuń lokalny commit

Jak widać na powyższym obrazku chcę usunąć revert" test change 2 " commit(SHA1 ID: 015B5220C50E3DFBB1063F23789D92AE1D3481A2 (możesz uzyskać SHA1 ID używając komendy gitk w Git bash)).

Do tego mogę użyć (wszystkie poniższe polecenia działają tylko na lokalnym. trzeba wcisnąć po skasowaniu):

  1. git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2 //tworzy kopię zapasową tego commita (SHA1 ID test change 4 commit to 515b5220c50e3dfbb1063f23789d92ae1d3481a2 )
  2. git reset --hard HEAD~1 / / to kopia zapasowa przed jednym commitem.
  3. git reset --hard HEAD^ / / aby usunąć ostatni commit z git

Po usunięciu:

po delete commit

 0
Author: ankit,
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-07-03 06:51:42

Wykonaj kopię zapasową kodu w folderze temp. Następujące polecenie zresetuje się tak samo jak serwer.

git reset --hard HEAD
git clean -f
git pull

Jeśli chcesz zachować zmiany i usunąć ostatnie commity

git reset --soft HEAD^
git pull
 0
Author: Lava Sangeetham,
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-07-20 05:14:18
 -2
Author: lakshmikandan,
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-07-18 06:27:56