Остаточне керівництво по Git Reset і Git Revert

Ласкаво просимо до нашого остаточного посібника з команд git resetі git revert. Цей підручник навчить вас усьому, що вам потрібно знати про виправлення типових помилок та скасування поганих комітів під час використання Git.

Зрозумійте три розділи проекту Git

Проект Git складається з трьох основних розділів:

  1. Каталог Git
  2. Робочий каталог (або робоче дерево)
  3. Площа постановки

Каталог Git (знаходиться в YOUR-PROJECT-PATH/.git/) - це місце, де Git зберігає все необхідне для точного відстеження проекту. Це включає метадані та базу даних об’єктів, яка включає стислі версії файлів проекту.

Робочий каталог , де користувач робить локальні зміни в проект. Робочий каталог витягує файли проекту з об'єктної бази даних каталогу Git і розміщує їх на локальній машині користувача.

Примітка: Каталог також відомий як сховище або репозиторій короткої форми. Ретпо на локальній машині користувача називається "Локальне репо", тоді як репо на сервері git - "Віддалене репо".

Область проходження - це файл (також званий "індекс", "етап" або "кеш"), що зберігає інформацію про те, що буде входити до вашого наступного коміту. Фіксація - це коли ти кажеш Git зберегти ці поетапні зміни. Git робить знімок файлів такими, які вони є, і постійно зберігає цей знімок у каталозі Git.

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

Скидання Git

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

Скиньте файл або набір файлів

Наступна команда дозволяє вибірково вибирати фрагменти вмісту та скасовувати або скасовувати його.

git reset (--patch | -p) [tree-ish] [--] [paths]

Зніміть файл

Якщо ви перенесли файл у проміжну область за допомогою git add, але більше не хочете, щоб він був частиною фіксації, ви можете використати git resetдля зняття з нього цього файлу:

git reset HEAD FILE-TO-UNSTAGE

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

Скинути гілку до попереднього коміту

Наступна команда скидає HEAD поточної гілки до заданої COMMITта оновлює індекс. В основному він перемотує стан вашої гілки, а потім усі коміти, які ви робите вперед, записують все, що відбулося після точки скидання. Якщо пропустити MODE, за замовчуванням значення --mixed:

git reset MODE COMMIT

Варіанти MODE:

  • --soft: не скидає індексний файл або робоче дерево, але скидає HEAD до commit. Змінює всі файли на "Зміни, які потрібно внести"
  • --mixed: скидає індекс, але не робоче дерево, і повідомляє про те, що не оновлено
  • --hard: скидає індекс та робоче дерево. Будь-які зміни до відстежуваних файлів у робочому дереві commitвідкидаються
  • --merge: скидає індекс і оновлює файли в робочому дереві, які відрізняються між commitHEAD і HEAD, але зберігає ті, що відрізняються між індексом та робочим деревом
  • --keep: скидає записи індексу та оновлює файли в робочому дереві, які відрізняються між commitHEAD та HEAD. Якщо у файлі, який відрізняється від commitHEAD до локальних змін, скидання скасовується

Важлива примітка про жорсткі скидання

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

Git Revert

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

Натомість краще використовувати git revert, що скасовує зміни, внесені попереднім комітом, створюючи абсолютно новий коміт, все без зміни історії комітів.

Повернути коміт або набір комітів

Наступна команда дозволяє скасувати зміни з попереднього коміту або комітів та створити новий коміт.

git revert [--[no-]edit] [-n] [-m parent-number] [-s] [-S[]] … git revert --continue git revert --quit git revert --abort

Загальні варіанти:

 -e --edit
  • Це опція за замовчуванням, і її не потрібно чітко встановлювати. Він відкриває текстовий редактор вашої системи за замовчуванням і дозволяє редагувати нове повідомлення коміту перед комітом повернення.
  • Цей параметр робить протилежне -eі git revertне відкриває текстовий редактор.
  • Цей параметр не дозволяє git revertскасувати попередній коміт і створити новий. Замість того, щоб створювати новий коміт, -nбуде скасовано зміни з попереднього коміту та додано їх до індексу просування та робочого каталогу.
 --no-edit
-n -no-commit

Приклад.

Давайте уявимо собі таку ситуацію: 1.) Ви працюєте над файлом і додаєте та фіксуєте свої зміни. 2.) Потім ви працюєте над кількома іншими речами і робите ще кілька комітів. 3.) Тепер ви розумієте, що три-чотири коміти тому ви зробили щось, що хотіли б скасувати - як ви можете це зробити?

You might be thinking, just use git reset, but this will remove all of the commits after the one you would like to change - git revert to the rescue! Let's walk through this example:

mkdir learn_revert # Create a folder called `learn_revert` cd learn_revert # `cd` into the folder `learn_revert` git init # Initialize a git repository touch first.txt # Create a file called `first.txt` echo Start >> first.txt # Add the text "Start" to `first.txt` git add . # Add the `first.txt` file git commit -m "adding first" # Commit with the message "Adding first.txt" echo WRONG > wrong.txt # Add the text "WRONG" to `wrong.txt` git add . # Add the `wrong.txt` file git commit -m "adding WRONG to wrong.txt" # Commit with the message "Adding WRONG to wrong.txt" echo More >> first.txt # Add the text "More" to `first.txt` git add . # Add the `first.txt` file git commit -m "adding More to first.txt" # Commit with the message "Adding More to first.txt" echo Even More >> first.txt # Add the text "Even More" to `first.txt` git add . # Add the `first.txt` file git commit -m "adding Even More to First.txt" # Commit with the message "Adding More to first.txt" # OH NO! We want to undo the commit with the text "WRONG" - let's revert! Since this commit was 2 from where we are not we can use git revert HEAD~2 (or we can use git log and find the SHA of that commit) git revert HEAD~2 # this will put us in a text editor where we can modify the commit message. ls # wrong.txt is not there any more! git log --oneline # note that the commit history hasn't been altered, we've just added a new commit reflecting the removal of the `wrong.txt`

And with that you're one step closer to getting your black belt in Git.