Відповіді:
Ці три команди мають абсолютно різні цілі. Вони навіть не віддалено схожі.
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