Что такое git reset

Отмена коммитов и изменений

В этом разделе мы обсудим доступные стратегии и команды Git для выполнения отмены изменений. Прежде всего необходимо отметить, что в Git не существует традиционной системы отмены, как в текстовых редакторах. Лучше воздержаться от сопоставления операций Git с какой бы то ни было традиционной концепцией отмены изменений. Кроме того, Git имеет собственную систему терминов для операций отмены, и в обсуждении лучше всего использовать их. В числе таких терминов — сброс (reset), возврат (revert), переключение (checkout), очистка (clean) и другие.

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

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

Поиск утерянного: просмотр старых коммитов

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

Просмотр старых версий

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

Допустим, история вашего проекта выглядит примерно так:

Для просмотра коммита «Make some important changes to hello.txt» можно использовать команду git checkout в следующем виде:

Предположим, вы ведете разработку в главной ветке main по умолчанию. При каждом возвращении в ветку main можно использовать команду git revert или git reset для отмены нежелательных изменений.

Отмена коммита снимка

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

Отмена коммита с помощью git checkout

Отмена публичного коммита с помощью git revert

Отмена коммита с помощью git reset

Отмена последнего коммита

Отмена неотправленных изменений

Рабочий каталог

Раздел проиндексированных файлов

Отмена публичных изменений

Резюме

Помимо основных команд отмены, мы рассмотрели другие команды Git: git log для поиска потерянных коммитов, git clean для отмены изменений, не подтвержденных коммитами, и git add для изменения индексирования.

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

Источник

Что такое git reset

Check your version of git by running

SYNOPSIS

DESCRIPTION

…​ git reset [-q] [—pathspec-from-file= [—pathspec-file-nul]] [ ]

These forms reset the index entries for all paths that match the

to their state at . (It does not affect the working tree or the current branch.)

This means that git reset

is the opposite of git add

After running git reset

Interactively select hunks in the difference between the index and (defaults to HEAD ). The chosen hunks are applied in reverse to the index.

Resets the index but not the working tree (i.e., the changed files are preserved but not marked for commit) and reports what has not been updated. This is the default action.

Resets the index and working tree. Any changes to tracked files in the working tree since are discarded. Any untracked files or directories in the way of writing any tracked files are simply deleted.

See «Reset, restore and revert» in git[1] for the differences between the three commands.

OPTIONS

Do not interpret any more arguments as options.

Limits the paths affected by the operation.

For more details, see the pathspec entry in gitglossary[7].

EXAMPLES

Somebody asks you to pull, and the changes sound worthy of merging.

Then you can pull and merge, leaving frotz.c and filfre.c changes still in the working tree.

This is most often done when you remembered what you just committed is incomplete, or you misspelled your commit message, or both. Leaves working tree as it was before «reset».

Make corrections to working tree files.

Rewind the master branch to get rid of those three commits.

Switch to topic/wip branch and keep working.

2 ) were bad and you do not want to ever see them again. Do not do this if you have already given these commits to somebody else. (See the «RECOVERING FROM UPSTREAM REBASE» section in git-rebase[1] for the implications of doing so.)

Try to update from the upstream resulted in a lot of conflicts; you were not ready to spend a lot of time merging right now, so you decide to do that later.

Merge a topic branch into the current branch, which resulted in a fast-forward.

Even if you may have local modifications in your working tree, you can safely say git pull when you know that the change in the other branch does not overlap with them.

Suppose you are interrupted by an urgent fix request while you are in the middle of a large change. The files in your working tree are not in any shape to be committed yet, but you need to get to the other branch for a quick bugfix.

This commit will get blown away so a throw-away log message is OK.

This removes the WIP commit from the commit history, and sets your working tree to the state just before you made that snapshot.

At this point the index file still has all the WIP changes you committed as snapshot WIP. This updates the index to show your WIP files as uncommitted.

Suppose you have added a file to your index, but later decide you do not want to add it to your commit. You can remove the file from the index while keeping your changes with git reset.

This removes the file from the index while keeping it in the working directory.

This commits all other changes in the index.

Adds the file to the index again.

Suppose you are working on something and you commit it, and then you continue working a bit more, but now you think that what you have in your working tree should be in another branch that has nothing to do with what you committed previously. You can start a new branch and reset it while keeping the changes in your working tree.

You can repeat steps 2-4 multiple times to break the original code into any number of commits.

Once again, check to verify that you’ve included what you want to. You may also wish to verify that git diff doesn’t show any remaining changes to be committed later.

Источник

git reset

Git reset и три дерева Git

