Scal do konkretnego zatwierdzenia

372

Utworzyłem nową gałąź o nazwie newbranchz mastergałęzi w git. Teraz mam zrobić jakąś pracę i chcą łączyć newbranchsię master; Wprowadziłem jednak kilka dodatkowych zmian newbranchi chcę połączyć newbranchsię z czwartym od ostatniego zatwierdzenia master.

Użyłem, cherry-pickale pokazuje komunikat, aby użyć właściwych opcji:

git checkout master    
git cherry-pick ^^^^HEAD newbranch

Czy mergezamiast tego mogę użyć git ?

git merge newbranch <commitid>
Dau
źródło

Odpowiedzi:

592

Oczywiście będąc w masterbranży wszystko, co musisz zrobić, to:

git merge <commit-id>

gdzie commit-idjest skrót ostatniego zatwierdzenia newbranch, który chcesz uzyskać w swoim masteroddziale.

Możesz dowiedzieć się więcej o każdym poleceniu git, wykonując git help <command>. Tak to jest git help merge. Dokumenty mówią, że ostatnim argumentem mergepolecenia jest <commit>..., więc można przekazać odwołanie do dowolnego zatwierdzenia lub nawet wielu zatwierdzeń. Chociaż nigdy sam tego nie zrobiłem.

KL-7
źródło
30
nie tylko jedno zatwierdzenie, ale wszystkie zatwierdzenia poprzedzającecommit-id
Dau
53
Tak, to będzie łączyć wszystkie zobowiązuje od newbranchod czasu jego historia odbiega od mastermaksymalnie commit-iddo masteroddziału. Możesz pomyśleć o git merge <commit-id>połączeniu jakiejś nienazwanej gałęzi, która kończy się commit-idna bieżącej gałęzi.
KL-7
2
Czy mogę łączyć między dwoma lokalnymi oddziałami innymi niż master, używając identyfikatora zatwierdzenia?
skt
1
@skt, możesz po prostu być w lokalnym oddziale, z którym chcesz się połączyć przed użyciem git merge. tzn. powiedz, że chcesz scalić zatwierdzenie 18a6fac z gałęzi b2 do gałęzi b1 po prostu zróbgit checkout b1; git merge 18a6fac
XioRcaL
1
To NIE wydaje się działać, jeśli jestem na gałęzi, z którą chcę się połączyć, a jest jeszcze inna gałąź z zatwierdzeniami AB i C, a scalenie w C powoduje tylko zmiany dokonane w C, a nie A i B.
ggb667,
12

Aby utrzymać rozgałęzienie w czystości, możesz to zrobić:

git checkout newbranch
git branch newbranch2
git reset --hard <commit Id> # the commit at which you want to merge
git checkout master
git merge newbranch
git checkout newbranch2

W ten sposób newbranch zakończy się w miejscu, w którym został scalony w master, i będziesz kontynuować pracę nad newbranch2.

tkruse
źródło
1

Uruchom poniższe polecenie w bieżącym folderze gałęzi, aby scalić tę <commit-id>gałąź z bieżącą gałęzią, --no-commitnie wykonuj automatycznie nowego zatwierdzenia

git merge --no-commit <commit-id>

git merge --continue można uruchomić tylko wtedy, gdy scalenie spowodowało konflikty.

git merge --abort Przerwij bieżący proces rozwiązywania konfliktów i spróbuj odtworzyć stan sprzed scalenia.

ElasticCode
źródło