Czy istnieje sposób na ponowne scalenie git?

17

Więc popełniłem całkiem duży błąd. Zrobiłem zatwierdzenie, wyciągnąłem, scaliłem (ale pomieszałem kod, robiąc to), a następnie wypchnąłem. Chciałbym powtórzyć to scalenie i poprawić kod. Czy jest na to sposób?

Używam bitbucket.


źródło
10
Tylko uwaga - w rzeczywistości jest to temat na SO i nie powinien był być migrowany. Spróbuj kiedyś przeczytać własne strony pomocy i zwróć uwagę na narzędzia programowe powszechnie używane przez linię programistów . To powiedziawszy, jest tu również temat - SwiftCore, nie przejmuj się, że został migrowany, to nie była twoja wina.
Bob

Odpowiedzi:

13

Nie jestem pewien, czy jest to „błogosławiony” sposób, aby to zrobić, ale oto, co zrobiłem, aby rozwiązać ten sam problem bez konieczności „forsowania” lub czegoś w tym rodzaju rażącego.

Załóżmy, że twoja historia wygląda mniej więcej tak (a M to flubbed merge):

-A--B--C--M (master points here)
  \      /
   D----E

Uruchomienie git checkout -b merge_fix <commit ID E>tworzy gałąź, zanim popełnimy jakiekolwiek błędy:

-A--B--C--M (master points here)
  \      /
   D----E (HEAD and merge_fix point here)

Teraz zróbmy ponownie scalenie w naszym nowym oddziale. Nie możemy się po prostu scalić master, więc musimy ręcznie wybrać zatwierdzenie przed naszym złym scaleniem: git merge <commit ID C>Nie popełniaj tych samych błędów, które popełniłeś ostatnim razem!

-A--B--C--M (master points here)
  \      X
   D----E-G (HEAD and merge_fix point here)

Zakładając, że zatwierdzenie Gwygląda dobrze, teraz chcemy zsynchronizować się z wierzchołkiem mastergałęzi. To polecenie mówi gitowi, aby zignorował zmiany wprowadzone w celu opanowania i zmusił nasze zmiany, aby stały się wynikiem scalenia:git merge -s ours master

-A--B--C--M (master points here)
  \      X  \
   D----E-G--H (HEAD and merge_fix point here)

Wreszcie (ponownie zakładając, że zatwierdzanie Hwygląda dobrze, chcemy przewinąć do przodu, masteraby uwzględnić nasze stałe scalanie:

git checkout master
git merge merge_fix

To tak naprawdę przesuwa masterwskaźnik gałęzi H, ale skorzystam z okazji, aby trochę wyczyścić moją grafikę ASCII:

-A--B--C--M--H (HEAD, master, and merge_fix all point here)
  \      X  /
   D----E--G

I masz to! pomyślnie wykonałeś scalenie bez unieważniania historii!

mblythe
źródło
6

Możesz to zrobić w następujący sposób:

  1. Zresetuj do zatwierdzenia przed scaleniem.
  2. Wykonaj scalenie ponownie
  3. Force push

To jest:

git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname

Pamiętaj tylko, że git push --forceprzepisze wszystko, co miałeś w zdalnym oddziale, a inne osoby korzystające z tego oddziału również mogą mieć na to wpływ. (Zwykle nie powinieneś tego robić.)

janos
źródło
6
Pamiętaj tylko, że robienie git push --forcenie jest bezpieczne
Zepplock,
1

git merge --abort i wtedy możesz ponownie połączyć

Zepplock
źródło
Po prostu pojawia się komunikat „Nie ma
3
Można to zrobić tylko wtedy, gdy występują konflikty scalania.
chanchal118
dlaczego minus jeden? to mi pomogło.
swdev
Ponieważ pytanie dotyczy tego, kiedy już zakończyłeś scalanie (niepoprawnie) i pchnąłeś.
Robin Green,
-1

Sprawdź tę nadzieję, że jest dla Ciebie przydatna

https://www.kernel.org/pub/software/scm/git/docs/howto/revert-branch-rebase.html

źródło
Chociaż może to odpowiedzieć na pytanie OP, odpowiedzi tylko na link nie są dobrze akceptowane w SO. Możesz jednak podać w odpowiedzi najistotniejsze fragmenty linku.
Chociaż ten link może odpowiedzieć na pytanie, lepiej dołączyć tutaj istotne części odpowiedzi i podać link w celach informacyjnych. Odpowiedzi zawierające tylko łącze mogą stać się nieprawidłowe, jeśli połączona strona ulegnie zmianie.
Pranav