2012-12-11 9 views
35

Po wykonaniu git rebase branch1 w moim pojawia się konflikt. Rozwiązuję konflikt, robię git add <conflicted-add>, a następnie robię git rebase --continue, tak jak prosi mnie git. Następnie stosuje się nowe zatwierdzenie. Pojawia się nowy konflikt. Ale znowu ten sam konflikt! ten sam plik !. Zrobię to ponownie, git add, git rebase --continue, a następnie wszystko się powtarza, dopóki nie powtórzę tego dla każdego ponownego zatwierdzania.Dlaczego muszę rozwiązywać ten sam konflikt w kółko?

Dlaczego rebase wymaga ponownego powtarzania tego samego rozwiązania konfliktu?

+1

Nigdy go nie używałem, ledwie czytałem jego dokumentację, ale spójrz na 'git rerere', AFAIK jest używany do" nagrywania "rozwiązywania konfliktów i unikania ich powtarzania. Spójrz na http://stackoverflow.com/q/5519244/236871 dla zwykłych pluginów tej funkcji. – KurzedMetal

+0

Czy kiedykolwiek zastanawiałeś się, dlaczego tak się stało? Miałem inne osoby zgłaszające to samo i chciałbym móc zrekonstruować taką sytuację, w której muszę stosować * dokładnie taką samą rozdzielczość konfliktu * kilka razy podczas rebase. – Christoph

+1

tak, rozwiązaniem było, aby nigdy * nigdy * nie używać ponownie 'rebase'. 'pull',' merge' i rozstrzygnięcie 'add' to wszystko, czego powinieneś potrzebować. – lurscher

Odpowiedz

10

To, czego potrzebujesz, to git rerere, które rejestruje dla Ciebie rozwiązania konfliktów. Najlepszy wstęp do tego, co widziałem, to from this blog article. W praktyce, gdy wykonasz rebase, skończysz jak poprzednio, ale musisz tylko sprawdzić, czy konflikt z połączeniem pozostaje niezmieniony, a następnie kontynuować.

0

Nie powinieneś ciągle powtarzać tego samego konfliktu. Rerere nie pomoże ci tutaj. Oznacza to po prostu, że kod bazowy, który próbujesz powtórzyć, zatwierdza, jest tak różny, że każde zatwierdzenie wymaga twojej pomocy w dostosowaniu. Jest to jeden z powodów faworyzowania scalania przez rebase. Rebase powinno być używane tylko w razie potrzeby i nie jest częścią zwykłego przepływu pracy. Rerere pomoże znacznie więcej w przepływie pracy typu scalanie/reset. Oto mój przepływ pracy, w którym unika się zmiany nazwy: http://dymitruk.com/blog/2012/02/05/branch-per-feature/

Jednym ze sposobów na złagodzenie bólu jest zastosowanie programu inteligentnego łączenia, takiego jak Beyond Compare. Jest świadomy składni i rozwiąże kilka konfliktów, które Git (słusznie) odmówi dla ciebie. Wiele razy te narzędzia, gdy się je wywoła, nie będą nawet mogły otworzyć swojego interfejsu użytkownika, rozwiązać problemu i zezwolić na wykonanie polecenia git mergetool, aby przejść do następnego konfliktu. Pamiętaj, aby ustawić "zaufany kod wyjścia mergetool" na true.

+1

dla rekordu, ja osobiście faworyzuję scalenie (użyłem go z powodzeniem w innych projektach nie tyle z powodu usterki), ale ten nowy zespół chce użyć rebase, ponieważ sprawia, że ​​drzewo scalania wygląda "bardziej", a Bóg wie, że brzydko wyglądające drzewo bije, ustalając konflikt tylko raz (szczególnie, gdy prowadzący, który chce spojrzeć na czyste drzewa, sam nie rozwiązuje konfliktu) – lurscher

+0

To szkoda. Zwykle ludzie nowi na git, którzy pochodzą z SVN, gdzie unikano rozgałęziania się i łączenia, tak jak zaraza chce schludnej historii. Moc git polega na sprawdzeniu wykresu (DAG), aby zobaczyć, co zostało lub nie zostało jeszcze połączone w gałąź zainteresowań. Najlepszym rozwiązaniem jest pozwolić im cierpieć przez wszystkie rozwiązania konfliktu, a następnie zasugerować, aby wypróbować przepływ pracy, który nie opiera się na rebase, aby utrzymać porządek. Mój przepływ pracy utrzymuje porządek. Zobacz, czy jedna lub dwie z nich przeczytają mój post. Powinienem napisać inny post adresujący to. –

+0

Chciałbym, ale cierpienie wynikające z rozwiązania konfliktu będzie nade mną. Ale postaram się uczynić pewne poparcie dla scalenia. dzięki! – lurscher

Powiązane problemy