Відповіді:
Ці три команди мають абсолютно різні цілі. Вони навіть не віддалено схожі.
git revertЦя команда створює нову фіксацію, яка скасовує зміни від попереднього виконання. Ця команда додає нову історію до проекту (вона не змінює існуючу історію).
git checkoutЦя команда перевіряє вміст із сховища та розміщує його у вашому робочому дереві. Це також може мати інші ефекти, залежно від того, як викликалася команда. Наприклад, він також може змінити, в якій галузі ви зараз працюєте. Ця команда не вносить жодних змін до історії.
git resetЦя команда трохи складніше. Насправді це робить кілька різних речей, залежно від способу виклику. Він модифікує індекс (так звана "область постановки"). Або це зміни, на які зараз вказує керівник філії. Ця команда може змінити існуючу історію (змінивши команду, на яку посилається галузь).
Якщо десь в історії проекту було зроблено зобов’язання, а ви пізніше вирішите, що комісія є неправильною і її не слід було робити, то git revertце інструмент для виконання завдання. Це скасує зміни, внесені поганим коміксом, записуючи "скасування" в історії.
Якщо ви змінили файл у своєму робочому дереві, але не здійснили зміни, тоді ви можете скористатися git checkoutкопією файлу, який вийшов із нового сховища.
Якщо ви взяли на себе зобов’язання, але не поділилися нею ні з ким іншим, і вирішите, що цього не хочете, ви можете git resetпереписати історію, щоб вона виглядала так, ніби ви ніколи не брали цього на себе.
Це лише деякі можливі сценарії використання. Існують і інші команди, які можуть бути корисними в деяких ситуаціях, і вищезгадані три команди також мають інше використання.
git resetі git checkoutможна зробити те саме. Сказати, що вони "навіть не віддалено схожі" - це не просто перебільшення: це навіть не віддалено. Ці дві команди можуть робити дуже багато різних речей, деякі з яких повністю перетинаються. Приклад: git reset --hardі git checkout -- .зробить точно те саме. І логічно кажучи, git reset --hard <path>і git checkout <path>слід робити саме те саме - git, однак, заважає тобі це робити. Переплутати ці дві команди ДУЖЕ легко.
git reset --hard <path>як ви можете git checkout <path>саме тому, що дві команди роблять щось зовсім інше. git resetкаже Git перемістити HEAD на іншу команду. git checkoutз іншого боку, зовсім не просить Гіта робити щось з HEAD. Він залишає HEAD в спокої і просто перевіряє файл. Так, ви можете виготовити їх таким чином, щоб вони мали подібний ефект. Але те, що вони насправді роблять , зовсім інше.
Скажімо, у вас були коміти:
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 revertвикористовується для скасування попереднього комітету. У git ви не можете змінити або стерти більш ранню команду. (Насправді ви можете, але це може спричинити проблеми.) Тож замість редагування попередньої фіксації, повернення вводить нове зобов’язання, яке скасовує попереднє.git reset використовується для скасування змін у вашому робочому каталозі, які ще не були дозволені.git checkoutвикористовується для копіювання файлу з іншої комісії у ваше поточне робоче дерево. Він автоматично не фіксує файл.git reset --softскидає лише HEAD, git reset --hardскидає HEAD та ваш робочий каталог.
git checkout змінює ваше робоче дерево,git reset змінює посилання на галузь, на яку ви вказуєте,git revert додає зміни скасування змін.git reset не просто змінює комісію, на яку вказує гілка , вона також використовується для знеструмлення файлів з індексу, і може змінювати робочу копію за допомогою git reset --mixed(за замовчуванням).
Скидання - на рівні фіксації скидання - це спосіб перемістити кінчик гілки до іншого коміту. Це можна використовувати для видалення комітетів із поточної гілки.
Повернути - Повернення скасовує комісію, створивши нову комісію. Це безпечний спосіб скасувати зміни, оскільки він не має шансів переписати історію комісій. Контрастуйте це із скиданням git, що змінює існуючу історію фіксації. З цієї причини повернення git слід використовувати для скасування змін на публічній гілці, а скидання git має бути зарезервоване для скасування змін на приватній гілці.
Ви можете подивитися на цьому посиланні - Скинути, Оформити замовлення та Повернутись
Якщо ви зламали дерево, але не ввели код, ви можете використовувати git reset, а якщо ви просто хочете відновити один файл, ви можете використовувати git checkout.
Якщо ви зламали дерево та ввели код, ви можете використовувати git revert HEAD.
http://book.git-scm.com/4_undoing_in_git_-_reset,_checkout_and_revert.html