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.
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.
Odpowiedzi:
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 G
wygląda dobrze, teraz chcemy zsynchronizować się z wierzchołkiem master
gałę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 H
wygląda dobrze, chcemy przewinąć do przodu, master
aby uwzględnić nasze stałe scalanie:
git checkout master
git merge merge_fix
To tak naprawdę przesuwa master
wskaź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!
Możesz to zrobić w następujący sposób:
To jest:
git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname
Pamiętaj tylko, że git push --force
przepisze 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ć.)
git push --force
nie jest bezpieczne
git merge --abort
i wtedy możesz ponownie połączyć
Sprawdź tę nadzieję, że jest dla Ciebie przydatna
https://www.kernel.org/pub/software/scm/git/docs/howto/revert-branch-rebase.html