Pytanie Przenieś istniejącą, niezakończoną pracę do nowego oddziału w Git


Zacząłem pracę nad nową funkcją i po napisaniu kodu zdecydowałem, że ta funkcja powinna znajdować się we własnym oddziale.

Jak przenieść istniejące niezatwierdzone zmiany do nowego oddziału i zresetować bieżący?

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


2512
2017-09-08 15:57


pochodzenie




Odpowiedzi:


Użyj następującego:

git checkout -b <new-branch>

Spowoduje to pozostawienie aktualnej gałęzi w takiej postaci, w jakiej jest, utworzenie i pobranie nowego oddziału i zachowanie wszystkich zmian. Następnie możesz dokonać commit z:

git add <files>

i zobowiązać się do nowego oddziału z:

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

Zmiany w katalogu roboczym i zmiany wystawiane w indeksie nie należą jeszcze do żadnej gałęzi. To zmienia się, gdy te zmiany zakończą się.

Ty nie nastawić twoja oryginalna gałąź, pozostaje taka jaka jest. Ostatnie zatwierdzenie <old-branch> nadal będzie taki sam. Dlatego ty checkout -b a następnie zatwierdzić.


2966
2017-09-08 15:59



Aby się upewnić, muszę zatwierdzić niedokończoną funkcję PRZED zresetowaniem mojej oryginalnej gałęzi? A może te niezatwierdzone pliki zostaną zachowane, niezależnie od popełnienia błędu? - Dane O'Connor
FYI: zmiany w katalogu roboczym i zmiany wystawiane w indeksie nie należą do oddziału. git checkout -b <new branch> zmiany, w których te zmiany zostaną zakończone. - Jakub Narębski
Jeśli masz już oddział i chcesz przenieść zmiany do istniejącego oddziału, kasy stackoverflow.com/questions/556923/... - Chirantan
Jeśli chcesz przenieść nowy oddział do zdalnego repozytorium: stackoverflow.com/questions/2765421/... - Dewayne
@JDSmith: niezatwierdzone zmiany nie rób należą do dowolnego oddziału. Znajdują się one tylko w katalogu roboczym git checkout ./git reset --hard będzie nieodwołalnie usunąć im - knittl


Alternatywnie:

  1. Zapisz bieżące zmiany w temp.:

    $ git stash

  2. Utwórz nowy oddział na podstawie tego skrytka i przejdź do nowego oddziału:

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

Wskazówka: użyj klawisza tabulacji, aby zmniejszyć pisanie nazwy skrytki.


254
2018-06-19 00:18



Jeśli druga gałąź już istnieje, możesz ją zmienić za pomocą kasy git stash apply. - Archonic
Lepsze niż przyjęte rozwiązanie - Jonathan Landrum
Nie rozumiem podpowiedzi "Wskazówka: użyj klawisza tabulacji, aby zmniejszyć wpisywanie nazwy skrytki.". Czy nazwa "stash @ {0}" nie jest? Nie mogę tego pomyślnie uruchomić. - Herbert
Dlaczego jest to lepsze niż zaakceptowana odpowiedź stackoverflow.com/a/1394804/754997 ? - Chris Page
Nie rozumiem, dlaczego jest to lepsze niż zaakceptowana odpowiedź git checkout -b <new branch name> - Noitidart


Jeśli robisz commitów na twoim głównym oddziale podczas kodowania, ale teraz chcesz przenieść te zatwierdzenia do innego oddziału:

  1. Skopiuj bieżącą historię do nowego oddziału, przenosząc również wszelkie niezatwierdzone zmiany:

    git checkout -b <new-feature-branch>
    
  2. Teraz wymuś oryginalną "niechlujną" gałąź do wycofania: (bez przełączania się na nią)

    git branch -f <previous-branch> <earlier-commit-id>
    

    Na przykład:

    git branch -f master origin/master
    

    lub jeśli wykonałeś 4 zatwierdzenia:

    git branch -f master HEAD~4
    

Ostrzeżenie: Wygląda na to, że git branch -f master origin/master będzie zresetuj informacje o śledzeniu dla tej gałęzi. Więc jeśli skonfigurowałeś swój master gałąź, aby przesunąć w inne miejsce niż origin/master wtedy ta konfiguracja zostanie utracona.

Alternatywą jest użycie ta technika resetowania. Ale te instrukcje odrzucają wszelkie niezatwierdzone zmiany, które masz. Jeśli chcesz je zachować, najpierw ukryj je i wyrzuć na końcu.


35
2018-02-12 07:44



To odpowiada na pytanie, które różni się nieco od tego, o co pytał op. Postanowiłem umieścić tę odpowiedź tutaj, ponieważ właśnie tutaj Google przyniósł mi odpowiedź, gdy szukałem odpowiedzi. Rzeczywiste pytanie, które dotyczy tej sytuacji jest tutaj. - joeytwiddle


Jeśli je zatwierdzisz, możesz także wybrać jeden identyfikator zatwierdzenia. Robię to często, gdy zaczynam pracę u mistrza, a następnie chcę utworzyć lokalny oddział, zanim wypchnę do mojego pochodzenia.

git cherry-pick <commitID>

Jest wiele rzeczy, które można zrobić, wybierając cherry-pick, zgodnie z opisem tutaj, ale to może być dla ciebie przypadek.


15
2017-11-30 20:58



Ładniejsze rozwiązanie przenoszenia częściowych zmian do nowej gałęzi ... ponieważ możesz teraz zatwierdzić to, co chcesz, przechowaj wszystkie inne zmiany, sprawdź gałąź, z której chcesz się rozgrupować, wybierz, które zatwierdziłeś w nowym oddziale, wróć do pierwotnego oddziału, twardy reset cofnij commit, następnie pop-up, dodaj, commituj i zaśpiewaj hallelujah. - Meredith
@Meredith, haha, coś w tym stylu. To świetnie, chyba że planujesz zmiany przed ... i kto to robi;) - password
Dzięki, właśnie uratowałeś moją cyfrową szyję - Phil