Weź wszystkie moje zmiany z bieżącej gałęzi i przenieś je do nowej gałęzi w Git

105

Zacząłem pracować nad tym, co według mnie będzie drobną poprawką błędu w mojej gałęzi głównej. Jednak wymknęła się spod kontroli do tego stopnia, że ​​żałuję, że nie stworzyłem oddzielnej gałęzi, aby zajmować się rozwojem.

Więc teraz chciałbym zrobić:

  1. Utwórz nową gałąź o nazwie (powiedzmy) „krawędź”
  2. Przenieś wszystkie zmienione / nieśledzone pliki z mastera do edge (taki, że master pozostaje niezmieniony od kiedy zacząłem naprawianie błędów)
  3. Zakończ moją pracę na krawędzi, połącz się z powrotem w mistrza

W jaki sposób mogę to zrobić?

Tom Lehman
źródło

Odpowiedzi:

103

Jeśli jeszcze nic nie popełniłeś, jesteś już na właściwej pozycji.

  1. Utwórz nowy oddział: git checkout -b edge
  2. Twoje pliki nie uległy zmianie. Po prostu git addto, co trzeba i zaangażuj jak zwykle.
  3. Kiedy skończysz zatwierdzać edge, przełącz się z powrotem na za masterpomocą git checkouti git merge edge.
JB.
źródło
Jeszcze nic nie popełnił, więc pierwsza linia była mile widziana ... uff, to było właściwie bezbolesne :-)
Drenai
87

Aby dodać do odpowiedzi JB, jeśli już zacząłeś robić kilka zatwierdzeń na master, co okazało się wysiłkiem "przewagi", możesz:

git stash
git checkout -b edge master
git branch -f master SHA1_before_your_commits
git stash apply
VonC
źródło
opakowanie skrytki nie jest absolutnie konieczne, ale tylko do niezatwierdzonych zmian roboczych, prawda?
HaveAGuess
4
@ Miej rację. Przez „weź wszystkie moje zmiany” uwzględniam również zmiany, które nie zostały jeszcze dodane. Stąd skrytka.
VonC,
Czy druga i trzecia linia nie mogła zostać zwinięta do postaci „git checkout -b edge master”?
Paul Lynch,
@PaulLynch, biorąc pod uwagę te zatwierdzenia (włączone master), które powinny być włączone, edge włączone master, tak. Poprawiłem odpowiedź.
VonC
Nie widzę, jak git stashto jest przydatne, ponieważ użycie w git checkout -bogóle nie modyfikuje drzewa roboczego ...
user1686
13

Jeśli próbujesz przenieść pracę z mastera do gałęzi, która już istnieje, ale znajduje się za master, git nie pozwoli ci przełączyć się na inną gałąź. W takim przypadku zrób to:

git stash
git checkout oldBranch
git merge master
git checkout master
git stash apply
git checkout oldBranch
Jesse P.
źródło