Как было задано в этом вопросе , я также хочу знать, как разрешить конфликт, git stash pop
не добавляя все изменения в коммит (как это делает «git stash pop» без конфликта).
Мой нынешний подход очень не крутой, потому что я делаю это так:
git stash pop -> CONFLICT
git stash drop
[resolve conflict]
[add conflict files]
git reset HEAD <all files that are in commit-mode>
[Обновление] Способ воспроизвести это:
mkdir foo; cd foo; git init
echo "1" > one
echo "2" > two
git add -A; git commit -m "first"
echo "1.1" > one
echo "2.1" > two
git stash
echo "2.2" > two
git commit -a -m "second"
echo "Only this file would stay in HEAD without the conflict" > third
git add third
git stash pop
git status
2016-06-27: Добавлен новый файл с именем «третий» в пример, чтобы показать, что обходные пути, такие как решение от scy, работают только для пустых HEAD, но не устраняют первоначальную проблему, заключающуюся в том, что HEAD не имеет такой же контент, как для git stash pop
без конфликта.
git add
разрешаете конфликтные файлы, эффективно помещая их в индекс, и хотите, чтобы их не было в нашем индексе?git stash pop
происходит, когда не возникает конфликта (но с уведомлением, какие файлы должны быть объединены).Ответы:
Не следуйте другим ответам
Ну, вы можете следовать за ними :). Но я не думаю, что выполнение коммита, а затем сброс ветки для удаления этого коммита и аналогичные обходные пути, предложенные в других ответах, являются чистым способом решения этой проблемы.
Чистый раствор
Следующее решение кажется мне намного чище, и оно также предлагается самим Git - попробуйте выполнить
git status
в хранилище конфликт:Итак, давайте сделаем то, что предлагает Git (без каких-либо бесполезных коммитов):
git reset
чтобы пометить конфликт (ы) как разрешенные и отменить изменения. Вы можете выполнить его без каких-либо параметров, и Git удалит все из индекса. Вы не должны выполнятьgit add
раньше.git stash drop
, потому что Git не делает этого при конфликте.Переведено в командную строку:
Объяснение поведения по умолчанию
Существует два способа пометить разрешенные конфликты:
git add
иgit reset
. Хотяgit reset
помечает конфликты как разрешенные и удаляет файлы из индекса,git add
также помечает конфликты как разрешенные, но сохраняет файлы в индексе.Добавление файлов в индекс после разрешения конфликта происходит специально. Таким образом, вы можете отличить изменения от предыдущего тайника и изменения, сделанные после разрешения конфликта. Если вам это не нравится, вы всегда
git reset
можете удалить все из индекса.Инструменты слияния
Я настоятельно рекомендую использовать любой из трехсторонних инструментов слияния для разрешения конфликтов, например, KDiff3 , Meld и т. Д., Вместо того, чтобы делать это вручную. Обычно он сам решает все или большинство конфликтов автоматически. Это огромная экономия времени!
источник
git stash pop
терпит неудачу с конфликтами.git stash drop
если вы не хотите сохранить этот тайник.Предположим, у вас есть этот сценарий, где вы храните свои изменения, чтобы вытащить из источника. Возможно, потому что ваши локальные изменения просто
debug: true
в каком-то файле настроек. Теперь вы тянете, и кто-то ввел новую настройку там, создавая конфликт.git status
говорит:Ладно. Я решил пойти с тем, что предложил Git: я решил конфликт и совершил:
Теперь моя рабочая копия находится в том состоянии, в котором я хочу, но я создал коммит, который мне не нужен. Как мне избавиться от этого коммита без изменения моей рабочей копии? Подождите, есть популярная команда для этого!
Моя рабочая копия не была изменена, но фиксация WIP пропала. Это именно то, что я хотел! (Обратите внимание, что я здесь не использую
--soft
, потому что, если в вашем тайнике есть автоматически объединенные файлы, они автоматически размещаются, и, таким образом, вы в конечном итоге получите эти файлы сноваreset
.)Но осталась еще одна вещь: страница руководства
git stash pop
напоминает нам, что «применение состояния может привести к сбою при конфликтах; в этом случае оно не удаляется из списка хранения. Вам необходимо разрешить конфликты вручную иgit stash drop
впоследствии вызвать их вручную». Вот что мы делаем сейчас:И сделано.
источник
git add <resolved conflict files>
последоватьgit reset HEAD
?git stash pop
без конфликта. Просто добавьте еще один файл в HEAD, прежде чем делать конфликтующие,git stash pop
а затем выgit commit -a -m WIP
добавите новый файл в коммит. Но без конфликта, только новый файл останется в HEAD, но неgit stash pop
файлы.^
это используется в качестве специального продолжения линии и оставит вас сидеть на Подробнее? подскажите вместо выполнения команды. Вместо того, чтобы использовать:git reset --soft HEAD~1
. Видите, как сделать-я-удалить-unpressed-git-commits?Вместо добавления изменений, внесенных вами для разрешения конфликта, вы можете использовать его
git reset HEAD file
для разрешения конфликта без постановки изменений.Возможно, вам придется выполнить эту команду дважды, однако. Один раз, чтобы пометить конфликт как разрешенный, и один раз, чтобы отменить внесение изменений, которые были поставлены процедурой разрешения конфликтов.
Вполне возможно, что должен быть режим сброса, который выполняет обе эти функции одновременно, хотя сейчас его нет.
источник
работал на меня.
Примечание : это может быть опасно, так как он не пытается объединить изменения из хранилища в вашу рабочую копию, а вместо этого перезаписывает его сохраненными файлами. Таким образом, вы можете потерять свои незафиксированные изменения.
источник
git add .
установит ВСЕ файлы, сообщающие git, что вы разрешили конфликтgit reset
будет удалять все поставленные файлы без создания коммитаисточник
git add -u
тоgit reset
Кажется, что это может быть ответом, который вы ищете, я лично еще не пробовал, но, похоже, это может сработать. С помощью этой команды GIT попытается применить изменения, как они были раньше, не пытаясь добавить их все для фиксации.
git stash apply --index
вот полное объяснение:
http://git-scm.com/book/en/Git-Tools-Stashing
источник
git stash pop
- или есть ли способ отменить это и сделать,git stash apply --index
когда я узнал, чтоgit stash pop
столкнется с конфликтом?git stash pop
и у вас возникнут конфликты, тайник не будет удален ... так что вы можете запустить,git reset --hard
чтобы отменить всплывающее окно, а затем попробовать предложенное мной решение.git stash branch
will works, которая создает новую ветку для вас, проверяет коммит, на котором вы были, когда вы спрятали свою работу, повторно применяет свою работу там, а затем удаляет тайник, если он успешно применяется. проверить этоисточник
Самый быстрый способ, который я нашел, - это разрешить конфликт, затем сделать
git add -u
, а потом и сделатьgit reset HEAD
, что даже не требует фиксации.источник
Согласно Git Stash вопросы , после устранения конфликта,
git add <file>
это правильный курс действий.После прочтения этого комментария я понял, что изменения автоматически добавляются в индекс (по проекту). Вот почему
git add <file>
завершает процесс разрешения конфликта.источник
Это не лучший способ сделать это, но это работает:
источник
file/path/to/your/file
, о которых не спрашивал ОП, AFAIU