Примушуйте git stash замінити додані файли


223

У мене є кілька файлів, які не відстежуються в git. Я вніс деякі зміни і хотів їх здійснити, але зрозумів, що забув спочатку перевірити немодифіковані файли. Тож я приховав файли, потім додав немодифіковані версії.

Потім, коли я застосую сховище до сховища, у мене виникають конфлікти через вже додані файли.

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

Дякую


7
Потворне рішення, поки хтось не придумає кращого: видаліть нові файли за допомогою, git rmперш ніж робити git stash apply.
tom

Хіба це не втратить історію? Причиною додавання немодифікованих версій було збереження історії.
Стефан

1
Ні, вона не втратить історію. Якщо ви видалите файл, додайте його назад з невеликою модифікацією, а потім виконайте фіксацію, gitтрактуватиме його як лише невелику модифікацію.
tom

Відповіді:


364

Використовуйте git checkoutзамість git stash apply:

$ git checkout stash -- .
$ git commit

Це відновить усі файли в поточному каталозі до їх зашиваної версії.


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

$ git merge --squash --strategy-option=theirs stash

Якщо в індексі є зміни, або злиття торкнеться файлів з локальними змінами, git відмовиться від злиття. Окремі файли можна перевірити із сховища за допомогою

$ git checkout stash -- <paths...>

або інтерактивно з

$ git checkout -p stash

Жоден із них не працював у моєму випадку використання. Висновки та моє рішення - тут stackoverflow.com/a/26685296/496046 - це також повинно вирішити вашу ситуацію, @AlexanderBird
тремтіть

2
git checkout stash -- .Ця команда буквально нічого не робила, коли я виконував її.
Rotsiser Mho

3
@RotsiserMho Git не дуже добре надає повідомлення про підтвердження. Ви впевнені, що нічого не зробили? Для мене добре працювали.
Сінджай

5
Мені довелося запустити git checkout stash -- .у найвищій батьківській папці, яка містила мої зміни, інакше вона застосувала зміни лише до папки, з якої я запустив команду.
Лев

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

13

git stash show -p | git apply

а потім, git stash dropякщо ви хочете відкинути заховані предмети.


2
Примітка. Ви повинні бути в корені сховища, щоб це працювало правильно, інакше ви отримаєте це .
Руслан

@PengheGeng Як ​​ви бачите, я відповів приблизно за рік до NetEmmanuel
Hasan TBT

@Ruslan Я отримую це, перебуваючи в корені мого репортажу
Лев

6

Щоб примусити git stash popвиконати цю команду

git stash show -p | git apply && git stash drop

1

TL; DR:

git checkout HEAD path/to/file
git stash apply

Довга версія:

Ви отримуєте цю помилку через незахищені зміни, які ви хочете перезаписати. Скасуйте ці зміни за допомогою git checkout HEAD. Ви можете скасувати зміни до певного файлу за допомогою git checkout HEAD path/to/file. Після усунення причини конфлікту можна подати заявку як завжди.

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