Obecnie pracuję dla firmy, która używa VSTS do zarządzania kodem git. „Zalecanym” sposobem scalania oddziału przez Microsoft jest „scalenie squasha”, co oznacza, że wszystkie zatwierdzenia dla tego oddziału zostają zgniecione w jednym nowym zatwierdzeniu zawierającym wszystkie zmiany.
Problem polega na tym, że jeśli zrobię jakieś zmiany w jednej gałęzi dla jednego elementu zaległości, to od razu chcę zacząć robić zmiany w innej gałęzi dla innego elementu zaległości, a zmiany te zależą od zestawu zmian pierwszego oddziału?
Mogę utworzyć gałąź dla tego elementu zaległości i oprzeć ją na pierwszej gałęzi. Jak na razie dobrze. Jednak, gdy nadchodzi czas, aby utworzyć żądanie ściągnięcia dla mnie drugiej gałęzi, pierwsza gałąź została już scalona w master, a ponieważ została wykonana jako scalenie squasha, git oznacza kilka konfliktów. Dzieje się tak, ponieważ git nie widzi oryginalnych zatwierdzeń, na podstawie których powstała druga gałąź, po prostu widzi jedno duże scalenie squasha, więc aby połączyć drugą gałąź w celu opanowania, próbuje odtworzyć wszystkie zatwierdzenia pierwszej gałęzi w top squash scala, powodując wiele konfliktów.
Więc moje pytanie brzmi: czy jest jakiś sposób na obejście tego (oprócz tego, że nigdy nie opieram jednej gałęzi funkcji na innej, co ogranicza mój przepływ pracy), czy też łączenie squash'a po prostu łamie algorytm scalania gita?
feature1
mistrzem, a następnie zechcesz połączyćfeature2
później. W takim przypadku, czy pierwsze podejście nie doprowadziłoby do konfliktów, ponieważ git próbuje ponownie zastosowaćfeature1
zatwierdzenia na zgniecionym zatwierdzeniu, podczas gdy drugie pozwoliłoby gitowi ustalić, że te zatwierdzenia nie muszą być scalane?git clone
repozytorium i skopiowanie moich zmienionych plików!), Ponieważ rozgałęziłem się z gałęzi, a następnie opiekun zgniótł pierwszą gałąź. W mojej pracy zajmują się także łączeniem squasha. Oznacza to, że nie mogę pracować nad funkcjąb
zależną od funkcji,a
dopóki funkcja niea
zostanie scalona.Scalanie squasha przerywa algorytm scalania dla wszystkich gałęzi, które zawierają zatwierdzenia usunięte przez squasha. Innymi słowy, bazy są wirusowe. Jeśli dokonujesz zmiany podstawy jednej gałęzi, musisz zmienić podstawę wszystkich innych gałęzi zależnych od tej gałęzi. Jeśli użyjesz rerere , wszelkie konflikty scalania rozwiązane ręcznie w lokalnym repozytorium nie będą musiały być rozwiązywane ręcznie, ale to nie pomaga w przypadku konfliktów rozwiązanych przez inne osoby.
Właśnie dlatego naszą niepisaną zasadą jest, że można zgnieść, dopóki nikt inny nie będzie zależał od twojej gałęzi funkcji, co może mieć miejsce w 90% przypadków. W przeciwnym razie proste scalenie pomaga wszystkim uniknąć problemów.
źródło
feature-xyz
oddział. Możesz utworzyćfeature-xyz-squashed
gałąź rozpoczynającą się od tego samego zatwierdzenia cofeature-xyz
gałąź,git cherry-pick
zatwierdzenia odfeature-xyz
dofeature-xyz-squashed
, zgnieść je tam i scalićfeature-xyz-squashed
zmaster
. Nie powinieneśfeature-xyz
wtedy się łączyć . Czasami powyższe ma sens (np. Nie chcesz dołączać zatwierdzeń z hasłem), ale jest to obejście, które nie jest najlepszą praktyką.