Jak trwale usunąć kilka commitów ze zdalnej gałęzi
Wiem, że to przepisywanie historii, które jest złe yada yada.
Ale jak trwale usunąć kilka commitów ze zdalnej gałęzi?
8 answers
Ty git reset --hard
twoja lokalna gałąź do usuwania zmian z drzewa roboczego i indeksu, a Ty git push --force
twoja zmieniona lokalna gałąź do zdalnego. (inne rozwiązanie tutaj, polegające na usunięciu zdalnej gałęzi i ponownym przepchnięciu jej)
To więc odpowiedź ilustruje niebezpieczeństwo takiego polecenia, zwłaszcza jeśli ludzie zależą od odległej historii dla własnych lokalnych repo.
Musisz być przygotowany, aby wskazać ludzi do odzyskiwanie z UPSTREAM REBASE sekcji z git rebase
strona man
W Git 2.23 (Sierpień 2019, dziewięć lat później), użyjesz nowej komendy git switch
.
To jest: git switch -C mybranch origin/mybranch~n
(zastąp n
przez liczbę commitów do usunięcia)
To przywróci indeks i działające drzewo, tak jak git reset --hard
.
dokumentacja dodaje :
-C <new-branch> --force-create <new-branch>
Podobne do
--create
z tym, że jeśli<new-branch>
już istnieje, zostanie zresetowane do<start-point>
.
Jest to wygodny skrót dla:$ git branch -f <new-branch> $ git switch <new-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
2020-06-18 20:04:36
Zwróć uwagę, aby użyć last_working_commit_id
, podczas odwracania niedziałającego commita
git reset --hard <last_working_commit_id>
Więc nie możemy zresetować do commit_id
, którego nie chcemy.
Więc oczywiście, musimy wcisnąć do zdalnej gałęzi:
git push --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
2017-01-18 17:49:58
Ważne: upewnij się, że określiłeś gałęzie na "git push-f", inaczej możesz nieumyślnie zmodyfikować inne gałęzie![*]
Istnieją trzy opcje pokazane w Ten samouczek . Jeśli link się zepsuje, zostawię tutaj główne kroki.
- Przywróć pełny commit
- Usuń ostatni commit
- Usuń commit z listy
1 Przywróć pełny commit
git revert dd61ab23
2 Usuń ostatni commit
git push <<remote>> +dd61ab23^:<<BRANCH_NAME_HERE>>
Lub, jeśli oddział jest dostępny lokalnie
git reset HEAD^ --hard
git push <<remote>> -f
Gdzie + dd61... czy twój hash commit i git interpretuje x^ jako rodzica x, a + jako wymuszone non-fastforwared push.
3 Usuń commit z listy
git rebase -i dd61ab23^
Otworzy się i edytuje listę wszystkich commitów. Usuń ten, którego chcesz się pozbyć. Zakończ rebase i naciśnij siłę do repo.
git rebase --continue
git push <remote_repo> <remote_branch> -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-07-16 14:56:56
Jeśli chcesz usunąć np. ostatni 3
commity, uruchom następujące polecenie, aby usunąć zmiany z systemu plików (drzewo robocze) i historii zmian (indeks) w lokalnej gałęzi:
git reset --hard HEAD~3
Następnie uruchom następujące polecenie (na lokalnym komputerze), aby wymusić przepisanie historii zdalnej gałęzi:
git push --force
Gratulacje! Gotowe!
Niektóre uwagi:
Możesz pobrać żądany identyfikator zatwierdzenia, uruchamiając
git log
Następnie możesz zastąpić HEAD~N
przez <desired-commit-id>
w następujący sposób:
git reset --hard <desired-commit-id>
Jeśli chcesz zachować zmiany w systemie plików i po prostu zmodyfikować indeks( historię zatwierdzeń), użyj znacznika --soft
podobnego do git reset --soft HEAD~3
. Następnie masz szansę sprawdzić swoje najnowsze zmiany i zachować lub upuścić wszystkie lub części z nich. W tym drugim przypadku runnig git status
pokazuje pliki zmienione od <desired-commit-id>
. Jeśli użyjesz opcji --hard
, git status
powie Ci, że Twoja lokalna gałąź jest dokładnie taka sama jak zdalna. Jeśli nie używasz --hard
ani --soft
, używany jest domyślny tryb --mixed
. W tym trybie git help reset
mówi:
Resetuje indeks, ale nie drzewo robocze (tzn. zmienione pliki są zachowane, ale nie oznaczone dla commit) i zgłasza to, co nie zostało aktualizacja.
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
2019-12-11 07:37:02
Uproszczenie z odpowiedzi pctrolla, podobnie na podstawie tego posta na blogu .
# look up the commit id in git log or on github, e.g. 42480f3, then do
git checkout master
git checkout your_branch
git revert 42480f3
# a text editor will open, close it with ctrl+x (editor dependent)
git push origin your_branch
# or replace origin with your remote
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-04-23 16:07:44
To może być za mało za późno, ale to, co mi pomogło, to fajnie brzmiąca opcja "nuklearna". Zasadniczo używając polecenia filter-branch
możesz usunąć pliki lub zmienić coś na dużej liczbie plików w całej historii Gita.
Najlepiej wyjaśnić tutaj .
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
2019-04-10 20:18:28
Czasami najprostszym sposobem na naprawienie tego problemu jest utworzenie nowej gałęzi z miejsca, w którym wiesz, że kod jest dobry. Wtedy możesz zostawić historię błędnej gałęzi w spokoju na wypadek, gdybyś musiał później wybrać inne commity z niej. Gwarantuje to również, że nie utracisz historii zatwierdzeń.
Z lokalnego oddziału:
git log
Skopiuj hash zatwierdzania, w którym chcesz być branch i zakończ dziennik Git
git checkout theHashYouJustCopied
git checkout -b your_new_awesome_branch
Teraz masz nową gałąź tak, jak chcesz to.
Jeśli potrzebujesz również zachować konkretny commit z błędnej gałęzi, która nie znajduje się w nowej gałęzi, możesz po prostu wybrać konkretny commit, którego potrzebujesz:
git checkout the_errant_branch
git log
Skopiuj hash commita jednego z commitów, który musisz pobrać do dobrej gałęzi i zamknąć dziennik git.
git checkout your_new_awesome_branch
git cherry-pick theHashYouJustCopied
Poklep się po plecach.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-11-05 14:19:53
git reset --soft commit_id
git stash save "message"
git reset --hard commit_id
git stash apply stash stash@{0}
git push --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
2018-03-22 06:58:07