Начнем работу с создания нового репозитория с помощью приведенных ниже команд.

Рабочий каталог

Первое дерево, которое мы рассмотрим, — рабочий каталог. Это дерево синхронизировано с локальной файловой системой и отображает непосредственные изменения, внесенные в содержимое файлов и каталогов.

Раздел проиндексированных файлов

Далее мы добавим измененный файл reset_lifecycle_file в раздел проиндексированных файлов.

История коммитов

Последнее дерево — история коммитов. Команда git commit добавляет изменения в постоянный снимок, который находится в истории коммитов. Этот снимок также включает состояние раздела проиндексированных файлов на момент выполнения коммита.

Порядок действий

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

git checkout b

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

git reset b

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

Основные параметры

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

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

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

—mixed

Это режим работы по умолчанию. Указатели ссылок обновляются. Раздел проиндексированных файлов сбрасывается до состояния указанного коммита. Любые изменения, которые были отменены в разделе проиндексированных файлов, перемещаются в рабочий каталог. Давайте продолжим.

Теперь давайте мягко сбросим текущее состояние репозитория.

Прежде чем вернуться назад во времени, проверим текущее состояние репозитория.

Чтобы выяснить, что произошло при этом сбросе, выполним команду git log:

Разница между командами git reset и git revert

Команда revert предназначена для безопасной отмены публичных коммитов, а git reset — для отмены локальных изменений в разделе проиндексированных файлов и рабочем каталоге. Поскольку они предназначены для разных целей, их реализация также различается: команда reset полностью удаляет набор изменений, тогда как команда revert оставляет исходный набор изменений и использует новый коммит для применения отмены.

Не используйте reset в публичной истории

При удалении коммита, после которого другие участники команды начали работу, могут возникнуть серьезные проблемы. Когда коллеги попытаются синхронизироваться с вашим репозиторием, часть истории проекта будет просто отсутствовать. На следующей схеме показано, что происходит при использовании команды reset для публичного коммита. Ветка origin/main является версией вашей локальной главной ветки main в центральном репозитории.

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

Примеры

Удаляет указанный файл из раздела проиндексированных файлов, но оставляет рабочий каталог без изменений. Эта команда удаляет из индекса подготовленный файл, не перезаписывая все изменения.

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

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

Удаление файла из раздела проиндексированных файлов

Как видите, команда git reset помогает соблюдать согласованность коммитов, позволяя не вносить изменения, которые не связаны со следующим коммитом.

Удаление локальных коммитов

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

Команда git reset HEAD

2 перемещает указатель текущей ветки на два коммита назад, по сути удаляя из истории проекта оба снимка состояния, которые мы только что создали. Помните, что этот вид команды reset можно использовать только для неопубликованных коммитов. Никогда не выполняйте эту операцию, если вы уже отправили свои коммиты в общий репозиторий.

Резюме

Готовы изучить git reset?

Ознакомьтесь с этим интерактивным обучающим руководством.

Источник

Как отменить commit и не облажаться

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

Проверять будет проще да и тестировать. Но он уже начал ее реализовывать, коммиты уже созданы, и что же делать? Не переписывать же!

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

git revert

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

Работа кипит и осталось дело за малым — смерджить мастер с данными ветками.

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

И что же мы получили? Ни класса Arithmetic, ни класса Numerical!
А все дело в том, что команда git revert создает новый коммит с отменой изменений и не удаляет из истории коммиты. И в нашем случае после слияния веток получается 4 коммита:

То есть вариант с отменой изменений с помощью команды revert вышел нам боком.

git reset

git rebase

Есть еще одно решение — использовать команду git rebase для отмены изменений.
Вернемся к моменту создания двух веток numerical и arithmetic и выполним

Теперь на уровне каждого коммита, который мы хотим отменить заменим pick на drop. И тогда выбранные нами коммиты сбросятся из истории. Например в ветке numerical :

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

Тогда в истории у нас останутся только нужные нам коммиты.
Теперь при слиянии веток в master получим оба класса.

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

Данный метод рабочий, только при условии работы в частной ветке, но если эти манипуляции провести в общей ветке, то при публикации ( git push ) git сообщает, что ветка устарела, так как в ней отсутствуют коммиты и отменяет публикацию.

Чтобы не бороться с git, старайтесь декомпозировать задачи заранее, а то можете словить сюрприз. Сталкивались ли вы с такими ситуациям, и если да, то как выходили из них?

Источник

Доходчивое объяснение Git Reset

Перевод статьи «Git Reset Explained – How to Save the Day with the Reset Command».

