Я открыл тайник, и произошел конфликт слияния. В отличие от вопроса, который указан как дубликат, у меня уже были некоторые незафиксированные изменения в каталоге, которые я хотел сохранить. Я не просто хочу, чтобы конфликт слияния исчез, но и чтобы вернуть мой каталог в состояние, в котором он был до появления.
Я пытался git merge --abort
, но Git утверждал, что слияние не происходит. Есть ли простой способ прервать всплывающее окно, не разрушая изменения, которые у меня были изначально в каталоге?
git stash pop
нечистого рабочего режиссера. В этом случае вы можете простоgit reset --hard
и ваш тайник все еще не поврежден. (Это более или менее то, что предлагает связанная тема @ BradKoch)Ответы:
Хорошо, я думаю, что я разработал "git stash unapply". Это более сложно, чем
git apply --reverse
потому, что вам нужно обратное слияние в случае, если слияние было выполненоgit stash apply
.Обратное слияние требует, чтобы все текущие изменения были вставлены в индекс:
git add -u
Затем инвертировать то,
merge-recursive
что было сделаноgit stash apply
:git merge-recursive stash@{0}: -- $(git write-tree) stash@{0}^1
Теперь у вас останутся только незакрытые изменения. Они будут в индексе. Вы можете использовать,
git reset
чтобы отменить изменения, если хотите.Учитывая, что ваш первоначальный
git stash apply
сбой, я предполагаю, что обратное может также потерпеть неудачу, так как некоторые вещи, которые он хочет отменить, не были выполнены.Вот пример, показывающий, как рабочая копия (через
git status
) снова становится чистой:источник
git stash apply
никогда не сбрасывает тайник, а при сбое слиянияgit stash pop
также сохраняет тайникМой вариант использования: только что попробовал заскочить на неправильную ветку и получил конфликты. Все, что мне нужно, это отменить всплывающее окно, но сохранить его в списке тайников, чтобы я мог выложить его в нужную ветку. Я сделал это:
Легко.
источник
stash pop
войти в него. Это звучит как рецепт катастрофы.Изменить: Из
git help stash
документации в разделе поп:Применение государства может потерпеть неудачу с конфликтами; в этом случае он не удаляется из списка. Вам нужно разрешить конфликты вручную и вручную вызвать git stash drop.
Если используется опция --index, то пытается восстановить не только изменения рабочего дерева, но и изменения индекса. Тем не менее, это может произойти сбой, когда у вас есть конфликты (которые хранятся в индексе, где вы больше не можете применить изменения, как они были изначально).
Попробуйте скопировать все ваши репо в новый каталог (чтобы у вас была его копия) и запустите:
git stash show
и сохраните этот вывод где-нибудь, если вы заботитесь об этом.затем:
git stash drop
сбросить конфликтующий тайникgit reset HEAD
Это должно оставить ваше репо в том состоянии, в котором оно было раньше (надеюсь, я все еще не смог воспроизвести вашу проблему)
===
Я пытаюсь повторить вашу проблему, но все, что я получаю, когда usin
git stash pop
это:В чистом виде:
Я не вижу мерзавца, пытающегося объединить мои изменения, он просто терпит неудачу. Есть ли у вас какие-либо шаги по репро, которые мы можем выполнить, чтобы помочь вам?
источник
Я всегда использовал
git reset --merge
Я не могу вспомнить, чтобы это никогда не подводило.
источник
git reset
. Знаете ли вы, если он функционально идентиченgit reset --merge
?Если вам не нужно беспокоиться о любых других внесенных вами изменениях и вы просто хотите вернуться к последнему коммиту, тогда вы можете сделать:
источник
Хорошо, я думаю, что мне удалось найти рабочий процесс, который вернет вас туда, где вы должны быть (как будто вы не сделали поп-музыку).
СДЕЛАТЬ РЕЗЕРВНОЕ КОПИРОВАНИЕ ДО Я не знаю, сработает ли это для вас, поэтому скопируйте весь репозиторий на тот случай, если он не сработает.
1) Исправьте проблемы слияния и исправьте все конфликты, выбрав все изменения, которые появятся в патче (в tortoisemerge это отображается как единое целое. REMOETE (их)).
2) Зафиксируйте эти изменения (они уже будут добавлены с помощью команды mergetool). Дайте ему сообщение коммита "слияние" или что-то, что вы помните.
3) Теперь у вас все еще будут локальные неотмеченные изменения, которые вы запустили изначально, с новым коммитом из патча (мы можем избавиться от этого позже). Теперь внесите ваши не внесенные изменения
4) Поменяйте местами патч. Это можно сделать с помощью следующей команды:
5) Зафиксируйте эти изменения:
6) Избавиться от патча / распаковать коммиты
из этого удалите две строки с «слияния» и «обратный патч» в нем.
7) Верните свои неизмененные изменения и отмените фиксацию «локальных изменений».
Я рассмотрел его на простом примере, и он возвращает вас туда, где вы хотите быть - непосредственно перед тем, как тайник был извлечен, с вашими локальными изменениями и с тем, что тайник все еще был доступен для извлечения.
источник
git stash show -p | git apply -R
это не сработает, если произойдетgit stash apply
слияние. Смотрите мой ответ ...Я решил это несколько иначе. Вот что случилось.
Сначала я выбрал не ту ветку и получил конфликты. Тайник остался без изменений, но индекс находился в разрешении конфликта, блокируя многие команды.
Простое
git reset HEAD
прервало разрешение конфликта и оставило незафиксированные (и НЕОБХОДИМЫЕ ) изменения.Несколько
git co <filename>
вернули индекс в исходное состояние. Наконец, я переключил ветку с помощьюgit co <branch-name>
и запустил новуюgit stash pop
, которая разрешалась без конфликтов.источник
Некоторые идеи:
Используйте
git mergetool
для разделения файлов слияния на оригинальные и новые части. Надеюсь, одним из них является файл с вашими изменениями, не являющимися тайниками.Примените diff тайника в обратном порядке, чтобы отменить только эти изменения. Возможно, вам придется вручную разбить файлы с конфликтами слияния (что, надеюсь, сработает вышеупомянутый прием).
Я не проверял ни один из них, поэтому я не знаю точно, будут ли они работать.
источник
Я мог бы воспроизвести чистый
git stash pop
на «грязном» каталоге, с незафиксированными изменениями, но еще не поп, который вызывает конфликт слияния.Если при конфликте слияния тайник, который вы пытались применить, не исчез, вы можете попытаться проверить
git show stash@{0}
(необязательно с помощью--ours
или--theirs
) и сравнить сgit statis
иgit diff HEAD
. Вы должны увидеть, какие изменения произошли от применения тайника.источник
Если DavidG прав, что он не выдвинул тайник из-за конфликта слияния, тогда вам просто нужно очистить ваш рабочий каталог. Быстро
git commit
все, что вас волнует. (Вы можетеreset
илиsquash
коммит позже , если вы не сделали.) Тогда все , что вы заботитесь о безопасном, иgit reset
все остальное , чтоgit stash pop
сбрасывали в рабочем каталоге.источник
Если до
git stash pop
, как в вопросе, поэтапных изменений не было , то должны работать следующие две команды.Первый отменяет любые слияния из тайника, удачные или нет. Второй удаляет все неотслеживаемые файлы, введенные тайником.
From
man git stash
: НаThe working directory must match the index.
что указывает @DavidG,stash pop
произойдет сбой, если конфликтуют какие-либо неподготовленные измененные файлы. Таким образом, нам не нужно беспокоиться о том, чтобы раскрутить конфликты слияний, а не возвращаться к нимHEAD
. Любые оставшиеся измененные файлы затем не связаны с тайником и были изменены доstash pop
Если произошли поэтапные изменения, мне неясно, можем ли мы полагаться на одни и те же команды, и вы можете попробовать методику @Ben Jackson. Предложения приветствуются ..
Вот настройка тестирования для всех различных случаев https://gist.github.com/here/4f3af6dafdb4ca15e804
источник
Используйте
git reflog
для перечисления всех изменений, внесенных в вашу историю Git. Скопируйте идентификатор действия и введитеgit reset ACTION_ID
источник
Я пишу здесь в надежде, что другие найдут мой ответ полезным. У меня была похожая проблема, когда я пытался сделать треск в другой ветке, чем тот, из которого я спрятал. В моем случае у меня не было файлов, которые были незафиксированы или находятся в индексе, но все же попали в случай конфликтов слияния (тот же случай, что и @pid). Как уже отмечалось ранее, неудачный всплеск git stash действительно сохранил мой stash, затем быстрый сброс git git plus, возвращаясь к моей первоначальной ветке и выполняя оттуда сундук, решил мою проблему.
источник