Начнем с добавления нескольких файлов. В последнем коммите мы собираемся как добавлять, так и удалять файлы, чтобы создать беспорядочную ситуацию. Затем мы вернемся к состоянию до хаоса.
Вы можете создать папку с именем / test и выполнить следующие команды для инициализации Git и создания ситуации, описанной выше (мы намеренно выполняем отдельные коммиты для создания истории):
$ git initИнициализированный пустой репозиторий Git в / Users / zakh_eecs / _work / LearnGIT / git_revert / test /.git /
$ echo x> файл_1.текст
$ git add -A
$ git commit -m "Добавление файла_1.текст"
[master (root-commit) 08caf5d] Добавление файла_1.текст
1 файл изменен, 1 вставка (+)
режим создания 100644 file_1.текст
$ echo y> файл_2.текст
$ git add -A
$ git commit -m "Добавление файла_2.текст"
[master ba18a2f] Добавление файла_2.текст
1 файл изменен, 1 вставка (+)
режим создания 100644 file_2.текст
$ echo z> file_3.текст
$ git add -A
$ git commit -m "Добавление файла_3.текст"
[master 97f09ad] Добавление file_3.текст
1 файл изменен, 1 вставка (+)
режим создания 100644 file_3.текст
$ echo u> file_4.текст
$ git add -A
$ git commit -m "Добавление файла_4.текст"
[master 9caf084] Добавление файла_4.текст
1 файл изменен, 1 вставка (+)
режим создания 100644 file_4.текст
$ echo v> file_5.текст
$ git add -A
$ git commit -m "Добавление file_5.текст"
[master 3f228b2] Добавление file_5.текст
1 файл изменен, 1 вставка (+)
режим создания 100644 file_5.текст
Если мы проверим нашу папку, мы должны увидеть следующую ситуацию:
$ ls -1file_1.текст
файл_2.текст
file_3.текст
file_4.текст
file_5.текст
Если мы проверим историю, у нас должны быть следующие файлы:
$ git log --oneline3f228b2 Добавление file_5.текст
9caf084 Добавление file_4.текст
97f09ad Добавление file_3.текст
ba18a2f Добавление файла_2.текст
08caf5d Добавление файла_1.текст
Теперь давайте создадим хаос, мы собираемся удалить несколько файлов и добавить плохой файл.
$ rm file_2.текст$ rm file_4.текст
$ echo w> my_bad_file.текст
$ git add -A
$ git commit -m «Добавлял и удалял файлы, не думая о последствиях»
[master 879fbf8] Добавлял и удалял файлы, не думая о последствиях
3 файла изменено, 1 вставка (+), 2 удаления (-)
режим удаления 100644 file_2.текст
режим удаления 100644 file_4.текст
режим создания 100644 my_bad_file.текст
Теперь это состояние нашей папки:
$ ls -1file_1.текст
file_3.текст
file_5.текст
my_bad_file.текст
И это условие нашей истории:
$ git log --oneline879fbf8 Добавлял и удалял файлы, не думая о последствиях
3f228b2 Добавление file_5.текст
9caf084 Добавление file_4.текст
97f09ad Добавление file_3.текст
ba18a2f Добавление файла_2.текст
08caf5d Добавление файла_1.текст
Мы понимаем, что нам не нужен последний коммит 879fbf8. Итак, мы используем следующую команду revert:
$ git revert 879fbf8Откроется текстовое окно для редактирования автоматического комментария:
Вернуть «Добавленные и удаленные файлы, не думая о последствиях»Это отменяет фиксацию 879fbf849c4bd6fb9a377604d6355c76b92a832c.
# Пожалуйста, введите сообщение фиксации для ваших изменений. Линии начинаются
# с '#' будут проигнорированы, а пустое сообщение прервет фиксацию.
# На ветке мастера
# Изменения, которые необходимо зафиксировать:
# Новый файл: file_2.текст
# Новый файл: file_4.текст
# Удалено: my_bad_file.текст
#
Вы можете изменить комментарий. Мы собираемся оставить все как есть. Как только вы сохраните окно комментария, будет выполнено задание возврата:
$ git revert 879fbf8[master 6e80f0e] Вернуть «Добавленные и удаленные файлы, не думая о последствиях»
3 файла изменено, 2 вставки (+), 1 удаление (-)
режим создания 100644 file_2.текст
режим создания 100644 file_4.текст
режим удаления 100644 my_bad_file.текст
Теперь посмотрим на нашу папку:
$ ls -1file_1.текст
файл_2.текст
file_3.текст
file_4.текст
file_5.текст
Наши файлы вернулись по порядку, как и раньше. Все добавления и удаления были отменены. Проверим журнал:
$ git log --oneline6e80f0e Вернуть "Добавленные и удаленные файлы, не думая о последствиях"
879fbf8 Добавлял и удалял файлы, не думая о последствиях
3f228b2 Добавление file_5.текст
9caf084 Добавление file_4.текст
97f09ad Добавление file_3.текст
ba18a2f Добавление файла_2.текст
08caf5d Добавление файла_1.текст
Есть новый коммит 6e80f0e. Любые изменения, которые были частью 879fbf8 был отменен, а затем передан в 6e80f0e.
Предупреждение: Команда сброса Git позволяет также отменять коммиты. Но в случае сброса (особенно жесткого сброса) он бы удалил 879fbf8 совершить так, как будто этого никогда не было и не было бы 6e80f0e совершить. С помощью команды возврата каждый может увидеть произошедшие изменения. В случае сброса следов не остается. Поэтому использовать команду сброса в публичном репозитории - плохая идея, потому что это может вызвать массовую путаницу. Золотое правило - не используйте сброс в публичных репозиториях, используйте возврат, который безопаснее.
В заключении:
Команда Git revert - это быстрый и удобный способ исправить ваши ошибки. Это команда, которую вам следует запомнить, если вы регулярно работаете с Git.
Дальнейшее изучение:
- https: // git-scm.com / docs / git-revert
- https: // git-scm.com / docs / git-reset
- Git: изучение управления версиями с помощью Git: пошаговое руководство для начинающих
- Контроль версий с Git: мощные инструменты и методы для совместной разработки программного обеспечения
- Pro Git, 2-е издание