2012-03-02 6 views
565

Я знаю, что Git отслеживает изменения, которые я внес в свое приложение, и он держится за них, пока я не зафиксирую изменения, но вот где я повесил трубку:Как использовать 'git reset --hard HEAD' для возврата к предыдущей фиксации?

Когда я хочу вернуться к предыдущему фиксации, я использую :

git reset --hard HEAD

И Git возвращает:

HEAD is now at 820f417 micro 

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

Мои следующие шаги были:

git add . 
git commit -m "revert" 

Но ни один из файлов не изменились на моем жестком диске ...

Что я делаю правильно/неправильно?

+0

Что вы имеете в виду, возвращаясь к файлам на жестком диске обратно к тому, что предыдущий коммит? Если 820f417 является вашим желаемым фиксацией, в файлах теперь должен быть точный контент. – kennytm

+5

Если вы хотите отменить все изменения, после 'git reset --hard', вы должны« git checkout '. – jweyrich

+7

У меня действительно нет идеи [дублировать], а затем задайте новый вопрос, когда ответы не будут удовлетворительными. Это рецепт катастрофы с точки зрения большего количества дубликатов .... –

ответ

648

Во-первых, всегда стоит отметить, что git reset --hard является потенциально опасной командой, поскольку она отбрасывает все ваши незафиксированные изменения. В целях безопасности вы всегда должны убедиться, что выход git status является чистым (то есть пустым) перед его использованием.

Первоначально вы сказать следующее:

Так что я знаю, что Git отслеживает изменения, внесенные в моем приложении, и он держит на них, пока я не зафиксировать изменения, но вот где я повесил трубку:

В случае, если это выявит ошибочное предположение, я должен сказать, что это неверно. Git записывает только состояние файлов при их создании (с git add) или при создании фиксации. Когда вы создали коммит, который имеет файлы вашего проекта в определенном состоянии, они очень безопасны, но до тех пор Git не выполняет «отслеживание изменений» в ваших файлах. (например, даже если вы делаете git add для создания новой версии файла, которая перезаписывает ранее поставленную версию этого файла в промежуточной области.)

В своем вопросе вы потом спросить следующее:

Когда я хочу, чтобы вернуться к предыдущей фиксации я использую: мерзавец сбросить --hard голова и GIT возвращается: НАЧАЛЬНИК теперь в 820f417 micro

Как я могу вернуть файлы на моем жестком диске обратно на предыдущую фиксацию?

Если вы git reset --hard <SOME-COMMIT> то Git будет:

  • Сделать текущую ветвь (обычно master) обратно в точку на <SOME-COMMIT>.
  • Затем сделайте файлы в рабочем дереве, а индекс («промежуточная область») будет таким же, как версии, совершенные в <SOME-COMMIT>.

HEAD указывает на текущей ветви (или тока фиксации), так что все, что git reset --hard HEAD будет делать это, чтобы отбросить любые неподтвержденные изменения у вас есть.

Итак, предположим, что хорошая фиксация, на которую вы хотите вернуться, равна f414f31. (Вы можете обнаружить, что с помощью git log или любой истории браузера.) То у вас есть несколько различных вариантов в зависимости от того, что вы хотите сделать:

  • Измените текущую ветвь, чтобы указать на старшее обязательство вместо этого. Вы можете сделать это с помощью git reset --hard f414f31. Однако это переписывает историю вашего филиала, поэтому вам следует избегать этого, если вы поделились этой веткой с кем угодно. Кроме того, фиксации, которые вы сделали после того, как f414f31 больше не будет отображаться в истории вашего филиала master.
  • Создайте новый коммит, который представляет точно такое же состояние проекта, как f414f31, но просто добавляет это к истории, поэтому вы не теряете истории. Вы можете сделать это, используя шаги, предложенные в this answer - что-то вроде:

    git reset --hard f414f31 
    git reset --soft [email protected]{1} 
    git commit -m "Reverting to the state of the project at f414f31" 
    
+0

git reset --soft HEAD @ {1} действительно испортил мой локальный репозиторий. Он думает, что все файлы сейчас. Что мне теперь делать? –

+1

@Mark Longair: ответ, на который вы указываете в конце, не является пользователем - hard, а просто просто сбрасывает. – MiniQuark

+3

@MiniQuark: Я использую эквивалентный и немного более короткий вариант, который я предложил в комментариях к связанному ответу. –

137

ВНИМАНИЕ: git clean -f удалит неисправимые файлы, что означает, что они ушли навсегда, поскольку они не хранятся в репозитории. Перед тем, как это сделать, убедитесь, что вы действительно хотите удалить все необработанные файлы.


Попробуйте это и посмотреть git clean -f.

git reset --hard не удаляет неиспользуемые файлы, где git-clean удалит любые файлы из отслеживаемого корневого каталога, которые не находятся под контролем Git.

В качестве альтернативы, как сказал @Paul Betts, вы должны сделать git clean -xdf (будьте осторожны - это также удаляет все проигнорированные файлы).

+2

Это то, что я получаю от терминала: ** Не удалять приложения/представления/отношения/ Не удалять tmp/sessions/ Не удалять tmp/socket/** Нет изменение. Хм ... все, что я делаю, похоже, не работает. Не твоя вина. –

+53

git clean -xdf - то, что вы хотите :) –

+0

После долгих проб и ошибок, я закончил создание нового приложения и загрузку всех файлов вручную из резервной копии. Я делаю много резервных копий, но мне действительно нужно научиться полагаться на git, то есть мне нужно научиться лучше использовать git. –

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

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