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?
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.
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.
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.
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.
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.
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
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ć
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
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.
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.
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.
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
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.
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).
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.
Dzień dobry.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
.
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.
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.
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
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
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
-
Najpierw zresetuj gałąź do rodzica bieżącego commita
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
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
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.
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.
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.
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
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):
-
git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2
//tworzy kopię zapasową tego commita (SHA1 ID test change 4 commit to 515b5220c50e3dfbb1063f23789d92ae1d3481a2 ) -
git reset --hard HEAD~1
/ / to kopia zapasowa przed jednym commitem. -
git reset --hard HEAD^
/ / aby usunąć ostatni commit z git
Po usunięciu:
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
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
Odniosłem się do obu linków poniżej, byłoby dobrze.
Http://christoph.ruegg.name/blog/git-howto-revert-a-commit-already-pushed-to-a-remote-reposit.html https://gist.github.com/gunjanpatel/18f9e4d1eb609597c50c2118e416e6a6
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