В git ничего действительно не удалено? - PullRequest
7 голосов
/ 30 декабря 2010

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

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

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

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

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

Ответы [ 4 ]

7 голосов
/ 30 декабря 2010

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

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

2 голосов
/ 30 декабря 2010

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

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

  • каждая ГОЛОВА ветки
  • тегов (я не уверен, что аннотированный тег, на который нет ссылок, все еще действует как активная ссылка)
  • каждый коммит, на который ссылается другой коммит
  • содержание ветки reflog

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

2 голосов
/ 30 декабря 2010

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

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

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

1 голос
/ 30 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...