Хотите знать, как работает опция reset
Git?
В серии курсов Git по Envato Tuts + я рассмотрел некоторые фундаментальные концепции Git в простых видео.
В этом видео из серии вы узнаете все о Git reset. Вы увидите, как использовать каждый вид сброса и как эти разновидности взаимодействуют с тремя деревьями Git:
- soft : изменяет только HEAD, но не меняет промежуточные файлы в индексных или рабочих файлах.
- mixed : перемещает HEAD и обновляет индекс содержимым ревизии, на которую теперь указывает HEAD.
- hard : перемещает HEAD и обновляет индекс и рабочий каталог — это единственная версия сброса, которая может привести к потере данных.
Я также покажу вам, как использовать git reset
для отдельных файлов.
Основы Git: Сброс
Как работает Git Reset
Git сброс. Что оно делает? Это как вы отменяете некоторые изменения, которые являются локальными для вашего компьютера. Когда вы выполнили какую-то работу, которую вам нужно перемотать, перезагрузка — ваш друг. Вы можете просто начать все сначала. Вы можете перемещаться между содержимым различных коммитов и немного путешествовать во времени.
У вас есть несколько вариантов с git reset. Вы можете работать усердно, мягко и смешанно, а также вы можете управлять и удерживать объекты коммитов или делать это на уровне отдельных файлов.
Каждый из этих трех вариантов влияет на конкретные деревья, которые git использует для обработки ваших файлов и их содержимого.
Как Git Reset влияет на три дерева
Говоря метафорически, каждая опция сброса меняет свое дерево, другую часть того, как git сохраняет снимки.
Деревья, о чем мы здесь говорим? Git использует рабочий каталог, индекс (также известный как промежуточная область) и что-то под названием HEAD для создания и получения коммитов.
Рабочий каталог позволяет вам изменять файлы, которые вы можете поместить в индекс. Эта промежуточная область позволяет вам точно настроить и выбрать то, что вы хотите добавить в ваш следующий коммит. Коммит-объект — это криптографически хешированная версия вашего содержимого. Он имеет некоторые добавленные метаданные и указывает на предыдущие коммиты, что позволяет нам делать биты путешествий во времени.
HEAD — это ссылка, которая указывает на такие объекты фиксации. Это просто указатель, который обновляется с каждым новым коммитом или изменением ветви. Вы можете перемещать его и целиться в любой момент времени с помощью объекта коммита.
Для получения дополнительной информации о деревьях и прочем посмотрите мое видео о трех деревьях и Git . Он охватывает основной рабочий процесс в Git и является прочной основой для лучшего понимания логики использования Git Reset.
Разные объяснения параметров сброса
Теперь давайте посмотрим на разные варианты.
Git reset —hard
Это идет целых девять ярдов. Сначала он переместит HEAD и обновит индекс, указав содержимое коммита, на которое сейчас указывает HEAD. Затем он обновит рабочий каталог содержимым индекса, тем самым, возможно, уничтожив контент, который вы изменили в рабочем каталоге.
Следовательно, это единственная версия сброса git, которая немного опасна, если вы не знаете, что делаете.
Git сброс — смешанный
Это переместит HEAD, а также обновит индекс содержимым желаемого коммита, на который не указывает HEAD. Эта операция не влияет на рабочий каталог.
Смешанный параметр используется по умолчанию, если вы не включили git reset с параметром. Это всегда рабочий каталог, безопасный, поэтому не нужно бояться потерять работу.
Git сброс — мягкий
Эта опция только перемещает ГОЛОВУ и останавливается тут же. По сути, это отменит последнюю команду git commit.
Рабочий каталог и файлы, которые могут быть размещены, по-прежнему не затрагиваются этой операцией.
Использование пути к файлу
Имея все эти опции для сброса git, вы в частности указываете git, где остановить воспроизведение, перематывая содержимое и файлы предыдущих коммитов, чтобы указать деревья, на которые вы хотите повлиять. Мы можем пойти дальше и сбросить программу с помощью пути к файлу.
Если вы используете путь, Git не будет двигаться HEAD. Почему? Потому что HEAD указывает на объект фиксации, и он не может указывать только на его подмножество. Другими словами, HEAD указывает не на конкретные файлы, а на объекты фиксации, которые состоят из файлов блоков и некоторых метаданных. Индекс и рабочий каталог, с другой стороны, могут быть адресованы срезами.
Только индекс и рабочий каталог играют роль при использовании пути. Он просто копирует содержимое файла в индекс и больше ничего не может сделать. git reset some-file.ext
предполагает, что по умолчанию вы имели в виду git reset --mixed HEAD some-file.ext
и не влияет на рабочий каталог.
Кстати, поскольку HEAD не может двигаться, мягкая опция будет бессмысленной. Допустим, вы работали над версией 3 файла и добавили его в индекс для следующего комментария. Теперь вы хотите отменить изменения. Запустите git reset some-file.ext
чтобы удалить этот конкретный файл.
В результате индекс будет заполнен состоянием вашего файла начиная с версии 2, версии вашего последнего коммита, на который указывает коммит HEAD. Изменения, которые вы внесли в свой файл, в основном версии 3, все еще доступны в рабочем каталоге. Вы все еще можете получить эти изменения на этапе версии 3 этого файла.
Итак, что вы делаете с git reset some-file.ext
это то, что вы манипулируете только индексом
Сброс против Checkout
Как насчет git reset --hard some-file.ext
? Почему мы не можем использовать это также?
Эта функциональность выполняется git checkout
с именем файла. git checkout some-file.ext
— это то, что должен делать git reset --hard some-file.ext
, но Git не позволяет использовать опцию hard.
Давайте сделаем еще один шаг вперед. Мы можем нацелить любой коммит на сброс определенного файла, а не только самого последнего, представленного HEAD. Это сбрасывает целевые файлы в индексе в состояние определенного коммита, опять же, не затрагивая рабочий каталог или какой-либо коммит.
После того, как вы вернули индекс в состояние определенного коммита, своего рода обратное обновление, вы можете использовать git checkout
с именем файла, чтобы извлечь содержимое индекса в ваш рабочий каталог.
Зачем использовать заказ? Потому что git reset --hard
с файлом — это не то, что Git позволяет вам делать.
Но будь осторожен. Использование git checkout
с путем к файлу избавит вас от последних изменений в вашем рабочем каталоге и заменит его версией файла в этом конкретном коммите.
Смотреть больше Git Courses
Если вы нашли это полезным, почему бы не проверить еще несколько курсов Git?
Вы можете посмотреть наше введение в Git и GitHub или попробовать другие курсы кофе-брейков из этой серии: