Почему Tools->Git->Stash терпит неудачу в Qt Creator, где Tools->Git->Undo Uncommitted Changes не работает?

Иногда git stash дает сбой, хотя я могу вручную сделать резервную копию папки проекта с незафиксированными изменениями, а затем вызвать «Отменить незафиксированные изменения».

Это происходит, например, если я добавляю в свой проект новый файл foo.cpp. Когда я хочу спрятать изменения позже, я получаю сообщение об ошибке. Это из панели вывода контроля версий в Qt Creator:

14:07 Executing in C:\MyProject: git.exe add --intent-to-add foo.cpp
14:07 Executing in C:\MyProject: git.exe stash save QtCreator 2013-02-05T14:07:18
Cannot stash in "C:\MyProject": error: Entry 'foo.cpp' not uptodate. Cannot merge.
Cannot save the current worktree state

Разве смысл git stash не в том, чтобы автоматизировать этот процесс, почему он потерпит неудачу, если удастся просто отменить изменения?


person sashoalm    schedule 05.02.2013    source источник
comment
пожалуйста, уточните, что вы подразумеваете под ошибкой   -  person CharlesB    schedule 05.02.2013
comment
Как у вас обстоят дела с отменой незафиксированных изменений? Вы имеете в виду что-то вроде git checkout -f или git reset --hard? Вы используете графический интерфейс или что-то в этом роде?   -  person rjmunro    schedule 05.02.2013
comment
@CharlesB Спасибо, я обновил свой вопрос. Кстати, я использую git через Qt Creator, у него есть интеграция с IDE. Я скопировал это из журнала Qt Creator.   -  person sashoalm    schedule 05.02.2013


Ответы (2)


--intent-to-add оставил foo.cpp в состоянии "не добавлено, но все еще отслеживается". (Выполните git cat-file -p $(git write-tree): foo.cpp, правильно, не там. Выполните git status: он отслеживается. Но я считаю, что никто не научил git stash помнить об этом, и в результате слияние сохраняемого им состояния оставит foo.cpp не отслеживаемым. Поскольку git stash pop на самом деле выполняет объединиться с индексом и рабочим деревом - вы можете спрятать свои изменения, создать родительский элемент для текущего HEAD, полностью проверить что-то еще, а затем выполнить git stash pop, чтобы применить изменения в спрятанном содержимом к этому новому рабочему дереву - сообщение, которое вы видите, из тестового слияния stash запускается, чтобы убедиться, что немедленное git stash pop оставит ваше рабочее дерево и индекс такими, какими они были. Но в этом случае это не произойдет. foo.cpp отслеживается в вашем индексе и отсутствует в скрытом дереве. в этом дереве (при отсутствии данных о намерении добавить) единственное, что можно сделать, это интерпретировать это как удаление.Но вы внесли изменения в файл, который вы просили отслеживать: слияние может видеть вас' d потерять контент, о котором вы сказали git, который вам небезразличен. Таким образом, слияние отказывается запускаться, пока вы не удалите файл elf или передать его в репозиторий, а stash отказывается создавать stash, который вы не можете безопасно открыть.

person jthill    schedule 06.02.2013

Попробуйте запустить git stash save -u вместо git stash.

person Chronial    schedule 05.02.2013