Возьмите все мои изменения в текущей ветке и переместите их в новую ветку в Git

105

Я начал работу над исправлением небольшой ошибки в моей основной ветке. Однако он вышел из-под контроля до такой степени, что мне жаль, что я не создал отдельную ветку для разработки в первую очередь.

Итак, прямо сейчас я хотел бы сделать следующее:

  1. Создайте новую ветку под названием (скажем) "край"
  2. Переместите все измененные / неотслеживаемые файлы с мастера на край (таким образом, чтобы мастер не изменился с того момента, когда я начал исправление ошибки)
  3. Закончите свою работу на грани, снова слейтесь с мастером

Как я могу это сделать?

Том Леман
источник

Ответы:

103

Если вы еще ничего не совершали, значит, вы уже в правильном положении.

  1. Создайте новую ветку: git checkout -b edge
  2. Ваши файлы не изменились. То, git addчто нужно, и совершайте как обычно.
  3. Когда вы закончите коммит edge, вернитесь к masterкнопкам git checkoutи git merge edge.
JB.
источник
Еще ничего не совершил, так что первая линия была долгожданным зрелищем ... уф, на самом деле это было довольно безболезненно :-)
Дренай
87

Чтобы добавить к ответу JB, если вы уже начали делать несколько коммитов на мастере для того, что в конечном итоге было «крайним» усилием, вы могли бы:

git stash
git checkout -b edge master
git branch -f master SHA1_before_your_commits
git stash apply
VonC
источник
обертка stash не является строго необходимой, но только для незафиксированных рабочих изменений, верно?
HaveAGuess
4
@ Угадай. Под словом «принять все мои изменения» я также включил текущие, еще не добавленные изменения. Отсюда и заначка.
VonC
Нельзя ли свернуть вторую и третью строки в «git checkout -b edge master»?
Пол Линч
@PaulLynch рассмотрения этих фиксаций (на master) , которые должны быть на edge которые на master, да. Я отредактировал ответ.
VonC
Я не понимаю, насколько git stashэто полезно, поскольку использование git checkout -bвообще не изменяет рабочее дерево ...
user1686
13

Если вы пытаетесь переместить работу из master в ветку, которая уже существует, но находится за master, git не позволит вам переключиться на другую ветку. В этом случае сделайте так:

git stash
git checkout oldBranch
git merge master
git checkout master
git stash apply
git checkout oldBranch
Джесси П.
источник