Zastosowanie zmian z gałęzi b do a, bez scalania lub dodawania zatwierdzeń

86

Mój scenariusz jest taki, że mam jedną gałąź, w której wprowadziłem duże ulepszenia w procesie budowania (gałąź A), aw innej pracuję nad niepowiązaną funkcją (gałąź B). Więc teraz, kiedy hakuję gałąź B, chcę pobrać rzeczy, które napisałem w gałęzi A, ponieważ chcę szybszych i łatwiejszych kompilacji. Jednak nie chcę „zanieczyszczać” mojej gałęzi B, po prostu dodam zmiany z gałęzi A do zmian niestacjonarnych.

Co próbowałem (stojąc na gałęzi B):

git merge --no-commit branchA

Nie działa, ponieważ umieszcza Cię w procesie scalania. Gdyby tak nie było, byłoby idealnie.

git checkout branchA -- .

Nie działa, ponieważ wprowadza zmiany między gałąźA..branchB, a nie wzorcem zmian..branchA.

Coś jeszcze?

Edycja: tak, zmiany w gałęzi A są zatwierdzone. W tym przykładzie jest tylko jedna gałąź z ulepszeniami kompilacji, ale może być do N gałęzi z ulepszeniami kompilacji, które chcę zastosować podczas pracy nad gałęzią funkcji.

Björn Lindqvist
źródło
Czy zmiany w A są już zatwierdzone?
Theolodis

Odpowiedzi:

152

Po prostu musiałem zrobić coś podobnego i udało mi się to naprawić, dodając --squashdo polecenia scalania

git merge --no-commit --squash branchA
git reset HEAD # to unstage the changes
guilffer
źródło
3
Powinien również zawierać wyjaśnienia dotyczące tego, co robi. Etapuje różnicę zmian z gałęzi A na bieżącą gałąź
KareemElashmawy
powiedzmy, że właśnie połączyłem kod z gałęzi A do mastera, ale zapomniałem czegoś i chcę dodać kilka dodatkowych kodów / zmian do tego zatwierdzenia scalającego bez pokazywania się jako kolejne zatwierdzenie scalające w historii git. czy ta metoda zadziała?
Sushmit Sagar
@Sushmit Myślę, że możesz zrobić git commit —amendi doda nowe zmiany do ostatniego zatwierdzenia, po prostu nie jestem do końca pewien, czy to działa na zatwierdzeniach scalających
guilffer
1
Nie sądzę, żeby - no-commit było tutaj potrzebne? Powinien być domyślny.
Petter
11

cherry-pick -n powinien robić, co chcesz, ale nie jestem pewien, dlaczego chcesz, aby ulepszenia kompilacji były zmianami niestacjonarnymi - to tylko utrudnia kilka rzeczy (np. scalanie innych zmian w zmodyfikowanych plikach lub ponowne bazowanie czegokolwiek).

W tym przykładzie jest tylko jedna gałąź z ulepszeniami kompilacji, ale może być do N gałęzi z ulepszeniami kompilacji, które chcę zastosować podczas pracy nad gałęzią funkcji.

W takim przypadku utworzyłbym nową gałąź, C, którą scalisz zarówno z gałęzi A, jak i B (i wszelkich innych gałęzi z ulepszeniami kompilacji). Zatwierdź zmiany w gałęzi funkcji, B, a następnie połącz je z gałęzią C, która teraz zawiera ulepszenia kompilacji i zmiany gałęzi funkcji, dzięki czemu możesz je przetestować razem. Jeśli chcesz wprowadzić więcej zmian, zrób to w odpowiedniej gałęzi, a nie w C, a następnie połącz z C. Więc nigdy nie zmieniaj niczego w gałęzi C, po prostu użyj go do integracji zmian z innych gałęzi.

Oznacza to, że możesz używać wszystkich funkcji Gita w gałęzi C, zamiast żonglować niezatwierdzonymi zmianami w brudnym drzewie.

Jonathan Wakely
źródło
UseCase for cherry-pick -n: Utworzyłem działającą kopię mojego kodu, dodając wiele rzeczy w losowych miejscach. Teraz chcę wyczyścić mój kod przed zatwierdzeniem gałęzi tej funkcji. Więc przełączam się na gałąź tymczasową, zatwierdzam wszystkie zmiany. Wróć do gałęzi funkcji, cherry-picktego zatwierdzenia. Czy jest lepszy sposób na zrobienie tego?
Tejas Kale
6

Powinieneś być w stanie wybrać najlepsze commity ( -naby uniknąć ich od razu).

Lucero
źródło
-n nie zadziałało. Mówi, że opcja no -m nie powiodła się, jeśli zatwierdzenie typu cherry-pick nie powiodło się.
Alejandro Sanz Díaz
5

Nie jestem w 100% pewien, czy zrozumiałem to jasno, ale w moim przypadku właśnie utworzyłem łatkę różnicową między gałęziami, a następnie zastosowałem tę ścieżkę na gałęzi B.

W gałęzi A:

 git diff branchA..branchB > patch.diff
 git apply patch.diff
sobi3ch
źródło
4

Nie jestem pewien, czy rozumiem Twoje wymagania.

Możesz uruchomić scalanie, a następnie zadzwonić git reset HEAD~1.


Poniższa sekwencja powinna odtwarzać każde zatwierdzenie między masteri branchAna górze branchB. Zatwierdzenia, które zostały już zastosowane, branchBzostaną pominięte.

# start from branchA
git checkout branchA
# create a temporary branch wip
git checkout -b wip
# use rebase to replay each commit between master and wip on branchB
git rebase --onto branchB master wip

# if you want to remove all the commit history and only keep the resulting diffs,
# use git reset
git reset branchB

# change the active branch
git checkout branchB
# remove temp branch
git branch -d wip
LeGEC
źródło
To dodaje pliki do obszaru przemieszczania gita, którego nie chcę. Ponadto wydaje się działać dobrze tylko wtedy, gdy wszystkie gałęzie są rozgałęzione z tego samego zatwierdzenia w gałęzi głównej. W przeciwnym razie wprowadzane są różnice spoza zakresu master..branchA.
Björn Lindqvist
@ BjörnLindqvist: usuń tę --softopcję, jeśli nie chcesz zmian w obszarze pomostowym . Czy możesz narysować wykres, jak skonfigurowane są twoje oddziały?
LeGEC