Rozwidliłem gałąź z repozytorium w GitHub i popełniłem coś konkretnego dla mnie. Teraz stwierdziłem, że oryginalne repozytorium miało dobrą funkcję, która była dostępna HEAD
.
Chcę scalić to tylko bez wcześniejszych zatwierdzeń. Co powinienem zrobić? Wiem, jak scalić wszystkie zatwierdzenia:
git branch -b a-good-feature
git pull repository master
git checkout master
git merge a-good-feature
git commit -a
git push
Odpowiedzi:
„
git cherry-pick
” Powinna być odpowiedź tutaj.Nie zapomnij przeczytać odpowiedzi Bdonlana na temat konsekwencji wybrania cherry w tym poście:
„Wyciągnij wszystkie zatwierdzenia z gałęzi, wypchnij określone zatwierdzenia do innego” , gdzie:
staje się:
źródło
Możesz użyć polecenia git cherry-pick, aby zastosować pojedynczy zatwierdzenie do bieżącej gałęzi.
Przykład:
git cherry-pick d42c389f
źródło
git cherry-pick d42c
lubgit cherry-pick d42c3
zadziała. Git jest mądry. ;)d42c389f
. Być może OP nie dbał o samo połączenie , ale czasami różnica ma znaczenie.Spróbujmy wziąć przykład i zrozumieć:
Mam gałąź, powiedzmy master , wskazującą na X <commit-id> i mam nową gałąź wskazującą na Y <sha1>.
Gdzie Y <commit-id> = <master> oddział zatwierdza - niewiele zatwierdzeń
Powiedzmy teraz, że dla gałęzi Y muszę zamknąć odstępy między gałęzią główną i nową gałęzią. Poniżej znajduje się procedura, którą możemy wykonać:
Krok 1:
gdzie local to nazwa oddziału. Można podać dowolne imię.
Krok 2:
Scal zatwierdzenia z gałęzi głównej do nowej gałęzi, a także utwórz zatwierdzenie scalania komunikatu dziennika z opisami jednowierszowymi co najwyżej <n> rzeczywistych zatwierdzeń, które są scalane.
Aby uzyskać więcej informacji i parametrów dotyczących scalania Git, zobacz:
Również jeśli chcesz scalić określone zatwierdzenie, możesz użyć:
źródło
Y
zdania 3d? „Mam nową gałąź wskazującą na Y” vs „Teraz powiedzmy, że dla gałęzi Y”, brzmi to tak, jakby Y było zatwierdzeniem, a potem stało się gałęziąW moim przypadku mieliśmy podobne zapotrzebowanie na CI CD. Użyliśmy git flow z gałęziami developerskimi i master. Programiści mogą łączyć tam zmiany bezpośrednio w celu opracowania lub poprzez żądanie ściągnięcia z gałęzi funkcji. Jednak, aby opanować, łączymy tylko stabilne zatwierdzenia z gałęzi programistycznej w sposób zautomatyzowany za pośrednictwem Jenkins.
W takim przypadku robienie czereśni nie jest dobrym rozwiązaniem. Jednak tworzymy gałąź lokalną z identyfikatora zatwierdzenia, a następnie łączymy gałąź lokalną z master i wykonujemy mvn clean Verify (używamy maven). Jeśli sukces się powiedzie, wypuść artefakt wersji produkcyjnej do nexusa za pomocą wtyczki maven release z opcją localCheckout = true i pushChanges = false. Wreszcie, gdy wszystko się powiedzie, przesuń zmiany i oznacz do źródła.
Przykładowy fragment kodu:
Zakładając, że jesteś mistrzem, jeśli wykonujesz to ręcznie. Jednak w przypadku Jenkinsa, gdy kasujesz repozytorium, będziesz w domyślnej gałęzi (master, jeśli skonfigurowano).
To da ci pełną kontrolę dzięki nieustraszonemu połączeniu piekła lub konfliktu.
Nie wahaj się doradzić, jeśli jest jakaś lepsza opcja.
źródło
Wiodące odpowiedzi opisują, jak zastosować zmiany z konkretnego zatwierdzenia do bieżącej gałęzi. Jeśli to rozumiesz przez „jak połączyć”, po prostu użyj cherry-pick, jak sugerują.
Ale jeśli naprawdę chcesz scalenia , tj. Chcesz nowego zatwierdzenia z dwoma rodzicami - istniejącego zatwierdzenia w bieżącej gałęzi i zatwierdzenia, od którego chciałeś zastosować zmiany - wtedy nie da się tego osiągnąć.
Posiadanie prawdziwej historii scalania może być pożądane, na przykład, jeśli proces kompilacji korzysta z przodków git do automatycznego ustawiania ciągów wersji na podstawie najnowszego znacznika (za pomocą
git describe
).Zamiast wybierania „wiśniowego” możesz wykonać rzeczywistą
git merge --no-commit
, a następnie ręcznie dostosować indeks, aby usunąć wszelkie niepożądane zmiany.Załóżmy, że jesteś na gałęzi
A
i chcesz scalić zatwierdzenie na końcu gałęziB
:Teraz masz skonfigurowane zatwierdzenie z dwojgiem rodziców, aktualny typ zatwierdzeń
A
iB
. Możesz jednak zastosować więcej zmian, niż chcesz, w tym zmiany wcześniejszych zatwierdzeń w gałęzi B. Musisz cofnąć te niechciane zmiany, a następnie zatwierdzić.(Może istnieć prosty sposób na ustawienie stanu katalogu roboczego i indeksu z powrotem do stanu sprzed scalenia, dzięki czemu masz czyste konto, na którym możesz wybrać zatwierdzenie, które chciałeś.) Nie wiem, jak osiągnąć ten czysty plan.
git checkout HEAD
Igit reset HEAD
oba usunę stan scalenia, pokonując cel tej metody).Więc ręcznie cofnij niechciane zmiany. Na przykład możesz
dla każdego niechcianego zatwierdzenia
012ea56
.Kiedy skończysz dostosowywać, utwórz zatwierdzenie:
Teraz masz tylko pożądaną zmianę, a drzewo przodków pokazuje, że technicznie połączyłeś się z B.
źródło