Скасувати git stash pop, що призводить до конфлікту злиття


518

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

Як тільки я відтворив нову гілку правильно, як я можу відновити сховані зміни, щоб правильно їх застосувати?

Відповіді:


655

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

  1. Щоб усунути конфлікти злиття: git reset HEAD .(зверніть увагу на кінцеву крапку)
  2. Щоб зберегти суперечливе злиття (про всяк випадок): git stash
  3. Щоб повернутися до майстра: git checkout master
  4. Щоб отримати останні зміни: git fetch upstream; git merge upstream/master
  5. Щоб виправити нову гілку: git checkout new-branch; git rebase master
  6. Щоб застосувати правильні сховані зміни (тепер 2-е в стеку): git stash apply stash@{1}

14
Відмінна подяка! №6 - це справді відповідь, яку я шукав. Не git stash dropвдалося додати як останній крок для позбавлення від небажаного сховища з №2.
austinmarton

1
# 2 не працюватиме, якщо є неперекладені шляхи, він замість цього виведе описану тут помилку: stackoverflow.com/questions/5483213/…
Етьєн

5
Не зовсім вірно - Git збереже сховище у списку скриньки, якщо не вдалося застосувати його чисто. Дивіться ці документи про git stash pop: "Застосування стану може не вдатися до конфліктів; у цьому випадку він не видаляється зі списку сховищ. Вам потрібно вирішити конфлікти вручну та зателефонувати git stash dropвручну". ( git-scm.com/docs/git-stash )
Carolyn Conway

4
Дивно, як ця відповідь і питання розміщені точно в ту саму хвилину
зателефонуйте мені

14
@ call-me Це те, що я думаю, що люди повинні насправді робити частіше! Зверніть увагу, як у формі "Задати запитання" встановлено прапорець, за допомогою якого ви зможете відповісти на власне запитання в тій же формі :). Це трапляється зі мною іноді, коли я знаходжу питання, яке мене обминає, але намагаючись налаштувати питання на користь StackOverflow, я закінчую розгадку рішення. Це було деякий час тому, тому я не пам’ятаю, чи так це було тут, але я здогадуюсь, що так сталося.
acjay

340

На щастя git stash pop, не змінюється приховування у випадку конфлікту!

Тож нічого, турбуватися, просто очистіть код і спробуйте його ще раз.

Скажімо, ваша кодова база раніше була чистою, ви можете повернутися до цього стану за допомогою: git checkout -f
Потім виконайте речі, які ви забули, наприклад, git merge missing-branch
після цього просто запустіть git stash popще раз, і ви отримаєте ту саму скриньку, що конфліктували раніше.

Увага: сховище в безпеці, однак, незапущені зміни в робочому каталозі не є. Вони можуть заплутатися.


16
Що я розумію, це те, що ви можете просто очистити та повторити, але ви не можете скасувати це. Якщо поп змішується з іншими неспроможними змінами, тоді вам доведеться чистити вручну.
haridsv

Це дуже просте рішення і чудово працювало для мене. Це передбачає, що ви можете повернути все, що змінилося на місцях (не було змін до / після того, як з'явилася скринька), що, на мою думку, працює в більшості ситуацій. Якщо вам потрібно було зберегти деякі додаткові зміни, які відбулися до того, як зрозуміли, що це проблема, ви повинні мати можливість скористатися цими файлами, перш ніж примушувати оформляти замовлення в більшості випадків.
Project707

Для мене це було не так. Я назвав git stash popце спробою автоматичного злиття, конфлікту та збереження.
Тревор Хікі

1
@TrevorHickey Суть цієї відповіді полягала в тому, що сховище залишається таким, як є у випадку конфлікту, і ви можете дзвонити git stash popтак часто, як вам потрібно, поки це не закінчиться без конфлікту. Тож після вашого конфлікту, так, робочий каталог знаходиться в безладі, проте ви можете його очистити та зателефонувати git stash popще раз.
flori

5
ця команда для скасування останнього застосунку приховування дуже корисна git checkout -f:!
Лефі Тарік

16

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

  1. git reset HEAD --hard Відмовитися від усіх змін у поточній гілці

  2. ... Виконайте посередницьку роботу за потребою

  3. git stash pop Пізніше знову поставте сховище, коли будете готові



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