git stash зміни застосовуються до нової гілки?


349

Я працював над головним відділенням, вносив деякі зміни, а потім приховував їх. Тепер мій майстер в ГОЛАДІ.

Але тепер я хочу отримати ці зміни, але до нової гілки, яка відгалужується від версії 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 .
Камафезер

Я також доопрацював це з git stash dropодного разу, коли я здійснив,
немедленний

221

Оскільки ви вже приховували свої зміни, все, що вам потрібно, - це один вкладиш:

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

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

Створює і перевіряє нову гілку з ім'ям < branchname > , починаючи з фіксації , при якій < тайник > був спочатку створений, застосовує зміни , записані в < збирати > для нового робочого дерева і індекс. Якщо це вдається, а < stash > є посиланням форми stash @ {< revision >}, він викидає < stash >. Якщо не вказано < скриш >, застосовується остання.

Це корисно, якщо гілка, на якій ви запустили git stash save, змінилася настільки, що застосувати git stash не вдалося через конфлікти. Оскільки приховування застосовано поверх комітету, який був HEAD під час запуску git stash, він відновлює початково сховане стан без конфліктів.


3
Для одиночних стасів це шлях. Посилання на сховане ім’я не потрібно, оскільки Git застосує останню скриньку, переключиться на нову гілку та застосує скриньку в 1 команді.
sinisterOrange

@RodneyGolpe Це, здається, також застосує скриньку до 'master'? Що я хочу зробити, це - від 'master', git stash, тоді я б очікував, що 'git stash branch [гілка] буде застосовано копію до нової гілки, залишивши master без змін?
Девід Дорія

2
@DavidDoria Ви повинні здійснити зміни у своїй новій гілці, перш ніж повернутися до майстра.
Родні Голпе

Тепер, коли також було здійснено зміни для майстра, а також ... я справді втрачений ... очевидно, я все ще не дуже розумію git. Після м'якого скидання майстра, а потім витягування з віддаленого репо тепер я там, де хотів бути. Майстер знаходиться в стані до змін. Нова філія проводить зміни.
Екштейн

1

Якщо у вас на робочому просторі є якісь зміни, і ви хочете сховати їх у новій гілці, скористайтеся цією командою:

git stash branch branchName

Це зробить:

  1. нова філія
  2. перемістити зміни до цієї гілки
  3. і видалити останню скриньку (як: git stash pop)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.