Відповіді:
Коли мені доведеться застосувати сховані зміни до брудної робочої копії, наприклад, вивівши більше одного набору змін зі сховища, я використовую наступне:
$ git stash show -p | git apply -3 && git stash drop
В основному це
Цікаво, чому немає жодного -f
(силового) варіанту, git stash pop
який би мав би вести себе так, як однолінійний вище.
Тим часом ви можете додати цей однокласник як псевдонім git:
$ git config --global --replace-all alias.unstash \
'!git stash show -p | git apply -3 && git stash drop'
$ git unstash
Дякуємо @SamHasler за вказівку -3
параметра, який дозволяє вирішувати конфлікти безпосередньо за допомогою тристороннього злиття.
git stash apply
не застосує прихованих змін, якщо у вас є брудна робоча копія. Таким чином, ви можете бачити, git stash show -p | git apply
як застосовується якесь примусове сховище.
error: <file> does not match index
до кожного зміненого файлу. Однак інше рішення спрацювало.
Я роблю це таким чином:
git add -A
git stash apply
а потім (необов'язково):
git reset
git add -u
, що схоже, -A
за винятком того, що він не додає файли без відстеження.
Це можна зробити, не зберігаючи поточні зміни, експортувавши потрібну копію у файл патчу та застосувавши її вручну.
Наприклад, скажіть, що ви хочете застосувати скриньку @ {0} до брудного дерева:
Експортуйте скриньку @ {0} як виправлення:
git stash show -p stash @ {0}> Stash0.patch
Застосуйте зміни вручну:
git застосувати Stash0.patch
Якщо другий крок не вдасться, вам доведеться відредагувати файл Stash0.patch, щоб виправити помилки, а потім спробувати застосувати git знову.
Чи очистіть робочий каталог за допомогою скидання git, введіть зміни або, якщо ви хочете приховати поточні зміни, спробуйте:
$ git stash save "опис поточних змін" $ git stash pop скринька @ {1}
Це дозволить приховати поточні зміни, а потім вивести другий пристрій зі стека.
Рішення Матіаса, безумовно, найближче до git stash pop - force (і справді, хай Git devs, давайте вже цей варіант!)
Однак якщо ви хочете зробити те саме, використовуючи лише команди git, ви можете:
Іншими словами, прийміть на себе зобов’язання (які ми ніколи не будемо наполягати) на своїх поточних змінах. Тепер, коли ваша робоча область чиста, виведіть свій приклад. Тепер виконайте приховані зміни як доповнення до попереднього зобов’язання. Зробивши, що тепер у вас є обидва набори змін, об'єднані в один комітет ("Виправлення"); просто скиньте (--soft НЕ - важко, так що насправді нічого не втрачено) ваш замовлення на "один до того, як здійснити", і тепер у вас є обидва набори змін, повністю не видалені.
** редагувати * *
Я просто зрозумів, що насправді навіть простіше; ви можете повністю пропустити крок 3, тому ...
(Здійснити поточні зміни, спливати приховані зміни, скинути спочатку виконання зобов’язань, щоб об'єднати обидва набори змін у непосланому стані.)
Жодна з цих відповідей насправді не спрацьовує, якщо ви опинитесь у цій ситуації, як я сьогодні. Незалежно від того, скільки git reset --hard
я зробив, мене ніде не було. Моя відповідь (офіційною жодним чином не була):
git reflog --all
Я також виявив , що рішення Матіаса Леппіха чудово працює, тому я додав псевдонім для цього у свій глобальний .gitconfig
[alias]
apply-stash-to-dirty-working-tree = !git stash show -p | git apply && git stash drop
Тепер я можу просто набрати
git apply-stash-to-dirty-working-tree
що чудово працює для мене.
(Ваш пробіг може залежати від цього довгого псевдоніму. Але мені подобається доза багатослівності, коли мова йде про завершення баш.)
Ви можете застосувати сховище до "брудного" дерева, зробивши git add
поетапно будь-які внесені вами зміни, таким чином очистивши дерево. Тоді ви можете git stash pop
застосувати приховані зміни, без проблем.
У вас є файли, які були змінені, але не зафіксовані. Або:
git reset --hard HEAD (to bring everything back to HEAD)
або, якщо ви хочете зберегти свої зміни:
git checkout -b new_branch
git add ...
git commit
git checkout -b old_branch
git stash pop
Я не зміг змусити більшість із них працювати; чомусь завжди вважає, що я маю локальні зміни у файлі. Я не можу застосувати приховану скриньку, патчі не застосовуватимуться checkout
та reset --hard
не вдаються. Що, нарешті, працювало - це збереження сховища як філії git stash branch tempbranchname
, а потім звичайне злиття гілки: git checkout master
і git merge tempbranchname
. Від http://git-scm.com/book/en/Git-Tools-Stashing :
Якщо ви хочете знову простіше перевірити приховані зміни, ви можете запустити гілку прихованої гілки, яка створює для вас нову гілку, перевіряє зобов’язання, на яких ви були, коли ви призупинили свою роботу, знову додає свою роботу там, а потім скидає приховувати, якщо він успішно застосовується
git stash show -p | git apply
відрізняється відgit stash apply
?