Яка різниця між Git Revert, Checkout та Reset?


273

Я намагаюся дізнатися , як відновити або відкат файлів і проекти в попередній стан, і не розуміє різниці між git revert, checkoutі reset. Чому існують 3 різні команди, здавалося б, однакові цілі, і коли хтось повинен вибрати одну над іншою?

Відповіді:


461

Ці три команди мають абсолютно різні цілі. Вони навіть не віддалено схожі.

git revert

Ця команда створює нову фіксацію, яка скасовує зміни від попереднього виконання. Ця команда додає нову історію до проекту (вона не змінює існуючу історію).

git checkout

Ця команда перевіряє вміст із сховища та розміщує його у вашому робочому дереві. Це також може мати інші ефекти, залежно від того, як викликалася команда. Наприклад, він також може змінити, в якій галузі ви зараз працюєте. Ця команда не вносить жодних змін до історії.

git reset

Ця команда трохи складніше. Насправді це робить кілька різних речей, залежно від способу виклику. Він модифікує індекс (так звана "область постановки"). Або це зміни, на які зараз вказує керівник філії. Ця команда може змінити існуючу історію (змінивши команду, на яку посилається галузь).

Використовуючи ці команди

Якщо десь в історії проекту було зроблено зобов’язання, а ви пізніше вирішите, що комісія є неправильною і її не слід було робити, то git revertце інструмент для виконання завдання. Це скасує зміни, внесені поганим коміксом, записуючи "скасування" в історії.

Якщо ви змінили файл у своєму робочому дереві, але не здійснили зміни, тоді ви можете скористатися git checkoutкопією файлу, який вийшов із нового сховища.

Якщо ви взяли на себе зобов’язання, але не поділилися нею ні з ким іншим, і вирішите, що цього не хочете, ви можете git resetпереписати історію, щоб вона виглядала так, ніби ви ніколи не брали цього на себе.

Це лише деякі можливі сценарії використання. Існують і інші команди, які можуть бути корисними в деяких ситуаціях, і вищезгадані три команди також мають інше використання.


13
Таким чином, три команди можна використовувати для UNDO певної роботи, а це означає, що вони не такі "зовсім інші". Те саме поняття, різні контексти.
Бруно Сантос

16
@BrunoSantos: Підсвічники, свинцеві труби, кинджали та мотузка можуть використовуватися для вбивства людей, але це не означає, що будь-яка з цих речей є особливо схожою.
Дан Ліплення

12
@Dan Mounlding - Насправді, є багато випадків, коли git resetі git checkoutможна зробити те саме. Сказати, що вони "навіть не віддалено схожі" - це не просто перебільшення: це навіть не віддалено. Ці дві команди можуть робити дуже багато різних речей, деякі з яких повністю перетинаються. Приклад: git reset --hardі git checkout -- .зробить точно те саме. І логічно кажучи, git reset --hard <path>і git checkout <path>слід робити саме те саме - git, однак, заважає тобі це робити. Переплутати ці дві команди ДУЖЕ легко.
DanGordon

5
@DanGordon Я розумію, що ми, мабуть, просто матимемо різницю думок тут. Тим не менш, я вважаю, що мені слід дати пояснення. Ви не можете зробити так, git reset --hard <path>як ви можете git checkout <path>саме тому, що дві команди роблять щось зовсім інше. git resetкаже Git перемістити HEAD на іншу команду. git checkoutз іншого боку, зовсім не просить Гіта робити щось з HEAD. Він залишає HEAD в спокої і просто перевіряє файл. Так, ви можете виготовити їх таким чином, щоб вони мали подібний ефект. Але те, що вони насправді роблять , зовсім інше.
Дан Ліплення

46

Скажімо, у вас були коміти:

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повністю.


1
Тож інтуїтивно зрозуміла відповідь .. як щодо оформлення замовлення
MJ Studio

29
  • git revertвикористовується для скасування попереднього комітету. У git ви не можете змінити або стерти більш ранню команду. (Насправді ви можете, але це може спричинити проблеми.) Тож замість редагування попередньої фіксації, повернення вводить нове зобов’язання, яке скасовує попереднє.
  • git reset використовується для скасування змін у вашому робочому каталозі, які ще не були дозволені.
  • git checkoutвикористовується для копіювання файлу з іншої комісії у ваше поточне робоче дерево. Він автоматично не фіксує файл.

7
Я вважаю, що ви неправі щодо "скидання git". "git reset" скидає HEAD до одного з попередніх комісій, він не скидає ваш робочий каталог. Робочий каталог "скидається" на "git checkout [ім'я файлу]"
luigi7up

11
git reset --softскидає лише HEAD, git reset --hardскидає HEAD та ваш робочий каталог.
Егрик

git reset - змішаний (за замовчуванням): вимкнути + нестабільні зміни
NattyC

21
  • git checkout змінює ваше робоче дерево,
  • git reset змінює посилання на галузь, на яку ви вказуєте,
  • git revert додає зміни скасування змін.

4
git reset не просто змінює комісію, на яку вказує гілка , вона також використовується для знеструмлення файлів з індексу, і може змінювати робочу копію за допомогою git reset --mixed(за замовчуванням).

git reset --soft: скасувати зміни, зміни залишаються поетапними (покажчик). git reset - змішаний (за замовчуванням): зніміть + нестабільні зміни, зміни залишаються в робочому дереві. git reset - твердий: зніміть + нестабільність + видалити зміни, нічого не залишилося.
NattyC

6

Скидання - на рівні фіксації скидання - це спосіб перемістити кінчик гілки до іншого коміту. Це можна використовувати для видалення комітетів із поточної гілки.

Повернути - Повернення скасовує комісію, створивши нову комісію. Це безпечний спосіб скасувати зміни, оскільки він не має шансів переписати історію комісій. Контрастуйте це із скиданням git, що змінює існуючу історію фіксації. З цієї причини повернення git слід використовувати для скасування змін на публічній гілці, а скидання git має бути зарезервоване для скасування змін на приватній гілці.

Ви можете подивитися на цьому посиланні - Скинути, Оформити замовлення та Повернутись


5

Якщо ви зламали дерево, але не ввели код, ви можете використовувати git reset, а якщо ви просто хочете відновити один файл, ви можете використовувати git checkout.

Якщо ви зламали дерево та ввели код, ви можете використовувати git revert HEAD.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.