Я сделал 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), то это просто работает. Однако, если эти шаги являются частью предварительной фиксации крючок, у вас нет такой возможности (вам нужно восстановить исходное состояние независимо от того, прошли ли тесты или не удалось).