Git Stash промах: Git Stash поп и закончился конфликтами слияния
Я сделал 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
5 ответов
Смотрите man git merge (КАК РАЗРЕШИТЬ КОНФЛИКТЫ):
Увидев конфликт, вы можете сделать две вещи:
Решите не сливаться. Единственное, что вам нужно, это сбросить индексный файл до фиксации HEAD, чтобы отменить 2. и очистить изменения рабочего дерева, сделанные с помощью 2. и 3.; Для этого можно использовать git-reset --hard.
Разрешить конфликты. Git отметит конфликты в рабочем дереве. Отредактируйте файлы в форму и добавьте их в указатель. Используйте git commit, чтобы запечатать сделку.
И в разделе ИСТИННОЕ СЛОВО (чтобы увидеть, что относится к 2. и 3.):
Когда не очевидно, как согласовать изменения, происходит следующее:
Указатель HEAD остается прежним.
Ссылка MERGE_HEAD установлена так, чтобы указывать на другую ветку ветки.
Точно слитые пути обновляются как в файле индекса, так и в вашем рабочем дереве.
...
Итак: используйте git reset --hard
если вы хотите удалить изменения тайника из вашего рабочего дерева, или git reset
если вы хотите просто очистить индекс и оставить конфликты в вашем рабочем дереве для объединения вручную.
Под man git stash (OPTIONS, pop) вы можете прочитать дополнительно:
Применение государства может потерпеть неудачу с конфликтами; в этом случае он не удаляется из списка. Вам нужно разрешить конфликты вручную и вручную вызвать git stash drop.
У меня было нечто подобное со мной. Я пока не хотел ставить файлы, поэтому добавил их git add
а потом просто сделал git reset
, Это в основном только что добавило и затем unstaged мои изменения, но очистило необработанные пути.
Если, как и я, вам обычно требуется перезаписать содержимое рабочего каталога содержимым сохраненных файлов, но у вас все еще возникает конфликт, тогда вам нужно разрешить конфликт с помощью git checkout --theirs -- .
от корня.
После этого вы можете git reset
перенести все изменения из индекса в рабочий каталог, поскольку, по-видимому, в случае конфликта изменения в несогласованных файлах остаются в индексе.
Вы также можете запустить git stash drop [<stash name>]
потом избавиться от заначки, потому что git stash pop
не удаляет его в случае конфликтов.
Обратите внимание, что Git 2.5 (2 квартал 2015 года) будущий Git может попытаться сделать этот сценарий невозможным.
Смотрите коммит ed178ef Джеффа Кинга (peff
), 22 апреля 2015 г.
(Объединено Юнио С Хамано - gitster
- в комм. 05c3967 от 19 мая 2015 г.)
Примечание: это было отменено. Смотри ниже.
stash
: требуется чистый индекс для применения /pop
проблема
Если вы поместили содержимое в свой индекс и запустите "
stash apply/pop
msgstr "мы можем столкнуться с конфликтом и добавить новые записи в индекс.
Восстановление в исходное состояние в этот момент затруднено, потому что такие инструменты, как "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
,
См. Коммит 1937610 (15 июня 2015 г.) и коммит ed178ef (22 апреля 2015 г.) Джеффом Кингом ( peff
)
(Объединено Юнио С Хамано - gitster
- в коммите 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 commit" между шагами (3) и (4), то это просто работает. Однако, если эти шаги являются частью ловушки перед фиксацией, у вас нет такой возможности (вы должны восстановить исходное состояние независимо от того, пройдены тесты или нет).