В чем разница между Git Revert, Checkout и Reset? - PullRequest
227 голосов
/ 02 декабря 2011

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

Ответы [ 6 ]

407 голосов
/ 02 декабря 2011

Эти три команды имеют совершенно разные цели. Они даже отдаленно не похожи.

git revert

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

git checkout

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

git reset

Эта команда немного сложнее. Это на самом деле делает несколько разных вещей в зависимости от того, как он вызывается. Он изменяет индекс (так называемая «промежуточная зона»). Или это меняет то, на какой коммит в данный момент указывает голова ветки. Эта команда может изменить существующую историю (путем изменения коммита, на который ссылается ветвь).

Использование этих команд

Если коммит был сделан где-то в истории проекта, и вы позже решили, что коммит был неправильным и не должен был быть сделан, тогда git revert является инструментом для работы. Он отменит изменения, внесенные плохим коммитом, записав «отмену» в истории.

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

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

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

27 голосов
/ 02 декабря 2011
  • git revert используется для отмены предыдущего коммита. В git вы не можете изменить или стереть предыдущий коммит. (На самом деле вы можете, но это может вызвать проблемы.) Поэтому вместо редактирования более раннего коммита, возврат вводит новый коммит, который переворачивает более ранний.
  • git reset используется для отмены изменений в вашем рабочем каталоге, которые еще не были завершены.
  • git checkout используется для копирования файла из какого-либо другого коммита в ваше текущее рабочее дерево. Он не фиксирует файл автоматически.
23 голосов
/ 15 июля 2017

Допустим, у вас есть коммиты:

C
B
A

git revert B, создаст коммит, который отменяет изменения в B.

git revert A, создаст коммит, который отменяетизменения в A, но не затронут изменения в B

Обратите внимание, что если изменения в B зависят от изменений в A, возврат A невозможен.

git reset --soft A, изменит историю коммитов и репозиторий;промежуточный и рабочий каталог по-прежнему будут в состоянии C.

git reset --mixed A, изменит историю фиксации, репозиторий и промежуточное размещение;рабочий каталог все еще будет в состоянии C.

git reset --hard A, изменит историю фиксации, репозиторий, промежуточный и рабочий каталог;Вы полностью вернетесь в состояние A.

20 голосов
/ 02 декабря 2011
  • git checkout изменяет ваше рабочее дерево,
  • git reset изменяет ссылку на ветвь, на которую вы указываете,
  • git revert добавляет фиксацию отмены изменений.
6 голосов
/ 18 ноября 2015

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

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

Вы можете посмотреть по этой ссылке Сброс, извлечение и возврат

5 голосов
/ 02 декабря 2011

Если вы сломали дерево, но не зафиксировали код, вы можете использовать git reset, а если вы просто хотите восстановить один файл, вы можете использовать git checkout.

Если вы сломали дерево и зафиксировали код, вы можете использовать git revert HEAD.

http://book.git -scm.com / 4_undoing_in_git _-_ reset, _checkout_and_revert.html

...