Какая разница между Git Revert, Checkout и Reset?

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

Ответ 1

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

git revert

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

git checkout

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

git reset

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

Используя эти команды

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

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

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

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

Ответ 2

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

Ответ 3

  • git checkout изменяет ваше рабочее дерево,
  • git reset изменяет ссылку, на которую указывает ваша ветка,
  • git revert добавляет изменения отмены команды.

Ответ 4

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

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

http://book.git-scm.com/4_undoing_in_git_-_reset,_checkout_and_revert.html

Ответ 5

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

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

Вы можете посмотреть эту ссылку - Reset, Checkout and Revert

Ответ 6

Скажем, вы совершили:

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.