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?

 587
git
Author: Paolo Forgia, 2010-07-20

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>
 427
Author: VonC,
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
 323
Author: hd84335,
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.

  1. Przywróć pełny commit
  2. Usuń ostatni commit
  3. 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
 152
Author: reefaktor,
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.

 57
Author: Abdollah,
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
 11
Author: ted.strauss,
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 .

 11
Author: jansmolders86,
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.
 4
Author: Douglas.Sesar,
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
 0
Author: pandorago,
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