Jak scalić moje lokalne niezarejestrowane zmiany do innej gałęzi Git?
Jak mogę to zrobić w git:
Moja obecna gałąź to branch1 i wprowadziłem kilka lokalnych zmian. Jednak teraz zdaję sobie sprawę, że tak naprawdę zamierzałem zastosować te zmiany do branch2. Czy istnieje sposób, aby zastosować / scalić te zmiany tak, aby stały się zmianami lokalnymi na branch2 bez zatwierdzania ich na branch1?
6 answers
Ponieważ Twoje pliki nie są jeszcze zatwierdzone w branch1
:
git stash
git checkout branch2
git stash pop
Lub
git stash
git checkout branch2
git stash list # to check the various stash made in different branch
git stash apply x # to select the right one
Jak skomentował przez benjohn (zobacz git stash
strona man):
Aby również ukryć aktualnie nie śledzone (nowo dodane) pliki, dodaj argument
-u
, więc:
git stash -u
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:33
Ukrywanie, tymczasowe commity i rebasing mogą być przesadą. Jeśli nie dodałeś jeszcze zmienionych plików do indeksu, możesz być w stanie po prostu zrealizować zamówienie w innej gałęzi.
git checkout branch2
Będzie to działać tak długo, jak żadne edytowane pliki nie różnią się między branch1 i branch2. Pozostawi Cię na branch2 z zachowanymi zmianami roboczymi. Jeśli są różne, możesz określić, że chcesz scalić lokalne zmiany ze zmianami wprowadzonymi przez przełączenie oddziały z opcją -m
do kasy.
git checkout -m branch2
Jeśli dodałeś zmiany do indeksu, będziesz chciał cofnąć te zmiany za pomocą resetu. (To zachowa twoją kopię roboczą, po prostu usunie wprowadzone zmiany.)
git reset
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-17 19:53:44
Oto krótsza alternatywa dla wcześniej wspomnianego podejścia stash:
Tymczasowo przenieś zmiany do skrytki.
git stash
Utwórz i przełącz się na nową gałąź, a następnie wrzuć do niej skrytkę w jednym kroku.
git stash branch new_branch_name
Następnie add
i commit
zmiany w tej nowej gałęzi.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-24 18:38:15
WARNING: Not for Git newbies.
To pojawia się na tyle w moim workflow, że prawie próbowałem napisać dla niego nową komendę git. Zwykły przepływ git stash
jest drogą do przejścia, Ale jest trochę niezręczny. Zwykle robię nowy commit jako pierwszy od jeśli patrzyłem na zmiany, wszystkie informacje są świeże w mojej głowie i lepiej zacząć git commit
-sprawdzać to, co znalazłem (Zwykle poprawka błędu należąca do master, którą odkrywam podczas pracy nad funkcjonalnością Oddział) od razu.
Pomocne jest również-jeśli często spotykasz się z takimi sytuacjami-posiadanie innego katalogu roboczego obok bieżącego, który zawsze ma sprawdzoną gałąź
master
.
Więc jak to osiągnąć idzie tak:
-
git commit
zmiany od razu z dobrym Komunikatem commit. -
git reset HEAD~1
aby cofnąć commit z bieżącej gałęzi. - (opcjonalnie) kontynuuj pracę nad cecha.
-
cd my-project-master
czyli kolejny WD dzielący to samo.git
-
git reflog
aby znaleźć poprawkę, którą właśnie zrobiłem. -
git cherry-pick SHA1
of the commit.
Opcjonalnie (nadal asynchroniczny) możesz ponownie (lub scalić) swoją gałąź funkcji, aby uzyskać poprawkę, zwykle gdy masz zamiar przesłać PR i wyczyścić swoją gałąź funkcji i WD już:
-
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ę pracować nad tą funkcją nieprzerwanie i nie muszę się martwić o git stash
- czyszczenie czegokolwiek lub czyszczenie WD przed git checkout
(a następnie ponowne sprawdzanie cofnięcia gałęzi funkcji.) i nadal mieć wszystkie moje poprawki idzie do master
zamiast ukryte w mojej gałęzi funkcji.
IMO git stash
i git checkout
jest prawdziwym PIA, gdy jesteś w w środku pracy nad jakąś dużą funkcją.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-08 08:22:46
Gdyby chodziło o zmiany popełnione, powinieneś rzucić okiem na git-rebase, ale jak zaznaczono w komentarzu VonC, ponieważ mówisz o zmianach lokalnych, git-stash byłby na pewno dobrym sposobem na to.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-17 14:37:17
Odpowiedzi udzielone do tej pory nie są idealne, ponieważ wymagają dużo niepotrzebnej pracy w rozwiązywaniu konfliktów scalania, lub robią zbyt wiele założeń, które często są fałszywe. Tak to zrobić idealnie. Link do mojej własnej strony.
Jak zatwierdzić inną gałąź w git
Masz niezatwierdzone zmiany na my_branch
, które chcesz zatwierdzić master
, bez zatwierdzania wszystkich zmian z my_branch
.
Przykład
git merge master
git stash -u
git checkout master
git stash apply
git reset
git add example.js
git commit
git checkout .
git clean -f -d
git checkout my_branch
git merge master
git stash pop
Wyjaśnienie
Zacznij od połączenia master
do swojej gałęzi, ponieważ i tak będziesz musiał to zrobić, a teraz jest najlepszy czas na rozwiązanie wszelkich konfliktów.
Opcja -u
(aka --include-untracked
) W git stash -u
zapobiega utracie nie śledzonych plików, gdy później wykonasz git clean -f -d
W master
.
Po git checkout master
Ważne jest, aby nie git stash pop
, ponieważ będziesz potrzebował tego schowka później. Jeśli wpiszesz skrytkę utworzoną w my_branch
, a następnie zrobisz git stash
w master
, będziesz powodować niepotrzebne konflikty scalania, gdy później zastosujesz ten schowek w my_branch
.
git reset
zatrzymuje wszystko, co wynika z git stash apply
. Na przykład pliki, które zostały zmodyfikowane w skrytce, ale nie istnieją w master
, są wyświetlane jako konflikty "usunięte przez nas".
git checkout .
i git clean -f -d
odrzuć wszystko, co nie jest zatwierdzone: wszystkie zmiany w śledzonych plikach oraz wszystkie pliki i katalogi, które nie są śledzone. Są już zapisane w skrytce i jeśli zostaną w master
spowodują niepotrzebne konflikty scalania podczas przełączania z powrotem na my_branch
.
Ostatni git stash pop
będzie oparty na oryginalnym my_branch
, więc nie spowoduje żadnych konfliktów scalania. Jeśli jednak twoja skrytka zawiera pliki, które zobowiązałeś się do opanowania, git będzie narzekał, że "nie można przywrócić niezabezpieczonych plików ze skrytki". Aby rozwiązać ten konflikt, usuń te pliki z drzewa roboczego, a następnie git stash pop
, git add .
, i git reset
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-15 22:27:57