Git ошибка пробела: git stash pop и закончились конфликтами слияния

Я сделал git stash pop и столкнулся с конфликтами слияния. Я удалил файлы из файловой системы и сделал git checkout, как показано ниже, но он считает, что файлы по-прежнему не загружены. Затем я попытался заменить файлы и сделать git checkout снова и тот же результат. Событие я пыталось заставить его с флагом -f. Любая помощь будет оценена!

chirag-patels-macbook-pro:haloror patelc75$ git status
app/views/layouts/_choose_patient.html.erb: needs merge
app/views/layouts/_links.html.erb: needs merge
# On branch prod-temp
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   db/schema.rb
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       unmerged:   app/views/layouts/_choose_patient.html.erb
#       unmerged:   app/views/layouts/_links.html.erb

chirag-patels-macbook-pro:haloror patelc75$ git checkout app/views/layouts/_choose_patient.html.erb
error: path 'app/views/layouts/_choose_patient.html.erb' is unmerged
chirag-patels-macbook-pro:haloror patelc75$ git checkout -f app/views/layouts/_choose_patient.html.erb
warning: path 'app/views/layouts/_choose_patient.html.erb' is unmerged

Ответ 1

См. man git merge (КАК РЕШИТЬ КОНФЛИКТЫ):

После просмотра конфликта вы можете сделать две вещи:

  • Решите не сливаться. Единственные исправления, которые вам нужны, - это reset индексный файл для фиксации HEAD для обратного преобразования 2. и для очистки рабочих деревенских изменений, сделанных в 2. и 3; git - reset -hard можно использовать для этого.

  • Разрешить конфликты. git будет отмечать конфликты в рабочем дереве. Отредактируйте файлы в форме и git добавьте их в индекс. Используйте git commit, чтобы запечатать сделку.

И под TRUE MERGE (чтобы увидеть, что относится к 2. и 3.):

Когда неясно, как смириться с изменениями, происходит следующее:

  • Указатель HEAD остается прежним.

  • Ссылка MERGE_HEAD ref указывает на другую ветку ветки.

  • Контуры, которые сливаются чисто, обновляются как в индексном файле, так и в рабочем дереве.

  • ...

Итак: используйте git reset --hard, если вы хотите удалить изменения смены из рабочего дерева или git reset, если хотите просто очистить индекс и оставить конфликты в рабочем дереве для слияния вручную.

В man git stash (OPTIONS, pop) вы можете читать дополнительно:

Применение состояния может привести к сбою с конфликтами; в этом случае он не удаляется из списка закладок. Вам необходимо разрешить конфликты вручную и после этого вызвать git drop down.

Ответ 2

У меня с тобой случилось подобное. Я еще не хотел ставить файлы, поэтому добавил их с помощью git add, а затем просто сделал git reset. Это в основном просто добавило, а затем неустановило мои изменения, но очистило несвязанные пути.

Ответ 3

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

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

Вы также можете запустить git stash drop [<stash name>] после этого, чтобы избавиться от stash, потому что git stash pop не удаляет его в случае конфликтов.

Ответ 4

Обратите внимание, что Git 2.5 (Q2 2015) будущее Git может попытаться сделать этот сценарий невозможным.

См. commit ed178ef Джефф Кинг (peff), 22 апреля 2015 г.
(слияние Junio ​​C Hamano - gitster - в commit 05c3967, 19 мая 2015 г.)

Примечание: Это было отменено. См. Ниже.

stash: требуется чистый индекс для применения /pop

Проблема

Если вы поставили содержимое в своем индексе и запустили "stash apply/pop", мы можем столкнуться с конфликтом и вставить новые записи в индекс.
В этом случае трудно восстановить исходное состояние, потому что такие инструменты, как "git reset --keep", сдуют что-нибудь поэтапно.

Другими словами:

"git stash pop/apply" забыл убедиться, что не только рабочее дерево чист, но и индекс чист.
Последнее важно, так как приложение с приложением может конфликтовать, и индекс будет использоваться для разрешения конфликтов.

Решение

Мы можем сделать это более безопасным, отказавшись от применения при поэтапных изменениях.

Это означает, что если раньше были слияния, из-за применения stash на измененных файлах (добавленных, но не зафиксированных), теперь они не были бы никакими слияниями, потому что приложение stash apply/pop немедленно прекратилось с помощью:

Cannot apply stash: Your index contains uncommitted changes.

Принуждение к фиксации изменений означает, что в случае слияния вы можете легко восстановить исходное состояние (до git stash apply/pop) с помощью git reset --hard.


См. commit 1937610 (15 июня 2015 г.) и commit ed178ef (22 апреля 2015 г.) Джефф Кинг (peff).
(слияние Junio ​​C Hamano - gitster - в commit bfb539b, 24 июня 2015 г.)

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

К сожалению, это повредит некоторые общие рабочие процессы вокруг "git stash -k", например:

git add -p       ;# (1) stage set of proposed changes
git stash -k     ;# (2) get rid of everything else
make test        ;# (3) make sure proposal is reasonable
git stash apply  ;# (4) restore original working tree

Если вы "git совершите" между шагами (3) и (4), то это просто работает. Однако, если эти шаги являются частью предварительной фиксации крючок, у вас нет такой возможности (вам нужно восстановить исходное состояние независимо от того, прошли ли тесты или не удалось).