Jak mogę wykonać następujące czynności w Git?
Mój obecny oddział to oddział 1 i wprowadziłem kilka lokalnych zmian. Teraz jednak zdaję sobie sprawę, że tak naprawdę zamierzałem zastosować te zmiany w gałęzi 2. Czy istnieje sposób na zastosowanie / scalenie tych zmian, aby stały się lokalnymi zmianami w oddziale 2 bez popełniania ich w oddziale 1?
Odpowiedzi:
Ponieważ Twoje pliki nie są jeszcze zatwierdzone w
branch1
:lub
Jak skomentował przez benjohn (zobacz
git stash
stronę man ):źródło
-u
, tak:git stash -u
.Ukrywanie, tymczasowe zatwierdzenia i zmiany zasad mogą być przesadą. Jeśli jeszcze nie dodałeś zmienionych plików do indeksu, być może będziesz mógł po prostu pobrać drugą gałąź.
Działa to tak długo, jak długo edytowane pliki nie różnią się między oddziałem 1 i oddziałem 2. Zostawi cię na gałęzi 2 z zachowanymi zmianami roboczymi. Jeśli są różne, możesz określić, że chcesz scalić lokalne zmiany ze zmianami wprowadzonymi przez zmianę gałęzi z
-m
opcją kasy.Jeśli dodałeś zmiany do indeksu, najpierw cofnij je, resetując. (Pozwoli to zachować kopię roboczą, po prostu usuniesz zmiany etapowe).
źródło
checkout -m
skrytka nie jest w niektórych sytuacjach „bezpieczna” (być może spowodowałaby konflikt scalania), czy skrytka miałaby jakąś przewagę (np. Czy możesz odpakować skrytkę)?.orig
?Krótszą alternatywą dla wcześniej wspomnianego podejścia do ukrywania byłoby:
git stash
git stash branch new_branch_name
Potem tylko
add
icommit
zmiany w tym nowym oddziale.źródło
OSTRZEŻENIE: Nie dla początkujących użytkowników.
To pojawia się na tyle w moim przepływie pracy, że prawie próbowałem napisać dla niego nowe polecenie git. Zwykły
git stash
przepływ jest drogą, ale jest trochę niezręczny. Zwykle najpierw dokonuję nowego zatwierdzenia, ponieważ jeśli patrzyłem na zmiany, wszystkie informacje są w mojej głowie świeże i lepiej po prostu zacząć odgit commit
tego, co znalazłem (zwykle poprawkę należącą do mistrza, którą odkryłem podczas pracy nad gałąź funkcji) od razu.Jak to osiągam, wygląda to tak:
git commit
zmiany od razu z dobrym komunikatem zatwierdzenia.git reset HEAD~1
aby cofnąć zatwierdzenie z bieżącego oddziału.Czasami później (asynchronicznie) lub natychmiast w innym oknie terminala:
cd my-project-master
który jest innym WDem, który udostępnia to samo.git
git reflog
znaleźć poprawkę, którą właśnie stworzyłem.git cherry-pick SHA1
zatwierdzenia.Opcjonalnie (nadal asynchronicznie) możesz następnie zmienić bazę (lub scalić) gałąź funkcji, aby uzyskać poprawkę, zwykle gdy masz zamiar przesłać PR i wyczyściłeś już gałąź funkcji i WD:
cd my-project
który jest głównym WD, nad którym pracuję.git rebase master
aby uzyskać poprawki błędów.W ten sposób mogę nieprzerwanie pracować nad tą funkcją i nie muszę się martwić o
git stash
cokolwiek, czy muszę wyczyścić WD przedgit checkout
(a następnie ponownie sprawdzić wycofanie gałęzi funkcji) i nadal mieć wszystkie moje poprawkimaster
zamiast ukryty w mojej gałęzi funkcji.IMO
git stash
igit checkout
jest prawdziwą PIA, gdy jesteś w trakcie pracy nad jakąś dużą funkcją.źródło
my-project-master
Dzieląc te same.git
brzmi to podoba. Dlaczego niegit checkout -b bugfixABC; git commit -a; git reset HEAD^ --hard
, a później (asynchronicznie) podczasmaster
,git cherry-pick <SHA1 of the commit(s) in bugfixABC
? (lub nawet, aby uniknąć konieczności szukania SHA1,git rebase --onto master feature bugfixABC
z dowolnego miejsca, w którym aktualnie się znajdujesz. Co oznacza, że możesz to zrobić bezpośrednio pogit reset
powyższym, gdy jesteś włączonyfeature
).checkout -m
jest po prostu lepiej.Jeśli chodzi o zatwierdzone zmiany, powinieneś rzucić okiem na git-rebase, ale jak wskazano w komentarzu VonC, gdy mówisz o lokalnych zmianach, git-stash z pewnością byłby dobrym sposobem na zrobienie tego.
źródło
Dotychczasowe odpowiedzi nie są idealne, ponieważ wymagają dużo niepotrzebnej pracy w celu rozwiązania konfliktów scalania lub przyjmują zbyt wiele założeń, które często są fałszywe. Oto jak to zrobić idealnie. Link jest do mojej własnej strony.
Jak zatwierdzić w innym oddziale w git
Masz niezatwierdzone zmiany
my_branch
, do których chcesz się zobowiązaćmaster
, bez zatwierdzania wszystkich zmian odmy_branch
.Przykład
Wyjaśnienie
Zacznij od połączenia
master
się ze swoim oddziałem, ponieważ i tak będziesz musiał to zrobić ostatecznie, a teraz jest najlepszy czas na rozwiązanie wszelkich konfliktów.-u
Opcja (aka--include-untracked
) wgit stash -u
zapobiega zgubieniu plików nieśledzone kiedy później zrobićgit clean -f -d
wewnątrzmaster
.Po
git checkout master
tym ważne jest, aby tego NIE robićgit stash pop
, ponieważ będziesz potrzebować tej skrytki później. Jeśli włączysz utworzoną skrytkę,my_branch
a następniegit stash
w niąmaster
wejdziesz, spowodujesz niepotrzebne konflikty scalania, gdy później zastosujesz tę skrytkęmy_branch
.git reset
odsłania wszystko, co wynika zgit stash apply
. Na przykład pliki, które zostały zmodyfikowane w skrytce, ale nie istnieją,master
są przenoszone jako konflikty „usunięte przez nas”.git checkout .
igit clean -f -d
odrzucić wszystko, co nie zostało popełnione: wszystkie zmiany w śledzonych plikach oraz wszystkie nieśledzone pliki i katalogi. Są już zapisane w skrytce, a pozostawieniemaster
ich spowoduje niepotrzebne konflikty scalania przy ponownym włączeniumy_branch
.Ostatni
git stash pop
będzie oparty na oryginalemy_branch
, a więc nie spowoduje konfliktów scalania. Jeśli jednak twoja skrytka zawiera nieśledzone pliki, które zobowiązałeś się opanować, git będzie narzekać, że „nie można przywrócić nieśledzonych plików ze skrytki”. Aby rozwiązać ten konflikt, należy usunąć te pliki z drzewa pracy, potemgit stash pop
,git add .
igit reset
.źródło