Проста відповідь на просте запитання git stash apply
Просто перевірте гілку, на якій потрібно змінити, а потім git stash apply
. Потім використовуйте, git diff
щоб побачити результат.
Після того, як ви все закінчите зі своїми змінами - це apply
добре виглядає, і ви впевнені, що вам більше не потрібна скринька - тоді використовуйте git stash drop
для її позбавлення.
Я завжди пропоную використовувати, git stash apply
а не використовувати git stash pop
. Різниця полягає в тому, що apply
залишає сховище навколо для легкої повторної спроби apply
або для перегляду тощо. Якщо pop
вдасться витягнути скриньку, вона негайно також drop
це зробить , і якщо ви раптом зрозумієте, що хотіли її десь витягти інше (в іншій галузі), або з --index
, або з деяким подібним, це не так просто. Якщо ви apply
, ви можете вибрати коли drop
.
Це все дуже незначно, так чи інакше, і для новачків, які гніють, це повинно бути приблизно однаково. (І все інше ви можете пропустити!)
Що робити, якщо ви робите більш досконалі або складніші речі?
Існує як мінімум три-чотири різних "способи використання git stash", як би там не було. Сказане вище для "шлях 1", "простий шлях":
Ви почали з чистої гілки, працювали над деякими змінами, а потім зрозуміли, що робите їх у неправильній гілці. Ви просто хочете прийняти зміни, які у вас є, і "перемістити" їх до іншої гілки.
Це простий випадок, описаний вище. Виконати git stash save
(або просто git stash
, те саме). Ознайомтеся з іншою галуззю та використовуйте git stash apply
. Це отримує git для об'єднання у ваші попередні зміни, використовуючи досить потужний механізм злиття git. Огляньте результати уважно (з git diff
), щоб побачити, чи вони вам сподобалися, а якщо вам це потрібно, скористайтеся, git stash drop
щоб скинути скриньку. Ви закінчили!
Ви розпочали деякі зміни та приховали їх. Потім ви перейшли в іншу гілку і почали ще зміни, забувши, що у вас були приховані.
Тепер ви хочете зберегти ці зміни або навіть перемістити ці зміни та застосувати також свої сховища.
Фактично ви можете git stash save
знову, як це git stash
робить "стек" змін. Якщо ви робите це, у вас є два сташі, один що називається stash
- але ви також можете писати - stash@{0}
і один написаний stash@{1}
. Використовуйте git stash list
(у будь-який час), щоб побачити їх усіх. Найновіший - це завжди найменший номер. Коли ви git stash drop
, це скидає найновіший і той, який stash@{1}
рухався до вершини стека. Якщо у вас ще більше, той , який був stash@{2}
стає stash@{1}
, і так далі.
Ви можете, apply
а потім drop
і певний сховище: git stash apply stash@{2}
і так далі. Відкинувши певну скриньку, перераховуйте лише ті, хто перелічується вище. Знову ж і той без числа stash@{0}
.
Якщо ви накопичите багато стасів, це може вийти досить безладним (це хотілося, stash@{7}
чи я хотів, чи це stash@{4}
? Зачекайте, я просто штовхнув іншого, зараз їх 8 та 5?). Я особисто вважаю за краще перенести ці зміни в нову гілку, тому що гілки мають назви, а cleanup-attempt-in-December
для мене значить набагато більше, ніж stash@{12}
. ( git stash
Команда приймає необов'язкове повідомлення збереження, і вони можуть допомогти, але якимось чином всі мої статистичні дані просто закінчуються назвами WIP on branch
.)
(Екстра-вдосконалений) Ви перед тим, як запустити, ви використовували git stash save -p
або ретельно git add
-ed та / або git rm
-ed певні біти коду git stash save
. У вас була одна версія в області індексу / інсценізації та інша (інша) версія в робочому дереві. Ви хочете зберегти все це. Отже, тепер ви використовуєте git stash apply --index
, а це часом не вдається:
Conflicts in index. Try without --index.
Ви використовуєте git stash save --keep-index
для перевірки "що буде вчинено". Цей виходить за межі цієї відповіді; перегляньте натомість цю іншу відповідь StackOverflow .
Для складних випадків я рекомендую спершу запуститись у «чистий» робочий каталог, внісши будь-які зміни, які у вас є зараз (у новій гілці, якщо вам подобається). Таким чином, "десь", що ви їх застосовуєте, немає нічого іншого в ньому, і ви просто будете намагатися приховати зміни:
git status # see if there's anything you need to commit
# uh oh, there is - let's put it on a new temp branch
git checkout -b temp # create new temp branch to save stuff
git add ... # add (and/or remove) stuff as needed
git commit # save first set of changes
Тепер ви на "чистому" стартовому пункті. А може, це виглядає більше так:
git status # see if there's anything you need to commit
# status says "nothing to commit"
git checkout -b temp # optional: create new branch for "apply"
git stash apply # apply stashed changes; see below about --index
Головне пам’ятати, що «приховування» - це фіксація, це лише трохи «смішне / дивне» вчинення, яке не «на гілці». В apply
операції дивиться на те , що Комміт змінилося, і намагається повторити його там , де ви зараз перебуваєте . Сховище все ще буде там ( apply
тримає його навколо), тож ви можете подивитися на це більше, або вирішити, що це було неправильне місце для apply
нього та спробувати ще раз по-іншому, чи що завгодно.
Кожен раз, коли у вас є копія, ви можете git stash show -p
переглянути спрощену версію того, що є в сховищі. (Ця спрощена версія розглядає лише зміни "остаточного дерева робіт", а не збережені зміни індексу, які --index
відновлюються окремо.) Команда git stash apply
без цього --index
просто намагається внести ті самі зміни у свою робочу директорію.
Це справедливо, навіть якщо ви вже маєте деякі зміни. apply
Команда рада застосувати притон до модифікованої робочої директорії (або , по крайней мере, спробувати застосувати його). Наприклад, ви можете зробити це:
git stash apply stash # apply top of stash stack
git stash apply stash@{1} # and mix in next stash stack entry too
Тут ви можете обрати порядок "застосувати", вибравши певні сташі, які слід застосувати у певній послідовності. Однак зауважте, що кожен раз ви робите "git merge", і як попереджує документація на об'єднання:
Запущене злиття git з нетривіальними невмілими змінами не рекомендує: хоча це можливо, воно може залишити вас у стані, від якого важко відмовитися у випадку конфлікту.
Якщо ви почнете з чистого каталогу та виконуєте декілька git apply
операцій, відмовитись легко: використовуйте, git reset --hard
щоб повернутися до чистого стану та змінити свої apply
операції. (Ось чому я рекомендую спочатку починати з чистого робочого каталогу для цих складних випадків.)
А як щодо найгіршого можливого випадку?
Скажімо, ви робите багато розширених Git Stuff, і ви зробили сховище, і хочете git stash apply --index
, але застосувати збережений прихований файл більше не можна --index
, тому що гілка розбіглася занадто багато з часу, коли ви її зберегли.
Це для чого git stash branch
.
Якщо ви:
- ознайомтеся з точною фіксацією ви були, коли ви зробили оригінал
stash
, то
- створити нову гілку, і нарешті
git stash apply --index
спроба відновити зміни, безумовно , спрацює. Це те, що робить. (А потім він скидає приховування, оскільки він був успішно застосований.)git stash branch newbranch
Кілька заключних слів про --index
(що це за чорт?)
Що --index
можна зробити, пояснити просто, але все-таки трохи складно:
- Коли у вас є зміни, ви повинні
git add
(або "поетапно") їх перед початком commit
.
- Таким чином, коли ви бігли
git stash
, ви, можливо , редагували обидва файли foo
та zorg
, але лише ставили один із них.
- Так що, коли ви просите , щоб отримати збирати назад, було б добре , якщо це
git add
вляет add
ред речі і зовсім НЕ git add
в не-додані речі. Тобто, якщо ви add
редагували, foo
але не zorg
поверталися до того stash
, як це зробили , може бути непогано мати таку саму настройку. Те, що було поставлено, слід знову поставити; те, що було видозмінено, але не інсценоване, знову має бути змінено, але не поетапно.
--index
Прапор apply
намагається встановити речі таким чином. Якщо ваше робоче дерево є чистим, це зазвичай просто працює. Якщо у вашому робочому дереві вже є речі add
, ви можете побачити, як тут можуть виникнути деякі проблеми. Якщо ви вийдете з роботи --index
, apply
операція не намагатиметься зберегти всю поетапну / нестандартну установку. Натомість він просто викликає механізм злиття git, використовуючи команду робочого дерева у "сумці" . Якщо ви не дбаєте про те, щоб зберегти поетапні / нестандартні, виведення з --index
нього робить його набагато простішим git stash apply
.