В чем разница между git Revert, Checkout и Reset?

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

6 ответов


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

git revert

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

git checkout

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

git reset

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

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

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

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

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

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


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

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

допустим, у вас были коммиты:

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 полностью.


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

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

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


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

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

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