Jak zatwierdzić zmiany w nowej gałęzi

151

Właśnie dokonałem zmian w gałęzi. Jak mogę zatwierdzić zmiany w innej gałęzi?

Próbuję użyć:

git checkout "the commmit to the changed branch" -b "the other branch"

Jednak uważam, że nie jest to właściwe, ponieważ w tym przypadku tworzę nową gałąź zamiast zatwierdzać zmiany w „innej gałęzi”.

Czy powinienem zamiast tego użyć następującego polecenia?

git merge "the other branch"
user1988385
źródło
Tylko jedno zatwierdzenie czy kilka?
Carl Norum

Odpowiedzi:

268

git checkout -b your-new-branch

git add <files>

git commit -m <message>

Najpierw sprawdź swój nowy oddział. Następnie dodaj wszystkie pliki, które chcesz przekazać do przemieszczania. Na koniec zatwierdź wszystkie dodane pliki. Możesz to zrobić git push origin your-new-branchpóźniej, aby zmiany pojawiły się na pilocie.

John Brodie
źródło
1
skoro otrzymałem new-branch z git checkout v3.0 (gałąź przed wprowadzeniem zmian) new-branch, czy nadal muszę używać "git add <files>"?
user1988385
Możesz zrobić, git statusaby zobaczyć, co jest obecnie wystawiane, a co nie.
John Brodie,
5
Dlaczego jedno git addi drugie git commit -a?
Carl Norum
11
To nie jest git checkout -b your-new-branchzamiast git checkout your-new-branch?
Schrodinger's'Cat
1
co powiesz na to, że śledziłem już pliki i chcę przełączyć się do nowej gałęzi, dodać te pliki do nowo utworzonej gałęzi?
król-tyłek jakieś pytanie
58

Jeśli nie dokonałeś zmian

Jeśli Twoje zmiany są zgodne z inną gałęzią

Tak jest w przypadku pytania, ponieważ OP chce zatwierdzić nową gałąź i ma również zastosowanie, jeśli zmiany są zgodne z gałęzią docelową bez wyzwalania nadpisania.

Jak w zaakceptowanej odpowiedzi Johna Brodiego, możesz po prostu pobrać nową gałąź i wykonać pracę:

git checkout -b branch_name
git add <files>
git commit -m "message"

Jeśli Twoje zmiany są niezgodne z inną gałęzią

Jeśli pojawi się błąd:

error: Your local changes to the following files would be overwritten by checkout:
...
Please commit your changes or stash them before you switch branches

Następnie możesz schować swoją pracę, utworzyć nową gałąź, a następnie pobrać zmiany w skrytce i rozwiązać konflikty:

git stash
git checkout -b branch_name
git stash pop

Będzie tak, jakbyś wprowadził te zmiany po utworzeniu nowej gałęzi. Następnie możesz zatwierdzić jak zwykle:

git add <files>
git commit -m "message"

Jeśli dokonałeś zmian

Jeśli chcesz zachować zmiany w oryginalnej gałęzi

Zobacz odpowiedź Carla Noruma z selekcją wiśni, która jest właściwym narzędziem w tym przypadku:

git checkout <target name>
git cherry-pick <original branch>

Jeśli nie chcesz zachować zatwierdzeń w oryginalnej gałęzi

Zobacz odpowiedź joeytwiddle na temat tego potencjalnego duplikatu . Wykonaj odpowiednio dowolny z powyższych kroków, a następnie przywróć oryginalną gałąź:

git branch -f <original branch> <earlier commit id>

Jeśli wprowadziłeś zmiany do udostępnionego pilota, takiego jak GitHub, nie powinieneś próbować tego wycofywania, chyba że wiesz, co robisz.

miguelmorin
źródło
3
Każdy powinien wypróbować ten kod. Ponieważ większość ludzi, którzy szukają odpowiedzi, ma już pewne zmiany w twoim istniejącym kodzie.
Sushin Pv
2
Dlaczego dodałeś stash and stash pop? Kiedy wyewidencjonujesz nową gałąź, twoje zmiany będą dostępne do dodania i zatwierdzenia, bez konieczności przechowywania.
Tristan
@Tristan Masz rację w przypadku, gdy zmiany są zgodne, a pliki nie nadpisują. W przeciwnym razie otrzymuję error: Your local changes to the following files would be overwritten by checkout: ... Please commit your changes or stash them before you switch branches.pytanie Czy chcesz napisać nową odpowiedź czy edytować moją odpowiedź? Jeśli nie, mogę sam to edytować.
miguelmorin
Ok, masz całkowitą rację. Uważam jednak, że powinieneś uzupełnić swoją odpowiedź, aby pokazać, co przynosi ona oprócz zaakceptowanej odpowiedzi.
Tristan
@Tristan Zrobiłem to. PO pytał o nowy oddział, w takim przypadku zaakceptowana odpowiedź jest prawidłowa. Zachowuję swoją, ponieważ inni uznali moją odpowiedź za przydatną. To długa odpowiedź i chętnie ją edytuję z wszelkimi opiniami.
miguelmorin
24

Jeśli dobrze rozumiem, zobowiązałeś się do wykonania zobowiązania changed_branchi chcesz go skopiować other_branch? Łatwo:

git checkout other_branch
git cherry-pick changed_branch
Carl Norum
źródło
5
To jest właściwa odpowiedź na to, co próbuje osiągnąć.
Sean