2010-05-31 15 views
495

Czasami zdarza się, że dokonuję pewnych zmian w moim katalogu roboczym i zdaję sobie sprawę, że te zmiany powinny zostać zatwierdzone w oddziale innym niż bieżący. Zdarza się to zazwyczaj, gdy chcę wypróbować nowe rzeczy lub przeprowadzić testy, a wcześniej zapomnieć o utworzeniu nowej gałęzi, ale nie chcę wprowadzać niepoprawnego kodu do gałęzi głównej.Jak przekazać moje bieżące zmiany do innego oddziału w git

Więc, jak mogę uczynić, że niezatwierdzone zmiany (lub zmiany zapisane w indeksie) zostały zatwierdzone do innego oddziału niż bieżący?

Odpowiedz

727

Pozostałe odpowiedzi sugerujące sprawdzenie drugiego oddziału, a następnie zatwierdzenie go, działają tylko wtedy, gdy zamówienie jest możliwe z uwagi na lokalne modyfikacje. Jeśli nie jesteś w najczęstszym przypadku użycia do git stash:

git stash 
git checkout other-branch 
git stash pop 

Pierwszy stash ukrywa dala zmiany (co w zasadzie tymczasowej popełnić), a kolejne stash pop ponownie stosuje je. Dzięki temu git może używać swoich funkcji scalania.

Jeśli spróbujesz otworzyć skrytkę, masz do czynienia z konfliktami scalającymi ... kolejne kroki zależą od tego, jakie są konflikty. Jeśli wszystkie ukryte zmiany rzeczywiście należą do tej innej gałęzi, będziesz musiał po prostu je przejrzeć - to konsekwencja dokonania zmian w niewłaściwym oddziale.

Z drugiej strony, jeśli naprawdę masz pomieszane, a twoje drzewo robocze zawiera mieszankę zmian dla dwóch oddziałów, a konflikty są tylko tymi, które chcesz cofnąć w oryginalnej gałęzi, możesz może zaoszczędzić trochę pracy. Jak zwykle jest na to wiele sposobów. Oto jeden, począwszy od po pop i zobaczyć konfliktów:

# Unstage everything (warning: this leaves files with conflicts in your tree) 
git reset 
# Add the things you *do* want to commit here 
git add -p  # or maybe git add -i 
git commit 
# The stash still exists; pop only throws it away if it applied cleanly 
git checkout original-branch 
git stash pop 
# Add the changes meant for this branch 
git add -p 
git commit 
# And throw away the rest 
git reset --hard 

Ewentualnie, jeśli uświadomić sobie, wyprzedzając czas, że to się wydarzy po prostu popełnić rzeczy, które należą na bieżącej gałęzi. Zawsze można wrócić i zmiany, które zobowiązują się:

git add -p 
git commit 
git stash 
git checkout other-branch 
git stash pop 

i oczywiście należy pamiętać, że to wszystko trwało trochę pracy i uniknąć następnym razem, być może poprzez umieszczenie swoją obecną nazwę oddziału w swoim wierszu dodając $(__git_ps1) do twojego PS1 w twoim bashrc. (Patrz na przykład: Git in Bash docs.)

+0

Kiedy powiedziałeś: 'Sprawdzanie oddziału, a następnie zatwierdzanie będzie działało tylko wtedy, gdy zamówienie jest możliwe z uwagi na lokalne modyfikacje. Co masz na myśli? Czy mógłbyś podać/omówić jeden prosty przykład, kiedy to się nie powiedzie? –

+5

@ user815423426 Jeśli masz niezatwierdzone zmiany, możesz wyewidencjonować inną gałąź wtedy i tylko wtedy, gdy zestaw plików, które zmieniłeś, a zestaw plików, które różnią się między dwiema gałęziami, jest rozłączny. Oznacza to, że jeśli zmodyfikowałeś plik A, możesz wyewidencjonować inny oddział tylko wtedy, gdy plik A jest taki sam w obu gałęziach. – Cascabel

+0

Dzięki! Kiedy powiedziałeś, że 'A' jest takie samo w obu gałęziach, masz na myśli' A' przed moimi zmianami (to znaczy 'A' w HEAD każdej gałęzi). Poprawny? –

18
  1. git checkout my_other_branch
  2. git add my_file my_other_file
  3. git commit -m

I podać popełnienia wiadomość.

+1

możesz napisać co * co * i * ci * jest ... choć można się domyślić (kasie, zatwierdzenie) ^^ – tanascius

+2

@tanascius Dobra sugestia i gotowe. Używam aliasów tak długo, że zapominam, że nie są one domyślne. –

45

Możesz po prostu utworzyć nowy oddział i włączyć go. Swoje zmiany następnie:

git branch dirty 
git checkout dirty 
// And your commit follows ... 

Alternatywnie, można również kasy istniejący oddział (tylko git checkout <name>). Ale tylko, jeśli nie ma kolizji (podstawa wszystkich edytowanych plików jest taka sama jak w bieżącym oddziale). W przeciwnym razie otrzymasz wiadomość.

+9

Należy zauważyć, że w przypadku przełączenia do ** istniejącej ** *** rozbieżnej gałęzi *** można użyć opcji '-m', aby powiedzieć git, aby spróbować scalić zmiany, tj.' Git checkout -m ' –

+2

@ Jefromi's Odpowiedź jest lepsza praktycznie w każdym przypadku, o którym myślę. –

+3

Krótsza wersja: 'git checkout -b dirty' – user1338062

Powiązane problemy