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łęzi B
:
git checkout A
git merge --no-commit B
Teraz masz skonfigurowane zatwierdzenie z dwojgiem rodziców, aktualny typ zatwierdzeń A
i B
. 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
I git reset HEAD
oba usunę stan scalenia, pokonując cel tej metody).
Więc ręcznie cofnij niechciane zmiany. Na przykład możesz
git revert --no-commit 012ea56
dla każdego niechcianego zatwierdzenia 012ea56
.
Kiedy skończysz dostosowywać, utwórz zatwierdzenie:
git commit -m "Merge in commit 823749a from B which tweaked the timeout code"
Teraz masz tylko pożądaną zmianę, a drzewo przodków pokazuje, że technicznie połączyłeś się z B.