git stash изменения применяются к новой ветке?

349

Я работал над основной веткой, сделал некоторые изменения и затем спрятал их. Теперь мой мастер в HEAD.

Но теперь я хочу получить эти изменения, но в новую ветвь, которая ветвится из версии HEAD главной ветки.

Как мне это сделать ?

Яш Десаи
источник
3
Я думаю, что вы ищете это? stackoverflow.com/questions/556923/…
zx1986

Ответы:

506

Стандартная процедура не работает?

  • вносить изменения
  • git stash save
  • git branch xxx HEAD
  • git checkout xxx
  • git stash pop

Короче:

  • вносить изменения
  • git stash
  • git checkout -b xxx
  • git stash pop
Андрейс Кайников
источник
8
@sfletche, если вы хотите назвать ваш тайник, вам нужно сделать git stash save <name>, иначе, как вы говорите, это то же самое, что и git stash.
SgtPooki
5
После использования этого подхода кажется, что если вы вернетесь к предыдущей ветке, сохраненные изменения вернулись. Возможно ли сохранить только новые изменения на новой ветке?
Томас Хиггинботам
Просто внесите свои изменения в новую ветку.
ChrisR
2
@ThomasHigginbotham нет, рабочий каталог является общим для филиалов и копируется из одной в другую при переходе из одной ветви в другую. Для «достижения» того, что вы хотите, я обычно делаю различные тайники, добавляя полезное описание с помощью git stash save "description"команды, упомянутой ранее; а затем я git clearветвь (для уничтожения фактического рабочего каталога), а затем git stash apply stash@{my_desired_stash}в нужной ветке (после переключения на это с git checkout <branch>очевидно). Я знаю, что это не настоящее решение, но лучшее, что вы можете сделать с помощью git .
Kamafeather
Я также доработал это git stash dropпосле того, как совершил
oddmeter
221

Поскольку вы уже спрятали свои изменения, все, что вам нужно, это одна строка:

  • git stash branch <branchname> [<stash>]

Из документов ( https://www.kernel.org/pub/software/scm/git/docs/git-stash.html ):

Создает и извлекает новую ветвь с именем < branchname >, начиная с коммита, в котором изначально был создан < stash >, применяет изменения, записанные в < stash >, к новому рабочему дереву и индексу. Если это удается, и < stash > является ссылкой на форму stash @ {< revision >}, он удаляет < stash >. Когда < stash > не указан, применяется последний.

Это полезно, если ветка, в которой вы запустили git stash save, изменилась настолько, что git stash не удалось применить из-за конфликтов. Поскольку хранилище применяется поверх коммита, который был HEAD во время запуска git stash, он восстанавливает исходно сохраненное состояние без конфликтов.

Родни Голпе
источник
3
Для одиночных тайников это путь. Ссылка на имя хранилища не требуется, так как Git будет применять последний хранилище, переключаться на новую ветку и применять хранилище в 1 команде.
Зловещий
@RodneyGolpe Это, кажется, также применить тайник к «хозяину»? Что я хочу сделать, так это от 'master', git stash, а затем я ожидал, что 'git stash branch [branchname] применит stash к новой ветке, оставив master без правок?
Дэвид Дория
2
@DavidDoria Вы должны зафиксировать изменения в вашей новой ветке, прежде чем вернуться к мастеру.
Родни Голпе
Теперь это также передало изменения мастеру ... Я действительно в растерянности ... очевидно, я все еще не совсем понимаю git. После мягкого сброса мастера, затем вытащил из удаленного репо теперь я там, где я хотел быть. Мастер находится в состоянии до изменений. Новая ветка содержит изменения.
Ekkstein
1

Если у вас есть какие-то изменения в вашей рабочей области, и вы хотите сохранить их в новой ветке, используйте эту команду:

git stash branch branchName

Это сделает:

  1. новая ветка
  2. перенести изменения в эту ветку
  3. и удалите последний тайник (как: git stash pop)
Хамед Яранди
источник