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?

 556
Author: solsberg, 2009-02-17

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
 818
Author: VonC,
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
 78
Author: CB Bailey,
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.

 9
Author: rbento,
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:

  1. git commit zmiany od razu z dobrym Komunikatem commit.
  2. git reset HEAD~1 aby cofnąć commit z bieżącej gałęzi.
  3. (opcjonalnie) kontynuuj pracę nad cecha.
W przeciwieństwie do innych terminali terminalowych, terminale terminalowe nie mogą być używane w terminalach terminalowych.]}
  1. cd my-project-master czyli kolejny WD dzielący to samo .git
  2. git reflog aby znaleźć poprawkę, którą właśnie zrobiłem.
  3. 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ż:

  1. cd my-project który jest głównym WD, nad którym pracuję.
  2. 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ą.

 7
Author: chakrit,
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.

 2
Author: claf,
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.

 1
Author: Vladimir Kornea,
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