Git Stash промах: Git Stash поп и закончился конфликтами слияния - PullRequest
197 голосов
/ 15 мая 2010

Я сделал 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 ]

218 голосов
/ 15 мая 2010

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

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

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

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

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

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

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

  2. Ссылка MERGE_HEAD установлена ​​так, чтобы указывать на другую головку ветви.

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

  4. ...

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

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

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

41 голосов
/ 04 мая 2012

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

12 голосов
/ 13 октября 2015

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

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

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

2 голосов
/ 21 мая 2015

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

См. коммит ed178ef от Джефф Кинг (peff), 22 апреля 2015 г.
(Объединено Junio ​​C Hamano - gitster - в коммит 05c3967 , 19 мая 2015 г.)

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

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

Проблема

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

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

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

Решение

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

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

Cannot apply stash: Your index contains uncommitted changes.

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


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

...