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ć?

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.

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.