2010-04-28 5 views
10

Я читал, что Git в основном добавляет информацию о истории репозитория, пытаясь запомнить все сделанные изменения, но есть также команды, которые делают необратимые изменения.Каковы деструктивные команды в git?

Каковы команды, на которые я действительно должен обратить внимание и не использовать их неправильно, потому что нет возврата?

+0

Когда вы ответите на вопрос ниже, не забудьте объяснить, что делает команда! –

ответ

9

Здесь есть два типа «деструктивных» - команды, которые разрушают вашу историю Git и команды, которые отбрасывают изменения в вашей рабочей копии.

Команды, отсеивающие работа дерево меняет:

  1. git reset
  2. git checkout

Как уже упоминалось выше, сочетание reflog и тот факт, что объекты Git не сразу (если вы не включаете автоматическую очистку) означает, что вы обычно можете отменить операции, такие как git reset/rebase/merge.

Эти команды, хотя, на самом деле отбрасывания мерзавец объектов, устраняя возможность отменить:

  1. git gc (по умолчанию это подрезает недостижимые объекты, которые по крайней мере 2 недели)
+1

На мой взгляд, самые деструктивные команды git, которые отбрасывают рабочее дерево, меняются. Всегда должно быть безопасно «делать резервную копию» с «git stash»; git stash pop '. Вы можете позже (вплоть до вашего предела сжатия gc) восстановить «потерянные» версии с помощью команды: gitk --all -n 5000 - all $ (git fsck | awk/dangling commit/{print $ 3} '; git log -g --pretty = 'format:% H') [это откроет интерфейс gitk с до 5000 фиксаций, включая все «потерянные» коммиты]. –

2

мерзавец сброса --hard не может быть отменено

+0

true, если не указано – Lauri

7

http://blog.reverberate.org/2009/07/30/gits-needs-a-new-interface/ Согласно

$ git checkout foo.c 

... перезаписывает локальные изменения вы можете иметь в foo.c, не спрашивая.

+1

Совершенно верно - это еще более разрушительно, чем я думал. Я просто сделал «git checkout 6bb33a8.», Надеясь получить один файл, который был изменен в этой фиксации, но он также уничтожил мои поэтапные изменения в других файлах, заменив их содержимым в этой фиксации. Я думал, что он может что-то вставить в reflog, чтобы защитить меня, но нет такой удачи. –

3

Вы можете потерять незафиксированные изменения с помощью команды git reset. Если ваши изменения зафиксированы, вы защищаетесь reflog в течение нескольких дней, прежде чем он будет очищен gc.

Например, если вы checkout, rebase, reset или merge, которые все внести изменения, вы можете вернуться к предыдущей фиксации, выполнив команду reflog и с помощью reset сбросить свою голову старой фиксации.

Смежные вопросы