Глубокое погружение в различия между Git Revert и Git Reset

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

Это означает, что некоторые файлы могут не обновиться или не создаться в соответствии с основной веткой. Так что в этом случае использование git reset, особенно с жестким суффиксом — -, может быть опасным выбором, и глубокое погружение в его концепцию может помочь нам в его лучшем применении.

Git reset имеет два других варианта:

  • git reset — -soft
  • git reset — -mixed

Но прежде чем перейти к контексту git reset и его варианту, давайте сначала познакомимся с некоторыми терминами.

Примечание: Если вы хотите получить краткое представление о git revet и git reset, прокрутите вниз до последнего раздела.

Терминология объектной модели Git:

Git хранит объекты в этих трех форматах

  • Git Directory: «с помощью команды git-init создается каталог с подкаталогами для объектов, refs/heads, refs/tags и файлов шаблонов.» («Git — git-init Documentation»)

  • Blob: само слово blob означает бинарные большие объекты. Git использует алгоритм шифрования SHA1, чтобы гарантировать, что ни один объект не имеет одинакового имени. Кроме того, этот алгоритм делает эффективным обнаружение ошибок и среднее время поиска. Согласно документации GitHub: «Git blob — это двоичный большой объект, используемый для хранения содержимого объекта в хранилище».

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

  • Дерево: исходя из объяснения Git’а, «объект Tree позволяет хранить группу файлов вместе». Как видно на рисунке ниже, с помощью команды $ git cat-file -p master^{tree} мы можем создать объект дерева

  • Рабочее дерево Git:Это текущий рабочий каталог, над которым вы работаете. Чтобы упорядочить текущие файлы, с которыми вы в данный момент работаете в файловой системе (здесь мы имеем в виду рабочее дерево Git), нам необходимо их проиндексировать.

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

С помощью команды git cat-file вы можете получить объект git-коммита, как в этом примере ниже:

A commit object looks like this:

Tree  95e67358676574c9254f734f5b3f0fc3f43749ed

Parent  6418daa1541f090b7ab144f09b79d93bb9a60218

Author  Ted smith <email@example.com> 1537436987 +0100

Commiter  Ted smith <email@example.com> 1639416517 +0100
Войти в полноэкранный режим Выйти из полноэкранного режима

Что означает Git head?

Активная ветвь — это та, над которой мы сейчас активно работаем. У этой ветки есть HEAD, указывающий на последний коммит.

Важно видеть, на каком коммите был выполнен check out, потому что HEAD указывает именно на этот коммит.

Эти команды могут быть очень полезны, чтобы увидеть, где находится git HEAD, особенно когда это неясно.

git show HEAD.

Важное замечание: здесь мы можем заменить head на id коммита, чтобы проверить, получим ли мы те же данные коммита, что и для HEAD.

Но это будет особенно полезно, если мы сравним это с историей коммитов.
Потому что мы хотим перепроверить самый последний коммит.
Чтобы узнать, какой коммит был записан как самый последний, мы используем эту удобную команду:

git log.

Не всегда HEAD указывает на самый последний коммит. Такое состояние называется отделенным HEAD.

Например, HEAD может указывать на старые коммиты, так как это происходит, если мы выходим из системы с id старых коммитов (а не самого последнего коммита).

Что на самом деле происходит, когда мы используем git revert в действии?

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

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

Вы можете сменить head и запустить git reset с этого staging index.

Что будет потеряно при использовании git reset —hard?

git сбросит изменения и установит позицию Head перед последними изменениями. Это удалит имеющиеся изменения из области хранения.

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

Теперь, когда мы используем команду git reset —hard, индекс staging должен соответствовать рабочему каталогу. Поэтому все коммиты в области меток сбрасываются или теряются для того, чтобы эти индексы staging совпали с рабочим каталогом.

Всегда проверяйте состояние git Head и выполняйте команду git log во время процесса загрузки git.

С помощью git reset —hard мы сбрасываем рабочий каталог, дерево объектов и область постановки и удаляем все изменения в рабочем каталоге.

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

Различные комбинации команды git reset:

Git reset - -hard HEAD
Git reset - -hard HEAD^
Git reset - -hard HEAD~1
Git reset - -hard HEAD~2
Войти в полноэкранный режим Выход из полноэкранного режима

Спасительные команды git reset —hard:

-git log —oneline —graph: эта команда рисует текстовую графическую витрину истории коммитов. Вставив эту команду в git bash cli, вы сможете принять лучшее решение относительно изменений, которые были сделаны с помощью git reset, или изменений, которые вы хотите сделать.

-git reset —hard HEAD@{1} :Это особенно полезно, если вы хотите удалить все изменения с последнего коммита, а также последние стейджированные файлы, а также изменить текущую вершину головы на предыдущую.

Когда использовать git reset soft или mix?

Git reset —soft: Просто обновляет вершину ветви до предыдущей или до вершины предыдущего коммита, если она указана.

Git reset —mix: Сбрасывает все файлы, которые были ранее поставлены. Также обновляет вершину текущей ветки до предыдущей или той, которую мы для неё указали.

Оцените статью
devanswers.ru
Добавить комментарий