2014-09-21 3 views
1

Может кто-нибудь объяснить, как работает git-revert.Git revert misunderstanding

В настоящее время я допустил некоторые ошибки в своем приложении, и я нажал изменения в ветку мастера. Теперь я нашел рабочую фиксацию, и я хочу сбросить мою ветку мастера на эту рабочую фиксацию.

Так что мой вопрос: что мне делать, если я наберу git-revert 145bb80, будут ли все мои файлы такими же, как они были изначально на этой фиксации: 145bb80?

ответ

2

Так что мой вопрос: что мне делать, если я наберу git-revert 145bb80, будут ли все мои файлы такими же, как они были изначально на этой фиксации: 145bb80?

Хороший вопрос, а ответа нет. Я предполагаю, что вы пришли с земли Subversion (как и я), а revert означало что-то другое - это было действие на вашей рабочей копии, а не на репозиторий. В Git land git revert предназначен для изменения изменений одного фиксации, а не для восстановления всего дерева в конкретном состоянии.

Команда, которую вы ищете, это git reset. Хотя существуют некоторые формы, предназначенные для рабочего дерева и индекса. Существует несколько различных форм. Если вы хотите сделать это так, чтобы ваш филиал указывал на 145bb80, тогда вы запустили бы git reset --hard 145bb80 на этой ветке. В результате произойдут две вещи:

1) Ваша ветка будет принудительно сделана так, чтобы она указывала на 145bb80. Любые другие совершения, которые произошли, будут потеряны. Это форма перезаписи истории, поэтому будьте уверены, что это то, что вы хотите сделать. Вы также получите сообщение об ошибке, если попытаетесь нажать ветку. Он скажет вам, что это не быстрое переключение, и вам нужно сделать git push --force, чтобы принудительно установить его в удаленном репозитории. Опять же, будьте осторожны. Убедитесь, что это то, чего хочет ваша команда.

2) git reset --hard удаляет любые локальные изменения в вашем индексе и рабочем дереве. Поэтому, если вы хотите их сохранить, вам нужно занести их перед использованием git reset --hard.

Существует еще один выбор, который намного менее опасен. Это было бы для возврата назад. Это звучит немного глупо, но это позволяет вашей истории продолжать быстро.

Кроме того, если бы вы просто как копия файла, как это было в 145bb80, то вы можете сделать это с помощью:

git checkout 145bb80 -- path/to/file 

Вы можете использовать следующие для восстановления дерева к содержимому это было в 145bb800:

git checkout 145bb80 -- . 

Снова, хотя, будьте осторожны с такой командой, как вы можете потерять работу.

Ваш лучший выбор - просто вернуть плохие комманды с git revert, чтобы избежать отмены работы другими лицами.

+0

Отличный ответ, хотя я бы также хотел упомянуть 'git checkout -p', который позволяет вам легко« вернуть »части коммита. –

+0

Я единственный человек, который использует эту ветку. Итак, чтобы подвести итог, если я сделаю git reset - hard 145bb80, у меня будут те же файлы, что и раньше? – Alen

+0

git reset здесь не подходит, так как он подтолкнул свои изменения вверх по течению и с помощью сброса просто получит ваше дерево в состоянии, в котором вы больше не можете толкнуть. Git checkout будет работать действительно, но будет иметь такой же эффект, как просто использование git revert в том смысле, что вы создаете новую фиксацию. –

1

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

Вы можете также использовать для возврата диапазона фиксаций:

git revert OLDER_COMMIT^..NEWER_COMMIT 
1

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

Использование git revert является предпочтительным. Он создаст новую фиксацию, чтобы отменить эффект вашего более раннего неправильного коммита.