Wyobraź sobie, że dzieje się tak (i że wszyscy używamy SourceTree):
- Wszyscy pracujemy nad pochodzeniem / rozwojem.
- Wyjeżdżam na tydzień na wakacje.
- Mój współpracownik od kilku dni pracuje lokalnie, nie łącząc źródła / rozwoju z powrotem z lokalnym oddziałem deweloperskim.
- Próbuje wykonać push, zostaje poinformowany, że najpierw musi się połączyć, a następnie wykonuje pull.
- Dostaje konflikt, uniemożliwiając kontynuowanie automatycznego zatwierdzania po scaleniu.
- Zakładając, że Git jest jak SVN, mój współpracownik odrzuca „nowe” pliki w swojej kopii roboczej, a następnie dokonuje scalenia - usuwając te „nowe” pliki z głowy źródła / develop.
- Po tej rewizji trwa tygodniowa praca deweloperów.
- Wracam z wakacji i dowiaduję się, że brakuje kilku dni mojej pracy.
Wszyscy jesteśmy bardzo nowi w Git (jest to nasz pierwszy projekt, w którym go używamy), ale zrobiłem to, aby to naprawić:
- Zmień nazwę „develop” na „develop_old”.
- Scal develop_old w nowy oddział „develop_new”.
- Zresetuj gałąź develop_new do ostatniego zatwierdzenia przed złym scaleniem.
- Cherry wybiera odtąd każde zatwierdzenie, jeden po drugim, ręcznie rozwiązując konflikty.
- Wciśnij develop_old i develop_new do źródła.
W tym momencie develop_new jest, mam nadzieję, „dobrą” kopią wszystkich naszych zmian, które zostały ponownie zastosowane w kolejnych tygodniach. Zakładam również, że „odwrotne zatwierdzanie” będzie działało dziwnie podczas scalania, zwłaszcza że na nim opiera się praca na kilka następnych tygodni - a ponieważ scalanie zawiera wiele rzeczy, których chcemy, wraz z rzeczami, których nie robimy ” t.
Mam nadzieję, że to się nigdy więcej nie powtórzy, ale jeśli to się powtórzy, chciałbym wiedzieć o łatwiejszym / lepszym sposobie naprawiania rzeczy. Czy istnieje lepszy sposób na cofnięcie „złego” scalenia, gdy w repozytorium opartym na tym scaleniu wykonano wiele pracy?
git log
formatu z odpowiednimi adnotacjami o tym, co wydarzyło się przy różnych zatwierdzeniach? (Zredagowałem / dodałem adnotacjęgit log --graph --pretty=oneline --abbrev-commit
i stamtąd stamtąd)Odpowiedzi:
Jeśli dobrze zrozumiałem, to twoja sytuacja:
Po wspólnej historii (o) popełniłeś i popchnąłeś swoją pracę (y). Twój współpracownik (c) pracował nad swoim lokalnym repozytorium i wykonał złe połączenie (M). Następnie mogą pojawić się dodatkowe zatwierdzenia (a) na M.
Teraz twój wykres wygląda dokładnie tak, jak przed złym scaleniem:
Wykonaj dobre scalenie (G):
Wynikające z:
Teraz przeszczep dodatkowe zatwierdzenia:
To daje końcowy wynik:
Należy pamiętać, że może to spowodować więcej konfliktów scalania. Właśnie zmieniłeś historię, tzn. Wszyscy twoi współpracownicy powinni sklonować / zresetować / zmienić bazę na nową historię.
PS: Oczywiście należy wymienić
G
,M
aX
w twoich poleceń przez odpowiedni popełnić id.źródło
Dobrze, że zastanawiasz się, jak naprawić repozytorium, ale jeśli współpracownik usunął tylko nowe pliki i nie zastąpił wielu aktualizacji, znacznie prostszym podejściem byłoby po prostu przywrócenie usuniętych plików.
Prawdopodobnie zacznę od próby wybrania (do bieżącej głowy) oryginalnych zatwierdzeń, w których dodałeś kod, który teraz zaginął. Jeśli z jakiegoś powodu to nie zadziała, po prostu sprawdź starą wersję z dodanymi plikami i dodaj je ponownie w nowym zatwierdzeniu.
To, co opisujesz, jest właściwie podzbiorem znanego anty-wzorca Git, którego przez całe życie nie pamiętam nazwy - ale jego sedno polega na dokonywaniu jakichkolwiek „ręcznych zmian” podczas scalania Git (tj. Edycji) które w rzeczywistości nie rozwiązują żadnych konfliktów scalania, ale wprowadzają jakieś całkowicie niezwiązane ze sobą zmiany) jest uważane za wyjątkowo złą praktykę, ponieważ są one zasadniczo maskowane przez samo scalanie i łatwo można je przeoczyć w przeglądach kodu lub sesjach debugowania.
Zdecydowanie więc wytłumacz swojemu współpracownikowi, że to była epicka porażka, ale zastanów się nad uderzeniem opaski przed przygotowaniem się do poważnej operacji.
źródło