Как отменить git stash применить - PullRequest
0 голосов
/ 28 ноября 2018

Я не внес изменения в мою ветку.Я решил применить некоторые мои тайники.Шкатулка применяется с автоматическим слиянием и конфликтами.Я понимаю, что спрятанные изменения не подходят для меня и хотят отменить изменения, но не потерять свои изменения перед копированием.Пытался сделать

git stash show -p | git apply -R

, но это не работает для меня.У меня ошибка с сообщением: ошибка: исправление не выполнено, ... ошибка: исправление не применяется

Как отменить загрузку тайника и не потерять мои не зафиксированные изменения?

1 Ответ

0 голосов
/ 28 ноября 2018

Проблема обратного применения тайника связана с конфликтами слияния.В конце я более подробно расскажу об этом, если вы хотите вникнуть в это, но что более важно: что делать вместо этого?

Обычно git stash apply - довольно безопасная команда.Требуется, чтобы рабочее дерево соответствовало индексу, и ожидается, что оно будет записано только в рабочее дерево, поэтому отменить его будет просто.

Это может быть немного болезненно, когда возникают конфликты, хотя, потому что теперь он обновляет индекс для разрешения конфликтов.Итак, теперь для каждого файла есть (как минимум) пять возможных состояний:

1) Ни ваши локальные изменения, ни примененные к тайнику изменения в файле.Здесь нечего видеть.

2) Вы применили локальные изменения к файлу, а тайник не применил изменения к файлу.Ваша локально измененная версия находится в индексе, и вы можете оставить этот файл в покое.

3) Вы не применили локальные изменения к файлу, и тайник действительно применил к нему изменения.Индекс содержит файл, измененный тайником.Это очень похоже на случай 2, поэтому зная разницу - первая проблема (см. Ниже);После того как вы определили файл в этом состоянии, вы можете вернуть этот файл к ранее зафиксированной версии (но, возможно, пока не захотите; снова, см. ниже)

git checkout HEAD -- file/with/only/stashed/changes

4) Вы применили локальные измененияк файлу, и тайник применил конфликтующие изменения к тому же файлу.В этом случае отмеченная конфликтом версия файла находится в рабочем дереве.Вы можете восстановить свою версию, сказав

git checkout --ours -- file/with/conflicting/changes

5) Вы применили локальные изменения к файлу, а хранилище применило изменения к тому же файлу, но изменения не конфликтуют (т. Е. Автоматическое разрешение слияния объединеноизменения успешно).Это самый большой проблемный случай.Он снова выглядит почти так же, как случаи 2 и 3, и для его исправления необходимо отделить изменения от изменений, добавленных копилкой.

Хорошо, поэтому случаи 1 и 2 не предпринимают никаких действий, а 4 легконайти и решить.Проблемы 3 и 5. Есть два способа исправить это:

Основываясь на том, что вы пытались сделать раньше, вы можете сохранить патч из тайника и удалить записи для файлов.которые были в конфликте .Затем вы бы разрешили конфликты с помощью checkout --ours и применили бы остальную часть патча в обратном порядке.

Вы можете обработать его файл за файлом, используя

git stash show --name-only

, чтобы увидеть,stash изменил файл и что-то вроде

git diff stash -- path/to/file

, чтобы увидеть, содержит ли файл локальные изменения.Вам все равно придется сделать что-то вроде обратного исправления для файлов, которые были изменены в обоих местах без конфликтов.

Почему исправление не работает

Тайникне может быть применен в качестве исправления из-за маркеров конфликта.Например, возможно, вы начали с файла

this
is
content

и тайник хочет изменить его на

here
is
content

, но вы локально изменили его на

this
file contains
content

1048 * получил конфликт.Что ж, теперь рабочая копия говорит:

<<<<<<< Updated upstream
this
file contains
=======
here
is
>>>>>>> stashed changes
content

Обратный патч из тайника изменит строку 1 с here на this, но не найдет here в строке 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...