Przenieś istniejącą, niezakontraktowaną pracę do nowej gałęzi w Git

Zacząłem trochę pracować nad nową funkcjonalnością i po krótkim kodowaniu zdecydowałem, że ta funkcjonalność powinna być na własnej gałęzi.

Jak przenieść istniejące niezarejestrowane zmiany do nowej gałęzi i zresetować bieżącą?

Chcę zresetować bieżącą gałąź, zachowując istniejącą pracę nad nową funkcją.

Author: Cœur, 2009-09-08

5 answers

Użyj następującego:

git checkout -b <new-branch>

To pozostawi bieżącą gałąź w niezmienionej formie, utworzy i wykona nową gałąź i zachowa wszystkie zmiany. Następnie możesz utworzyć commit za pomocą:

git add <files>

I zatwierdź nową gałąź za pomocą:

git commit -m "<Brief description of this commit>"

Zmiany w katalogu roboczym i zmiany w indeksie nie należą jeszcze do żadnej gałęzi. To zmienia się tam, gdzie te zmiany zakończyłyby się.

Jeśli nie zresetujesz oryginalnej gałęzi, zostanie taka, jaka jest. Ostatni commit na <old-branch> nadal będzie taka sama. Dlatego ty checkout -b, a następnie popełnić.

 3030
Author: knittl,
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-03-27 11:42:20

Alternatywnie:

  1. Zapisz bieżące zmiany w schowku tymczasowym:

    $ git stash

  2. Utwórz nową gałąź na podstawie tego schowka i przełącz się na nową gałąź:

    $ git stash branch <new-branch> stash@{0}

Wskazówka: Użyj klawisza tab, aby zmniejszyć wpisywanie nazwy skrytki.

 262
Author: Robin Qiu,
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-03-15 22:50:34

Jeśli tworzyłeś commity w swojej głównej gałęzi podczas kodowania, ale teraz chcesz przenieść te commity do innej gałęzi:

  1. Skopiuj bieżącą historię na nową gałąź, wprowadzając również niezatwierdzone zmiany:

    git checkout -b <new-feature-branch>
    
  2. Teraz Wymuś, aby oryginalna gałąź "bałaganu" cofnęła się: (bez przełączania się na nią)
    git branch -f <previous-branch> <earlier-commit-id>
    

    Na przykład:

    git branch -f master origin/master
    

    Lub gdybyś zrobił 4 commity:

    git branch -f master HEAD~4
    

Ostrzeżenie: wygląda na to, że git branch -f master origin/master zresetuje informacje o śledzeniudla tej gałęzi. Więc jeśli skonfigurowałeś swoją gałąź master do wypychania w inne miejsce niż origin/master wtedy ta konfiguracja zostanie utracona.

Alternatywą jest użycietej techniki resetowania . Ale te instrukcje odrzucą wszelkie niezatwierdzone zmiany, które masz. Jeśli chcesz je zatrzymać, schowaj je najpierw i odkręć w koniec.

 37
Author: joeytwiddle,
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
2018-03-14 04:05:16

Jeśli go zatwierdzisz, możesz również wybrać pojedynczy identyfikator zatwierdzenia. Robię to często, gdy zaczynam pracę w master, a następnie chcę utworzyć lokalną gałąź, zanim wypchnę się do mojego pochodzenia/.

git cherry-pick <commitID>

Jest wiele rzeczy, które możesz zrobić z cherry-pick, jak opisano tutaj , ale może to być przypadek użycia dla Ciebie.

 16
Author: password,
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-11-30 20:58:06

Wspólny scenariusz jest następujący: zapomniałem utworzyć nową gałąź dla nowej funkcji i wykonywałem całą pracę w starej gałęzi funkcji. Powierzyłem całą" starą "pracę gałęzi master i chcę, aby moja nowa gałąź wyrosła z "mistrza". Nie popełniłem ani jednego zobowiązania z mojego nowego dzieła. Oto struktura oddziału: "master" - > "Old_feature"

git stash 
git checkout master
git checkout -b "New_branch"
git stash apply
 1
Author: Alex Burov,
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
2018-08-13 16:07:54