Відміняє випадковий git stash pop


186

Я приховав деякі локальні зміни, перш ніж здійснити складне злиття, зробив злиття, а потім тупо забув здійснити перед запуском git stash pop. Поп створив деякі проблеми (погані виклики методів у великій кодовій базі), які важко знайти. Я побіг git stash show, тому я принаймні знаю, які файли було змінено. Якщо нічого іншого, я думаю, це урок зробити більше.

Моє запитання: чи можна скасувати прихований поп, а також не скасовуючи злиття?


2
Ви не повинні бути дозволені git stash popбез попереднього вчинення. Що ти зробив для цього?
Кріс Єстер-Янг

Не впевнений, чесно (це було вчора). Злиття не здійснилося самостійно, оскільки виникли конфлікти. Мені якимось чином вдалося запустити прихований поп після цього.
nren

1
Я це просто знаю, використовуючи git версії 1.7.9.msysgit.0. У мене були неразовані файли, а скриптова поп просто об'єднав все.
PandaWood

Мені вдалося запуститись git stash popпісля постановки змін (я не брав на себе зобов'язання) з версією 2.25.0.windows.1 версії git
Артем Геворхіан

Якщо ви проіндексували зміни та втратили їх, коли ви бігли, stash pop/applyперш ніж взяти на себе зобов’язання, ви можете звільнити git fsck --lost-found. Ця команда буде повторювати через висячі краплі (фактичні файли для тих, хто не знайомий з термінологією git), які були інсценовані, але не вчинені ніде (тому звисають), і помістить їх у каталог .git / lost-found / , де ви можете git showїх побачити та побачити якщо це файли, які ви шукаєте.
Артем Геворхіян

Відповіді:


69

Спробуйте скористатися Як відновити скинуту скриньку в Git? щоб знайти скрипт, який ви вискакували. Я думаю, що для зберігання завжди є два коміти, оскільки він зберігає індекс і робочу копію (тому часто фіксація індексу буде порожньою). Потім git showїх побачити різницю і використовувати їх, patch -Rщоб не застосовувати їх.


6
Нічого, що спрацювало. Мені вдалося знайти приховані скриньки git fsck --no-reflog | awk '/dangling commit/ {print $3}'(за посиланням), і я просто вручну знайшов проблему з цієї розріз. Дякую!
nren

1
fsck виводить величезний список. Її нудна виставка показує кожен SHA1 там. Як це зробити?
meson10

5
@ meson10: На жаль, сховища зберігаються в рефлозі, що було б очевидним способом (якби вони були справжньою гілкою), щоб подивитися на історію вискочивших прихованих матеріалів. Дозвольте також припустити, що знищення + прохання про допомогу - не найкраща стратегія.
Бен Джексон

2
Мені знадобилося трохи похизуватися, щоб зрозуміти це правильно. Ось результат моєї роботи git diff -p ${STACH_SHA1}~1 ${STASH_SHA1} | patch -R -p1:; Я спробував, git showяк було запропоновано, але вихід не був хорошим для виправлення; Також мені довелося надати -p1можливість виправлення, щоб зняти елемент a/..і b/..елемент, який git diffставить перед файлами, інакше це не дозволить вирішити шляхи від кореня сховища. ПРОПОЗИЦІЯ: будьте обережні і вчиняйте безлад в окремій гілці перед грою з патчем.
basilikode

@BenJackson У вашій відповіді "завжди" означає і те, stash popі інше, і stash pushпризведе до виконання зобов'язання, яке збереже зміни в індексі та робочому каталозі, правда?
Артем Геворгій

36

З git stash --help

Recovering stashes that were cleared/dropped erroneously
   If you mistakenly drop or clear stashes, they cannot be recovered through the normal safety mechanisms. However, you can try the
   following incantation to get a list of stashes that are still in your repository, but not reachable any more:

       git fsck --unreachable |
       grep commit | cut -d\  -f3 |
       xargs git log --merges --no-walk --grep=WIP

Це допомогло мені краще, ніж прийнята відповідь з тим самим сценарієм.


13
Зауважте, що багато рішень, пов’язаних із пошуком "WIP", покладаються на скриньки за замовчуванням. Якщо ви надаєте свої скрині явні повідомлення, вони можуть не містити WIP.
Бен Джексон

Дякую. До команди журналу я додав опцію --lineline для поліпшення читабельності.
бассло

Це лише допомагає вам знайти SHA комісії. Але якщо інтегруватись із коментарем @basilikode із прийнятої відповіді (git diff SHA ~ 1 SHA | patch -R), це працює добре. Я рекомендую використовувати для перевірки спочатку шлях - пробіг.
Jarek C

3

Якщо ваше злиття не було занадто складним, іншим варіантом було б:

  1. Перемістіть усі зміни, включаючи зміни об’єднання назад, у сховище, використовуючи "git stash"
  2. Виконайте злиття ще раз і введіть свої зміни (без змін зі скинутої скриньки)
  3. Запустіть "git stash pop", який повинен ігнорувати всі зміни попереднього злиття, оскільки файли тепер однакові.

Після цього вам залишаються лише ті зміни, які ви залишили занадто рано.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.