Utwórz gałąź Git z bieżącymi zmianami

848

Zacząłem pracować nad moją główną gałęzią, myśląc, że moje zadanie będzie łatwe. Po chwili zdałem sobie sprawę, że zajmie to więcej pracy i chcę wykonać całą tę pracę w nowym oddziale.

Jak mogę utworzyć nowy oddział i zabrać ze sobą wszystkie te zmiany bez brudzenia mistrza ?

willcodejavaforfood
źródło
4
Tak, są to duplikaty pytań, ale sformułowanie jest tak różne, że myślę, że warto je zachować. Zwróć uwagę na słowa kluczowe tutaj: branch current changesvs existing uncommited branch. Każdy, kto mówi po angielsku, natychmiast zauważy, że są tacy sami, ale wyszukiwarki prawdopodobnie tego nie zrobią. Zachowaj to pytanie.
Scott Biggs,

Odpowiedzi:

690

Jeśli jeszcze nie dokonałeś żadnego zatwierdzenia, wystarczyłyby tylko (1: oddział) i (3: kasa).
Lub jednym poleceniem:git checkout -b newBranch

Jak wspomniano na git resetstronie podręcznika :

$ git branch topic/wip     # (1)
$ git reset --hard HEAD~3  # (2)  NOTE: use $git reset --soft HEAD~3 (explanation below)
$ git checkout topic/wip   # (3)
  1. Podjąłeś pewne zobowiązania, ale zdaj sobie sprawę, że przedwczesne było być w mastergałęzi. Chcesz kontynuować polerowanie ich w gałęzi tematu, więc utwórz topic/wipgałąź „ ” poza bieżącym HEAD.
  2. Przewiń mastergałąź, aby pozbyć się tych trzech zmian.
  3. Przejdź do topic/wipgałęzi „ ” i kontynuuj pracę.

Uwaga: ze względu na „niszczący” efekt git reset --hardpolecenia (resetuje indeks i działające drzewo. Wszelkie zmiany w śledzonych plikach w działającym drzewie, ponieważ <commit>zostały odrzucone), wolałbym:

$ git reset --soft HEAD~3  # (2)

Dzięki temu nie stracę żadnego prywatnego pliku (nie dodanego do indeksu).
Ta --softopcja w ogóle nie dotyka pliku indeksu ani drzewa roboczego (ale resetuje głowicę <commit>, tak jak robią to wszystkie tryby).


Z Git 2.23+ The nowa komendagit switch by utworzyć oddział w jednej linii (z tego samego rodzaju reset --hard, więc strzeżcie się jego wpływu):

git switch -f -c topic/wip HEAD~3
VonC
źródło
6
Prawdopodobnie warto również zauważyć, że nie byłby to dobry pomysł, gdybyś wysłał materiały tematyczne do swojej głównej gałęzi w repozytorium, z którego czerpią inni ludzie. A przynajmniej, jeśli musisz zresetować, musisz powiedzieć ludziom, że to właśnie robisz, aby ostrzeżenia przed następnym pociągnięciem nie były zbyt wielkim szokiem.
Andrew Walker,
38
Uwaga dla przyszłych czytelników: czytaj od dołu do góry (lub koniecznie przeczytaj całość). git reset --hardpodważą twoje zmiany, a jeśli nie zostaną jeszcze popełnione, są nie do odzyskania! Może potrzebujeszgit checkout -b …
Conrad Meyer
3
@ConradMeyer Dobry punkt. Zredagowałem odpowiedź i postawiłem git checkout -bpierwszą.
VCC
5
Dlaczego temat / gałąź? dlaczego nie tylko nazwa gałęzi, czy istnieje jakiś szczególny powód tego nazewnictwa? tylko się zastanawiam.
Sam Stoelinga
1
@Jest to tylko konwencja nazewnictwa przestrzeni nazw (sposób na łatwą klasyfikację gałęzi, używając hierarchicznych nazw gałęzi do definiowania przestrzeni nazw): stackoverflow.com/a/2527436/6309 . Na przykład w przypadku problemów: randyfay.com/content/… . Nie musisz używać hierarchii, nazywając swoje oddziały. topic_wipteż by działało;)
VonC
269

