2010-12-29 5 views
7

В настоящее время я изучаю git, обычно я немного скептически отношусь к VCS, так как мне трудно привыкнуть к ним.Разве что-нибудь действительно удалено в git?

Я удалил ветку под названием «экспериментальный» с некоторыми файлами tmp, я увидел файлы, удаленные в моей рабочей директории, поэтому я поцарапал себе голову и задался вопросом, нормально ли это, могу ли я вернуть ее на случай, если она мне понадобится, и т. д.

Я нашел SHA, делающий фиксацию файлов tmp, и воссоздал ветку с предоставленным sha и увидел ее снова со всеми файлами и их текущим контентом.

Все, что я делаю в рабочем каталоге, можно вернуть, как только я его совершу?

Может показаться глупым вопросом для многих людей, но это своего рода интригует меня, так что я хочу знать пределы

ответ

7

Практически каждое действие может быть отменено, если вы внесли соответствующие изменения в свои файлы. Даже если вы принудительно удаляете ветвь или выполняете жесткий сброс, вы можете найти свободные объекты фиксации, используя git reflog или git fsck.

Однако, свободные предметы изредка очищаются git gc, поэтому вы не можете их восстановить через некоторое время.

+0

Вы должны сознательно установить низкую настройку 'gc.pruneexpire' для' git gc', чтобы немедленно обрезать недостижимые объекты. Последнее предложение подразумевает, что запуск 'git gc' вручную может быть особенным. –

+0

@Charles: Я перефразировал последнее предложение. Вы правы, я не имел в виду, что руководство 'git gc' немедленно уничтожает свободные объекты. Я просто хотел заметить, что 'git gc' запускается автоматически, но также может запускаться вручную. – 3lectrologos

+0

Этот ответ применяется только к локальному репозиторию git или к удаленному при нажатии (например, в случае централизованного пульта)? – nha

1

git reset --hard может удалить изменения необратимо

+0

-1: 'git reset --hard' не является необратимым. – 3lectrologos

+0

@ 3lectrologos hmm интересно ... Как я могу отменить-жесткий сброс? – seriyPS

+2

Я думаю, что @ 3lectrologos предполагает состояние «один раз я совершаю». –

2

Все, что я делаю в рабочем каталоге может быть возвращенным после того, как я , возьмите его?

Да, вы можете. В качестве примера попробуйте git reflog. Это даст вам список совершенных коммитов на текущий филиал. Выберите один по его сумме sha1, затем введите git checkout 45db2a.... Это проверяет, что совершить. Обязательно укажите git checkout HEAD или git checkout -b newbranch, если вы хотите внести изменения.

Вы также можете использовать git to cherry, чтобы выбрать эти коммиты поверх вашего текущего HEAD (т. Е. Если они сделаны в другой ветке, вы можете втянуть их). This вопрос обсуждает это намного лучше, чем я могу.

+0

После того, как я посмотрел ответы, я как бы получаю от этого зависание, это немного странно, но не так, разница (по крайней мере, для меня) при нажатии/вытягивании на сервер. Теперь я не знаю, спрашивать ли в stackoverflow или здесь, но почему «git rm» dry-run не работает? Мне пришлось удалить весь каталог, чтобы отразить его на частном сервере. Я хочу сохранить свои файлы и удалить их по серверу. – allenskd

+0

А, я вижу. Вы можете принудительно удалить ветви из удаленного репозитория, выполнив следующее: 'git push remotename: branchname' (странный синтаксис,' git push branchname' толкает его. Разница - это просто ':'). Я не знаю, можете ли вы сделать это, используя отдельные коммиты, это интересный вопрос. –

2

Главное в любом серьезном VCS состоит в том, чтобы сохранить всю историю проекта постоянным и неизменным способом. Таким образом, вы можете в любое время перейти к произвольной ревизии вашей работы.

Существует специальное поведение git, когда дело доходит до его хранения, поскольку оно может удалять объекты, если нет ссылок на него. Ссылки являются:

  • каждый руководитель филиала
  • теги (я не уверен, что если без ссылок аннотированный тег до сих пор выступает в качестве активной ссылки)
  • каждой фиксации, который ссылается другой совершает
  • содержание филиала reflog

Это означает, что все фиксации, являющиеся частью ветки, сохраняются, а также каждый объект (= в основном совершает), которые помечены.Существует также так называемый reflog для каждой ветви (если не деактивирован), где git хранит ссылки на все объекты, созданные в последние дни. Когда объект не ссылается ни на одну ветку, тег или reflog, git gc удаляет ее из базы данных. Это типично для случая, когда вы создали хакерскую ветвь, там были некоторые вещи и удалили эту ветку, не сливая ее в другую ветку.

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