Я не думаю, что вы можете восстановить эти личные данные («частные», как в «не добавлены в индекс, и не зафиксированы», так неизвестны git), если у вас нет другого процесса резервного копирования для текущего рабочего каталога .
Даже если это не предложено на странице Git Aliases , я бы посоветовал использовать какой-нибудь псевдоним для извлечения (как при использовании alias rm /bin/rm -i
):
[alias]
co = !sh -c 'git stash; git stash apply; git checkout "$@"'
, где 'git stash; git stash apply
' является «техникой контрольной точки», используемой Брайаном Кэмпбеллом в его ответе .
Stason предлагает в комментариях :
co = "!git stash push -m \"co backup\"; git stash apply; git checkout \"$@\""
Обратите внимание, я добавил сообщение, чтобы сообщить о резервных копиях от других. -
Эта проблема напоминает мне об обсуждении этого поведения на ycombinator (выдержки):
Я потерял много данных с помощью git.
Большинство из них связано с безобидными звуковыми командами, которые не запрашивают подтверждения при удалении данных .
Например, git checkout filename
эквивалентно svn revert filename
.
Конечно, git checkout branchname
делает что-то совершенно другое.
Если ветка и файл имеют одно и то же имя, git по умолчанию переключает ветки, но это не мешает bash autocomplete испортить день.
Вот сумасшедшая идея: если у вас есть безобидное действие и опасное действие, не маркируйте их одной и той же командой.
Раздражает, может быть, но это ошибка пользователя, а не ошибка дизайна. С помощью git, если я хочу сбросить рабочую копию без потерь, я могу просто "git stash
".
По вашей логике, «rm» имеет недостатки, потому что не запрашивает подтверждения, когда вы передаете -f
вместо -i
. Ну, да. К сожалению.
Ваша аналогия была бы более точной, если бы rm somename
был эквивалентом apt-get update
, а rm othername
был rm -fr othername
.
Тем не менее, это не может быть правдой, что "get checkout foo
" делает одну из двух ПОЛНОСТЬЮ разных вещей в зависимости от того, существует ли файл с именем foo в текущем каталоге
Вот еще одна безумная идея: не запускайте 'git checkout ...
' на грязном рабочем дереве. Проблема решена.
Еще один: не используйте имена файлов как имена филиалов.
Если честно: у меня та же проблема с неосторожными вызовами «rm
», разрушающими мой день, но когда я бормочу проклятия, это происходит из-за моей лени / глупости, а не из-за завершений или поведения «rm
» 1076 *