Jak stwierdzono w tym pytaniu: Git: utwórz gałąź z nieoznaczonych / niezaangażowanych zmian w master : ukrywanie nie jest konieczne.

Po prostu użyj:

git checkout -b topic/newbranch

Wszelkie niezaangażowane prace zostaną zabrane do nowego oddziału.

Jeśli spróbujesz pchać, pojawi się następujący komunikat

krytyczny: bieżąca funkcja gałęzi / NEWBRANCH nie ma żadnej gałęzi upstream. Aby przesunąć bieżącą gałąź i ustawić pilota jako wysyłającego, użyj

git push --set-upstream origin feature/feature/NEWBRANCH

Po prostu zrób zgodnie z sugestią, aby utworzyć oddział zdalnie:

git push --set-upstream origin feature/feature/NEWBRANCH

EeKay
źródło
3
Błąd „brak odgałęzienia” pojawi się tylko wtedy, gdy przesuniesz nowy rozgałęzienie, a nie podczas zatwierdzania nowej pracy.
Sam
2
@sam Poprawiłem odpowiednio odpowiedź
Nick Kennedy,
73

Wykonaj następujące kroki:

  1. Utwórz nowy oddział:

    git branch newfeature
    
  2. Kasa nowego oddziału: (to nie zresetuje pracy).

    git checkout newfeature
    
  3. Teraz powierz swoją pracę w tym nowym oddziale:

    git commit -s
    

Wykonanie powyższych kroków sprawi, że twoja oryginalna gałąź pozostanie czysta i nie będziesz musiał wykonywać żadnych operacji „git reset --hard”.

AvadhP
źródło
3
Co oznaczają „-s” w kroku 3?
Scott Biggs,
12
@ScottBiggs Jest to niepotrzebne, ale praktyka stosowana przez niektórych ludzi. Jest skrótem od „--signoff” i dodaje twoją nazwę użytkownika do zatwierdzenia, aby przyszli ludzie przeglądający logi wiedzieli, że zaakceptowałeś to zatwierdzenie.
Frank Bryce,
5
Dobra odpowiedź, ale nie ma potrzeby wykonywania -skroku 3.
Mohammed Ali,
Nauczyłem się czegoś nowego z komentarza: Dzięki @FrankBryce
Kasparov92
30

Ponieważ nie dokonałeś jeszcze żadnych zatwierdzeń, możesz zapisać wszystkie zmiany w skrytce, utworzyć i przejść do nowej gałęzi, a następnie wrzucić te zmiany z powrotem do działającego drzewa:

git stash  # save local modifications to new stash
git checkout -b topic/newbranch
git stash pop  # apply stash and remove it from the stash list
Eter
źródło
9
lub jak zauważył VonC „git Checkout -b newbranch” i pomiń
skrytkę
@will: Myślałem, że utworzenie nowego oddziału zastąpi wszelkie niezatwierdzone zmiany, ale jeśli tak nie jest, tak, możesz pominąć skrytkę.
Eter
1
Próbowałem i działało dobrze, git jest bardzo przemyślany i nie zastąpi żadnych lokalnych zmian
willcodejavaforfood 10.10.10
2
Zakładam, że to była literówka, ale tylko jedna głowa, która git stash pushnie jest poleceniem. Prawdopodobnie chcesz użyć git stashlub git stash save. Jeśli chcesz dołączyć do schowka nieśledzone pliki, skorzystaj z --include-untrackedopcji. Podobnie, jeśli chcesz uwzględnić zarówno ukryte, jak i ignorowane pliki w skrytce, użyj --addopcji.
Sześć
w przypadku, gdy już utworzyłeś oddział, jest to pomocne.
Z pewnością
13

Aby dodać nowe zmiany do nowego oddziału i wypchnąć zdalnie:

git branch branch/name
git checkout branch/name
git push origin branch/name

Często zapominam dodać część źródłową, aby wypchnąć i pomylić, dlaczego nie widzę nowej gałęzi / zatwierdzenia w bitbucket

Patrick Schaefer
źródło