«Помогите! Я закоммитил не в ту ветку!» «Ну вот, опять… Где мой коммит?» Знакомые ситуации, правда?

Я такое слышал неоднократно. Кто-то окликает меня по имени и просит помочь, когда у него что-то пошло не так с git. И такое происходило не только когда я учил студентов, но также и в работе с опытными разработчиками.

Со временем я стал кем-то вроде «того парня, который разбирается в Git».

Мы используем git постоянно, и обычно он помогает нам в работе. Но порой (и куда чаще, чем нам хотелось бы!) что-то идет не так.

Бывает, мы отправляем коммит не в ту ветку. Бывает, теряем часть написанного кода. А можем и добавить в коммит что-то лишнее.

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

Но мне всегда казалось, что в этих ресурсах не хватает объяснений, почему нужно делать так, а не иначе. Когда приводится набор команд, что делает каждая из них? И вообще, как вы пришли к этим командам?

В прошлом посте я рассказывал о внутреннем устройстве Git. И хотя понимать его полезно, читая теория практически всегда недостаточна. Как применить свои знания внутреннего устройства git и использовать их для решения возникающих проблем?

Исходные условия — рабочая директория, индекс и репозиторий

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

После того как мы внесли какие-то изменения, мы хотим отправить их в репозиторий. Репозиторий это набор коммитов, каждый из которых представляет собой архив того, как выглядело рабочее дерево проекта на момент создания этого архива (на нашей машине или на чьей-то еще).

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

Давайте создадим в рабочей директории какой-нибудь файл и запустим команду git status :

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

Да, git не записал (не закоммитил) изменения, сделанные в рабочей директории, напрямую в репозиторий.

Вместо этого изменения сначала регистрируются в индексе (или в стейджинге). Оба эти термина означают одно и то же, и оба часто используются в документации git. В этой статье мы тоже будем пользоваться обоими, так как они полностью взаимозаменяемы.

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

Рабочая директория находится в точно таком же состоянии, как индекс и репозиторий.

При выполнении git commit текущая ветка master начинает указывать на только что созданный объект commit.

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

Внутренняя работа git reset

Мне нравится представлять git reset как команду, которая поворачивает вспять описанный выше процесс (внесение изменений в рабочей директории, добавление их в индекс, а затем сохранение в репозиторий).

Стадия 1. Обновление HEAD — git reset —soft

Если вернуться к нашему примеру, HEAD будет указывать на commit 2, и таким образом new_file.txt не будет частью дерева текущего коммита. Но он будет частью индекса и рабочей директории.

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

Стадия 2. Обновление индекса — git reset —mixed

В нашем примере это значит, что индекс будет в том же виде, что и commit 2:

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

Стадия 3. Обновление рабочей директории — git reset —hard

1, а также обновления индекса до (уже обновленного) HEAD, git пойдет еще дальше и обновит рабочую директорию до состояния индекса.

Применительно к нашему примеру это означает, что рабочая директория будет приведена к состоянию индекса, который уже приведен в состояние commit 2:

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

Собственно, мы вернули весь процесс на этап до создания файла my_file.txt.

Применяем наши знания в реальных сценариях

1. Упс! Я закоммитил что-то по ошибке

Рассмотрим следующий сценарий. Мы создали файл со строкой «This is very importnt», отправили его в стейджинг, а после — в коммит.

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

А затем — ой! — обнаружили, что в предложении у нас опечатка.

2. Упс! Я сделал коммит не в ту ветку, а эти изменения мне нужны в новой ветке

Со всеми нами такое случалось. Сделал что-то, закоммитил…

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

О нет, мы сделали коммит в ветку master, а надо было создать новую и затем сделать пул-реквест.

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

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

Собственно, от желаемого состояния нас отделяют три изменения.

Мы можем достичь желаемого положения в три шага:

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

Во-вторых, нужно сделать так, чтобы master указывала на предыдущий коммит (иными словами, на HEAD

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

3. Упс! Я отправил коммит не в ту ветку, а он мне нужен в другой (уже существующей) ветке

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

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

Давайте снова изобразим текущее и желаемое положение:

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

У нас опять же есть три отличия.

Теперь наше положение следующее:

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

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

1 — теперь мы вернулись к изначальному состоянию этой ветки.

Таким образом мы достигли желаемого положения:

Что такое git reset. Смотреть фото Что такое git reset. Смотреть картинку Что такое git reset. Картинка про Что такое git reset. Фото Что такое git reset

Итоги

Также мы применили свои новые знания для решения жизненных задач.

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *