Pozwól, że odpowiem bezpośrednio na twoje pytania:
Nasz problem dotyczy długoterminowych odgałęzień - w przypadku, gdy kilka osób pracuje nad odgałęzieniem, które dzieli się od mistrza, rozwijamy się przez kilka miesięcy, a kiedy osiągamy kamień milowy, synchronizujemy oba.
Zwykle nie chcesz, aby Twoje oddziały były niezsynchronizowane przez miesiące.
Twoja gałąź funkcji rozgałęziła się na czymś w zależności od przepływu pracy; nazwijmy to master
dla uproszczenia. Teraz, ilekroć zobowiązujesz się do opanowania, możesz i powinieneś git checkout long_running_feature ; git rebase master
. Oznacza to, że Twoje gałęzie są z założenia zawsze zsynchronizowane.
git rebase
jest również właściwe do zrobienia tutaj. To nie jest hack ani coś dziwnego lub niebezpiecznego, ale całkowicie naturalne. Tracisz jeden kawałek informacji, który jest „urodziny” gałęzi funkcji, ale to wszystko. Jeśli ktoś uważa, że jest to ważne, można to zrobić, zapisując go gdzie indziej (w systemie biletów lub, jeśli potrzeba jest duża, w git tag
...).
Teraz, IMHO, naturalnym sposobem na poradzenie sobie z tym, jest zgniecenie bocznego oddziału w jednym zatwierdzeniu.
Nie, absolutnie tego nie chcesz, chcesz zatwierdzić scalenie. Scal zatwierdzenie jest również „pojedynczym zatwierdzeniem”. W jakiś sposób nie wstawia on wszystkich pojedynczych zatwierdzeń gałęzi „do” wzorca. Jest to pojedyncze zatwierdzenie z dwojgiem rodziców - master
szefem i szefem oddziału w momencie scalenia.
Oczywiście należy podać --no-ff
opcję; łączenie bez --no-ff
powinno być w twoim scenariuszu surowo zabronione. Niestety --no-ff
nie jest domyślny; ale wierzę, że istnieje możliwość ustawienia tej opcji. Zobacz, git help merge
co --no-ff
robi (krótko: aktywuje zachowanie, które opisałem w poprzednim akapicie), jest kluczowe.
nie wrzucamy z mocą wsteczną miesięcy równoległego rozwoju do historii mistrza.
Absolutnie nie - nigdy nie wrzucasz czegoś „do historii” jakiegoś oddziału, szczególnie nie z zatwierdzeniem scalania.
A jeśli ktoś potrzebuje lepszej rozdzielczości dla historii sidebranch, cóż, oczywiście, że wciąż tam jest - po prostu nie ma go, jest w sidebranch.
Z zatwierdzeniem scalania nadal tam jest. Nie w mistrzu, ale w bocznym odgałęzieniu, wyraźnie widoczne jako jedno z rodziców fuzji popełnienia i zachowane na wieczność, jak powinno być.
Widzisz co zrobiłem? Wszystkie rzeczy, które opisujesz dla swojego zatwierdzenia do squasha, znajdują się tutaj wraz z --no-ff
zatwierdzeniem przez scalenie .
Oto problem: pracuję wyłącznie z linii poleceń, ale reszta mojego zespołu używa GUIS.
(Uwaga boczna: prawie wyłącznie pracuję również z linią poleceń (cóż, to kłamstwo, zwykle używam emacs magit, ale to inna historia - jeśli nie jestem w dogodnym miejscu z moją indywidualną konfiguracją emacsa, wolę polecenie linii)). Ale wyświadcz sobie przysługę i spróbuj przynajmniej git gui
raz. Jest o wiele bardziej wydajny w przypadku wybierania linii, kawałków itp. w celu dodawania / cofania dodawania.)
Odkryłem, że GUIS nie ma rozsądnej opcji wyświetlania historii z innych gałęzi.
Jest tak, ponieważ to, co próbujesz zrobić, jest całkowicie sprzeczne z duchem git
. git
opiera się na rdzeniu na „ukierunkowanym wykresie acyklicznym”, co oznacza, że wiele informacji dotyczy relacji między rodzicem a dzieckiem. A w przypadku fuzji oznacza to, że prawdziwa fuzja jest zgodna z dwojgiem rodziców i jednym dzieckiem. GUI twoich współpracowników będą w porządku, jak tylko użyjesz no-ff
zatwierdzeń scalania.
Więc jeśli dojdziesz do zatwierdzenia squasha, mówiąc: „ten rozwój zgnieciony z gałęzi XYZ”, ogromnym problemem jest zobaczyć, co jest w XYZ.
Tak, ale to nie jest problem z GUI, ale z zatwierdzaniem squasha. Użycie squasha oznacza, że pozostawiasz zwisającą głowę gałęzi funkcji i tworzysz zupełnie nowe zatwierdzenie master
. To łamie strukturę na dwóch poziomach, tworząc wielki bałagan.
Dlatego chcą, aby te duże, długie gałęzie rozwoju zostały połączone, zawsze z zatwierdzeniem scalania.
I mają absolutną rację. Ale oni nie są „połączone w ”, są po prostu połączone. Scalanie jest naprawdę zrównoważoną rzeczą, nie ma preferowanej strony, która byłaby scalona „w” drugą stronę ( git checkout A ; git merge B
jest dokładnie taka sama, jak git checkout B ; git merge A
z wyjątkiem drobnych różnic wizualnych, takich jak zamiana gałęzi git log
itp.).
Nie chcą żadnej historii, która nie byłaby natychmiast dostępna z gałęzi master.
Co jest całkowicie poprawne. W czasie, gdy nie ma żadnych połączonych funkcji, miałbyś jedną gałąź master
z bogatą historią, obejmującą wszystkie linie zatwierdzania cech, jakie kiedykolwiek istniały, wracając do git init
zatwierdzenia od samego początku (zauważ, że specjalnie unikałem używania terminu „ gałęzie ”w drugiej części tego akapitu, ponieważ historia w tym czasie nie jest już„ gałęziami ”, chociaż wykres zatwierdzania byłby dość rozgałęziony).
Nienawidzę tego pomysłu;
Masz trochę bólu, ponieważ pracujesz przeciwko używanemu narzędziu. git
Podejście jest bardzo elegancki i wydajny, zwłaszcza w obszarze / łączących rozgałęzienia; jeśli zrobisz to dobrze (jak wspomniano powyżej, szczególnie z --no-ff
), to przeskakuje i ogranicza się do innych podejść (np. bałagan wywrotowy posiadania równoległych struktur katalogów dla gałęzi).
oznacza niekończącą się, nieuchronną plątaninę równoległej historii rozwoju.
Niekończące się, równoległe - tak.
Niemożliwe, plątanina - nie.
Ale nie widzę, jaką mamy alternatywę.
Dlaczego nie działa tak jak wynalazca git
, twoi koledzy i reszta świata, każdego dnia?
Czy mamy tutaj jakąś opcję oprócz ciągłego łączenia oddziałów bocznych w master z scalaniem-zatwierdzeniami? A może istnieje powód, dla którego ciągłe używanie zatwierdzeń scalania nie jest tak złe, jak się obawiam?
Brak innych opcji; nie tak źle.