Jak usunąć zatwierdzenia z żądania ściągnięcia


114

Zrobiłem żądanie ściągnięcia, ale potem wykonałem kilka zatwierdzeń projektu lokalnie, co zakończyło się zanieczyszczeniem mojego żądania ściągnięcia, próbowałem go usunąć, ale bez powodzenia.

Znalazłem kilka podobnych pytań w StackOverflow, ale nie mogę zastosować tego, co tam jest. To moja pierwsza prośba o ściągnięcie na GitHubie, więc jest dla mnie trochę dziwne, jak to wszystko działa.

Podświetlone zatwierdzenie jest tym, które muszę zachować i usunąć wszystkie inne rzeczy. Staje się czwartym zatwierdzeniem w historii, ponieważ robię kilka rzeczy do scalania.

wprowadź opis obrazu tutaj

mój dziennik git wprowadź opis obrazu tutaj

Czy ktoś może wyjaśnić, co się dzieje i jak rozwiązać ten problem?


2
Musisz zmienić bazę i tylko "wybrać" zatwierdzenie "dodane z github" (tj. Zakomentować linie dla każdego innego zatwierdzenia)
Robbie Averill

1
ponownie oprzyj jaką gałąź na którą gałąź możesz dodać więcej wyjaśnień.
humazed

what branch= gałąź, nad którą pracujesz, onto what branch= gałąź, do której ściągasz żądanie
Robbie Averill

Wyjaśniłem, co @Robbie Averill zasugerował w mojej odpowiedzi. To dziwne, że do tej pory nikt nie napisał odpowiedzi wyjaśniającej to.
ferit

Odpowiedzi:


112

Masz na to kilka technik.

Ten post - przeczytaj część o przywracaniu , wyjaśni szczegółowo, co chcemy zrobić i jak to zrobić.

Oto najprostsze rozwiązanie Twojego problemu:

# Checkout the desired branch
git checkout <branch>

# Undo the desired commit
git revert <commit>

# Update the remote with the undo of the code
git push origin <branch>

Polecenie revert utworzy nowe zatwierdzenie z cofnięciem pierwotnego zatwierdzenia.


2
Czy to działa nawet wtedy, gdy rozwidliliśmy projekt od innej osoby i chcemy usunąć niektóre komentarze w żądaniu ściągnięcia?
Dr Jacky,

121

Ludzie nie chcieliby widzieć niewłaściwego zatwierdzenia i cofnięcia zobowiązania, aby cofnąć zmiany niewłaściwego zatwierdzenia. To zanieczyszcza historię.

Oto prosty sposób na usunięcie niewłaściwego zatwierdzenia zamiast cofania zmian za pomocą rewizji zatwierdzenia.

  1. git checkout my-pull-request-branch

  2. git rebase -i HEAD~n// gdzie nto liczba ostatnich zatwierdzeń, które chcesz uwzględnić w interaktywnym rebase.

  3. Zastąp pickw dropprzypadku zatwierdzeń, które chcesz odrzucić.
  4. Zapisz i wyjdź.
  5. git push --force

8
to działało na mnie jak urok. Miałem kilka zatwierdzeń, których nie powinno być w PR. Po prostu interaktywnie zmieniłem bazę, porzuciłem te zatwierdzenia i odrzuciłem je z powrotem
FullStackEngineer

5
Pchnąć musiałem zrobić: git push origin HEAD:myBranch --force. Ale poza tym świetny i pomocny.
ScottyBlades

4
Jest to również przydatne, gdy chcesz naprawić otwarty PR w GitHubie, po prostu musisz być w stanie wykonać wymuszony push
Vladimir Hidalgo

2
Co masz na myśli przez „Zamień pickz dropza zobowiązuje chcesz odrzucić.”?
jorijnsmit

2
@jorijnsmit mają na myśli po uruchomieniu git rebase -i HEAD~<n>, na górze pliku będą <n>wiersze zatwierdzeń, z każdą linią zawierającą tekst pick <commit id>. Commits mają domyślnie wartość pick, więc dla każdego zatwierdzenia, które chcesz usunąć, zmień tekst picknadrop
Slim

6

Jeśli usuwasz zatwierdzenie i nie chcesz zachować jego zmian, @ferit ma dobre rozwiązanie.

Jeśli chcesz dodać to zatwierdzenie do bieżącej gałęzi, ale nie ma sensu być częścią bieżącej pr, możesz zamiast tego wykonać następujące czynności:

  1. posługiwać się git rebase -i HEAD~n
  2. Zamień zatwierdzenie, które chcesz usunąć, na dolną (ostatnią) pozycję
  3. Zapisz i wyjdź
  4. użyj, git reset HEAD^ --softaby cofnąć zatwierdzenie zmian i przywrócić je do stanu etapowego.
  5. użyj, git push --forceaby zaktualizować zdalną gałąź bez usuniętego zatwierdzenia.

Teraz usunąłeś zatwierdzenie ze swojego pilota, ale nadal będziesz mieć zmiany lokalnie.


2

Więc wykonaj następujące czynności,

Powiedzmy, że nazwa twojej gałęzi to my_branch i zawiera dodatkowe zatwierdzenia.

  1. git checkout -b my_branch_with_extra_commits (Zachowanie tej gałęzi pod inną nazwą)
  2. gitk (Otwiera konsolę git)
  3. Poszukaj zobowiązania, którego chcesz dotrzymać. Skopiuj SHA tego zatwierdzenia do notatnika.
  4. git checkout my_branch
  5. gitk (Spowoduje to otwarcie konsoli git)
  6. Kliknij prawym przyciskiem zatwierdzenie, do którego chcesz powrócić (Stan sprzed zmian) i kliknij „ reset branch to here
  7. Zrób git pull --rebase origin branch_name_to _merge_to
  8. git cherry-pick <SHA you copied in step 3. >

Teraz spójrz na historię zatwierdzeń lokalnego oddziału i upewnij się, że wszystko wygląda dobrze.


0

To mi pomogło:

  1. Utwórz nowy oddział z istniejącym. Nazwijmy istniejący branch_oldi nowy jako branch_new.

  2. Zresetuj branch_newdo stabilnego stanu, gdy nie miałeś żadnego problemu z zatwierdzeniem. Na przykład, aby umieścić go na poziomie lokalnego mistrza, wykonaj następujące czynności:

    git reset - hard master git push - force origin

  3. cherry-pickzatwierdzenia z branch_olddobranch_new

  4. git push
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.