przenoszenie zmienionych plików do innego oddziału w celu zameldowania

422

Często mi się to zdarza: piszę kod, idę, aby sprawdzić moje zmiany, a potem zdaję sobie sprawę, że nie jestem w odpowiednim oddziale, aby sprawdzić te zmiany. Nie mogę jednak przejść do innej gałęzi bez cofnięcia moich zmian. Czy istnieje sposób przeniesienia zmian do innej gałęzi, która ma zostać tam sprawdzona?

mainocial
źródło

Odpowiedzi:

751

git stash jest twoim przyjacielem.

Jeśli jeszcze nie dokonałeś zatwierdzenia, po prostu uruchom git stash. Spowoduje to zapisanie wszystkich zmian.

Przejdź do gałęzi, w której chcesz wprowadzić zmiany, i uruchom git stash pop.

Istnieje wiele zastosowań Git Stash. Jest to z pewnością jeden z bardziej użytecznych powodów.

Przykład:

# work on some code
git stash
git checkout correct-branch
git stash pop
Bill Door
źródło
122
Nie musisz przechowywać ukrytych niezaangażowanych, idą z tobą, gdy sprawdzasz oddział. Skrytka służy raczej do długoterminowego przechowywania tymczasowych rzeczy (rzeczy, które chcesz zakończyć i zatwierdzić później, ale musisz teraz zrobić coś innego).
Tekkub
2
Rozumiem. Więc muszę ukryć, zmienić gałąź, a potem pop C:\kf [develop +0 ~4 -0]> git checkout feature/customers<br/> error: Your local changes to the following files would be overwritten by checkout:<br/> AspWebApp.vNext/global.asa<br/> RestApi/Web.config<br/> Please, commit your changes or stash them before you can switch branches.<br/> Aborting
IsmailS
3
@Tekkub „długoterminowe przechowywanie tymczasowych rzeczy”, które mówi, wydaje się bardzo niewygodne, kolejnym punktem do użycia skrytki jest umieszczenie jej w stosie, więc jeśli nie chcesz, aby przenosiła i pracowała nad czymś innym, jest to przydatne w ten sposób . Tak, nie musisz, ale czujesz się czystszy i bardziej kontrolowany.
Atherion
brawo kochanie! powinien załączyć to, co powinieneś zrobić, jeśli
popełnisz
2
@Tekkub To prawda, tylko jeśli gałąź, na którą się przełączasz, jest aktualna z gałęzią, w której się znajdujesz. Jeśli na przykład przypadkowo pracujesz nad gałęzią prod i musisz przejść do gałęzi stage, ale etap zmienił się w skrytce w międzyczasie, jest to jedyny sposób na zmianę.
danielson317
248

Jeśli zmiany nie zostały jeszczegit checkout zatwierdzone , użyj przycisku, aby przejść do nowej gałęzi, a następnie zatwierdzić je normalnie - zmiany w plikach nie są powiązane z konkretną gałęzią, dopóki ich nie zatwierdzisz.

Jeśli zmiany zostały już zatwierdzone:

  1. Wpisz git logi zapamiętaj SHA zatwierdzenia, które chcesz przenieść.
  2. Sprawdź gałąź, do której chcesz przenieść zatwierdzenie.
  3. Wpisz git cherry-pick SHApodstawiając SHA z góry.
  4. Wróć do pierwotnego oddziału.
  5. Służy git reset HEAD~1do resetowania przed zatwierdzeniem nieprawidłowej gałęzi.

cherry-pick pobiera dane zatwierdzenie i stosuje je do aktualnie wyrejestrowanej głowy, umożliwiając w ten sposób skopiowanie zatwierdzenia do nowego oddziału.

Bursztyn
źródło
9
Nie powinieneś nawet wybierać tutaj. git reset HEAD~N --softa następnie git checkout -bprzenieść cały teraz kod niezakończonej do nowego oddziału.
Aaron
19
zmiany w plikach nie są powiązane z konkretną gałęzią, dopóki ich nie zatwierdzisz. <- to. To rozwiązało dla mnie zagadkę. Dzięki.
Tschallacka
8
Podczas próby zmiany gałęzi pojawia się następujący błąd: „lokalne zmiany w następujących plikach zostałyby zastąpione przez kasę”. Więc nie wydaje mi się, że mogę przenieść się do innej gałęzi i zatwierdzić normalnie.
Mischa
3
@Mischa nie działa, jeśli przełączasz się między dwiema gałęziami, które mają różne historie
watashiSHUN
1
@Aaron, który jest o wiele ładniejszy (dla scenariusza po zatwierdzeniu)! Proszę podać osobną odpowiedź.
Jacktose
16

Niestety, zdarza mi się to dość regularnie i używam, git stashjeśli wcześniej zdałem sobie sprawę z mojego błędu, git commiti używam git cherry-pickinaczej, oba polecenia wyjaśniono całkiem dobrze w innych odpowiedziach

Chcę dodać wyjaśnienie dla git checkout targetBranch: to polecenie zachowa katalog roboczy i migawkę etapową tylko wtedy, gdy element docelowy ma taką samą historię jak bieżący oddział

Jeśli zmiany nie zostały jeszcze zatwierdzone , po prostu skorzystaj z git checkout, aby przejść do nowej gałęzi, a następnie zatwierdzić je normalnie

@ Oświadczenie Amber nie jest fałszywe, kiedy przechodzisz do newBranch , tworzonygit checkout -b newBranch jest nowy wskaźnik, który wskazuje dokładnie takie samo zatwierdzenie, jak bieżąca gałąź.
W rzeczywistości, jeśli zdarzyło Ci się mieć inny oddział, który dzieli historię z bieżącym oddziałem (oba wskazują ten sam zatwierdzenie), możesz „przenieść swoje zmiany” przezgit checkout targetBranch

Jednak zwykle różne gałęzie oznaczają inną historię, a Git nie pozwoli ci przełączać się między tymi gałęziami z brudnym katalogiem roboczym lub obszarem przejściowym. w takim przypadku możesz wykonać git checkout -f targetBranch(wyczyścić i usunąć zmiany) lub git stage+ git checkout targetBranch(wyczyścić i zapisać zmiany), po prostu uruchomienie git checkout targetBranchspowoduje błąd:

błąd: lokalne zmiany następujących plików zostaną nadpisane przez kasę: ... Proszę zatwierdzić zmiany lub ukryć je przed zmianą gałęzi. Przerwanie

watashiSHUN
źródło
5

Miękki reset git położy Popełnione zmiany z powrotem do indeksu. Następnie sprawdź gałąź, którą zamierzałeś zatwierdzić. Następnie git commit z nową wiadomością zatwierdzenia.

  1. git reset --soft <commit>

  2. git checkout <branch>

  3. git commit -m "Commit message goes here"

Z git docs :

git reset [<mode>] [<commit>]Ten formularz resetuje bieżącą gałąź oddziału i ewentualnie aktualizuje indeks (resetując go do drzewa) i drzewa roboczego w zależności od. Jeśli zostanie pominięty, domyślnie jest --mixed. Musi być jedną z następujących czynności:

--softW ogóle nie dotyka pliku indeksu ani drzewa roboczego (ale resetuje głowicę, tak jak robią to wszystkie tryby). To pozostawia wszystkie zmienione pliki jako „Zmiany do zatwierdzenia”, tak jak ująłby to status git.

JSON C11
źródło