2013-08-31 4 views
3

Я использую SourceTree, и произошло то, что я нажал на «Commit», а затем добавил все измененные файлы, но перед фиксацией мне захотелось удалить один из файлов, чтобы позднее его зафиксировать.Как восстановить ПОТЕРЯННУЮ РАБОТУ, возникающую в результате использования git?

Я щелкнул правой кнопкой мыши на мой файл и предложили следующие варианты:

  • Удалить
  • Отклонить
  • Stop Tracking
  • убрать из буфера с индексом

enter image description here

Я был очень смущен этими выборами, я нажал «Отменить», и теперь вся работа, проделанная в этом файле, была потеряна !!!

PANIC MODE! Как восстановить мои изменения в этом файле?

Спасибо!

+2

К сожалению, мне кажется, что вы действительно потеряли эти изменения. Я не являюсь пользователем «sourcetree», но я бы ожидал «Отменить», чтобы отменить изменения. Теперь, если вы включили какую-то «локальную историю» в вашу среду IDE, которая работает независимо от Git, тогда вы сможете получить свои изменения таким образом. Я знаю, что Intellij IDEA имеет значение по умолчанию. Не уверен насчет Eclipse или других инструментов. Если у вас нет этой функции, вы должны изучить ее. Очень аккуратно иметь дополнительный уровень безопасности - он также намного более мелкозернистый, чем git. – Steinar

+0

Ничего себе, это действительно страшно! Я начал использовать git, чтобы избежать потери данных вначале, и здесь я смотрю на отчаянную ситуацию! BTW Я использую Netbeans (в основном настройки по умолчанию), что я могу восстановить свою работу оттуда? – Community

+0

** Какой выбор я должен использовать вместо этого, чтобы удалить один файл из фиксации? ** – Community

ответ

7

Если файл был поставлен (он похож на ваш), то будет создан снимок, это база данных Git. Мы можем вернуть его!

Git хранит моментальные снимки внутри в направлении .git/objects/ в вашем репозитории. Каждый объект хранится в файле с именем для его хэша, разделенном на каталоги на первые 2 символа. Снимки будут существовать здесь, пока они не будут упакованы в файлы в .git/objects/pack/ (что не произойдет с моментальным снимком, который никогда не был частью фиксации) или собранным мусором (что в конечном итоге произойдет с вашим отсутствующим файлом). Трудная часть будет определять, какой именно объект.

Чтобы найти объект, запустить

ls -lRt .git/objects 

, чтобы получить список всех объектов, отсортированных по времени последнего изменения. Вот что мой гипотетический хранилище выглядит следующим образом:

$ ls -lRt .git/objects 

.git/objects/22: 
total 4 
-r--r--r-- 1 peter peter 17 Sep 1 11:18 3b7836fb19fdf64ba2d3cd6173c6a283141f78 

.git/objects/f7: 
total 4 
-r--r--r-- 1 peter peter 17 Sep 1 11:09 0f10e4db19068f79bc43844b49f3eece45c4e8 

.git/objects/54: 
total 4 
-r--r--r-- 1 peter peter 51 Sep 1 11:08 3b9bebdc6bd5c4b22136034a95dd097a57d3dd 

.git/objects/e8: 
total 4 
-r--r--r-- 1 peter peter 134 Sep 1 11:08 e8417380c89509ec1e5b67c15469547a4489c2 

.git/objects/e6: 
total 4 
-r--r--r-- 1 peter peter 15 Sep 1 11:08 9de29bb2d1d6434b8b29ae775ad8c2e48c5391 

Run

git cat-file -p <hash> 

на объектах кандидатов, пока не найдете тот, который вы недостающее. Не забудьте добавить 2 символа из имени каталога в хэш. В моем случае, если меня интересует файл от 11:09

git cat-file -p f70f10 

Счастливая охота.

+0

Спасибо за это, но есть буквально тысячи объектов, и мне кажется человечески невозможным найти уникальный состояние этого конкретного файла вручную ... Может быть, с помощью хорошего инструмента поиска, который обеспечивает визуальные результаты ... Есть ли такой инструмент? – Community

+0

Я надеялся, что отметки времени будет достаточно. Тем не менее, [git-fsck (1)] (https://www.kernel.org/pub/software/scm/git/docs/git-fsck.html) может определенно помочь здесь. Смотрите, если 'git fsck -lost-found' занимает меньше работы, чтобы просеять. –

0

В SourceTree - если у вас есть некоторые совершают историю файла вы ищете - вы можете восстановить некоторые или все ваши работы после того, как «Удалено» файл в одном из двух способов:
1) выбрать файл в области «ступенчатый индекс» или «рабочее дерево». В подробном окне SourceTree покажет вам весь файл (поскольку вы удалили его, весь его контент «изменился»). Затем вы можете скопировать/вставить весь контент этого окна в текстовый редактор и вставить файл обратно в свою рабочую копию.
2) выберите файл в области «ступенчатый индекс» или «рабочее дерево» и щелкните правой кнопкой мыши для доступа к функции «Сброс к фиксации». Затем вы выбираете, для какого Commit вы хотите вернуть этот файл, и нажмите OK.

+0

Привет, Фабрис, спасибо за ваш ответ. К сожалению, это не полностью решает проблему, потому что я не потерял файл, я просто потерял последние изменения, которые я внес в этот файл, и это то, что я пытаюсь восстановить. Кроме того, если какой-либо разработчик SourceTree читает это, я предлагаю, чтобы SourceTree отображал предупреждение, в котором четко указано, что «отбрасывается», и что это действие является окончательным и безотзывным. Оптимальным UX/решением было бы добавить возможность отменить любые действия, предпринятые в программном обеспечении, с помощью кнопки «Отменить». – Community

1

В Netbeans я успешно восстановил файлы, используя его параметры истории, чтобы восстановить файлы, удаленные sourcetree. Если вы щелкните правой кнопкой мыши по проекту и перейдите в историю, есть возможность вернуть удаленные файлы. Я знаю, что этот вопрос немного устарел, но надеюсь, что это поможет тому, кто когда-либо еще сталкивается с этим.

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

  • Нет связанных вопросов^_^