git stash blunder: 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
4 194

4 ответа:

посмотреть man git merge (КАК РАЗРЕШИТЬ КОНФЛИКТЫ):

, увидев конфликт, вы можете сделать две вещи:

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

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

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

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

  1. указатель головы остается прежним.

  2. ссылка MERGE_HEAD указывает на другой глава филиала.

  3. пути, которые слились чисто обновляются как в индексном файле, так и в вашем рабочем дереве.

  4. ...

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

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

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

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

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

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

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

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

посмотреть commit ed178ef by Джефф Кинг (peff), 22 апреля 2015 года.
(слитый Junio C Hamano--gitster - в совершить 05c3967, 19 мая 2015)

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

stash: требуют очистить индекс для применения/поп

если вы разместили содержимое в своем индексе и запустите "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.


посмотреть совершить 1937610 (15 июня 2015), и commit ed178ef (22 апреля 2015) by Джефф Кинг (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 commit" между шагами (3) и (4), то этот просто работать. Однако, если эти шаги являются частью предварительной фиксации крюк, у вас нет такой возможности (вы должны восстановить исходное состояние независимо от того, прошли ли испытания или нет. неудачный.)