• Час читання ~3 хв
  • 12.03.2023

Контроль версій є невід'ємною частиною повсякденного життя розробників програмного забезпечення. Важко уявити будь-яку команду, яка розробляє програмне забезпечення, без використання інструменту контролю версій. Так само важко уявити собі будь-якого розробника, який не працював (або хоча б чув про) Git. В опитуванні розробників Stackoverflow 2018 року 87,2% з 74 298 учасників використовують Git для контролю версій.

Лінус Торвальдс створив git в 2005 році для розробки ядра Linux. У цій статті описано команду git stash та досліджено деякі корисні параметри для приховування змін. Він передбачає, що ви маєте базове знайомство з концепціями Git і добре розумієте робоче дерево, область постановки та пов'язані з нею команди.

Why is git stash impабоtant?

Перше, що потрібно зрозуміти, чому важливо приховувати зміни в Git. Припустимо на мить, що у Git немає команди заховати зміни. Припустимо, ви працюєте над сховищем з двома гілками, A і B. Гілки А і В досить довго розходилися один від одного і мають різні головки. Під час роботи над деякими файлами у відділенні А ваша команда просить вас виправити помилку у відділенні B. Ви швидко зберігаєте свої зміни в A і намагаєтеся перевірити гілку B за допомогою git checkout B. Git негайно перериває операцію і викидає помилку: «Ваші локальні зміни в наступних файлах будуть перезаписані шляхом оформлення замовлення ... Будь ласка, внесіть свої зміни або сховайте їх, перш ніж перемикати гілки».

У цьому випадку є кілька способів увімкнути перемикання гілок:

  • Створіть коміт на цьому етапі в гілці А, здійсніть і підштовхніть свої зміни, щоб виправити помилку в B, а потім знову перевірте A і запустітьgit reset HEAD^, щоб повернути свої зміни.
  • Вручну зберігайте зміни у файлах, які не відстежуються Git.

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

Git stash зберігає непідтверджені зміни локально, дозволяючи вносити зміни, перемикати гілки та виконувати інші операції Git. Потім ви можете повторно застосувати приховані зміни, коли вони вам знадобляться. Заначка локально прикута і не підштовхується до пульта .git push

How to use git stash

Ось послідовність, якої слід дотримуватися при використанні git stash:

  1. Зберегти зміни в гілці A.
  2. Біг git stash.
  3. Ознайомтеся з гілкою Б.
  4. Виправити помилку в гілці Б.
  5. Візьміть на себе зобов'язання і (за бажанням) перейдіть на пульт.
  6. Перевірте гілку A
  7. Rungit stash pop, щоб повернути свої приховані зміни.

Git stash зберігає зміни, внесені вами в робочий каталог локально (всередині каталогу .git вашого проекту; /.git/refs/stashякщо бути точним) і дозволяє отримувати зміни, коли вони вам потрібні. Це зручно, коли вам потрібно перемикатися між контекстами. Це дозволяє зберігати зміни, які можуть знадобитися пізніше, і є найшвидшим способом очистити робочий каталог, зберігаючи зміни незмінними.

How to create a stash

Найпростіша команда для приховування змін : git stashза

$ git stash
Saved wабоking directабоy and index state WIP on master; d7435644 Feat: configure graphql endpoint

замовчуванням git stash зберігає (або "ховає") неузгоджені зміни (поетапні та нестаціонарні файли) та оглядає необроблені та проігноровані файли. Зазвичай вам не потрібно приховувати невідстежувані та проігноровані файли, але іноді вони можуть заважати іншим речам, які ви хочете зробити у вашій кодовій базі.

Ви можете використовувати додаткові параметри, щоб дозволити git stash піклуватися про невраховані та проігноровані файли:Щоб заховати певні файли, ви можете використовувати команду git stash -p або git stash –patch:

  • git stash -u або git stash --include-untracked stash untracked files.
  • git stash -a або git stash --all stash untracked files and ignабоed files.

$ git stash --patch
diff --git a/.gitignабоe b/.gitignабоe
index 32174593..8d81be6e 100644
--- a/.gitignабоe
+++ b/.gitignабоe
@@ -3,6 +3,7 @@
 # dependencies
 node_modules/
 /.pnp
+f,fmfm
 .pnp.js

 # testing
(1/1) Stash this hunk [y,n,q,a,d,e,?]?

Listing your stashes

Ви можете переглядати свої заначки за допомогою команди git stash list. Заначки зберігаються в підході last-in-first-out (LIFO):

$ git stash list
stash@{0}: WIP on master: d7435644 Feat: configure graphql endpoint

За замовчуванням заначки позначаються як WIP поверх гілки і фіксують, що ви створили схованку. Однак ця обмежена кількість інформації не корисна, коли у вас є кілька схованок, оскільки стає важко запам'ятати або окремо перевірити їх вміст. Щоб додати опис до заначки, можна скористатися командою git stash save <description>:

$ git stash save "remove semi-colon from schema"
Saved wабоking directабоy and index state On master: remove semi-colon from schema

$ git stash list
stash@{0}: On master: remove semi-colon from schema
stash@{1}: WIP on master: d7435644 Feat: configure graphql endpoint

Retrieving stashed changes

Ви можете повторно застосувати приховані зміни командами git stash apply та git stash pop. Обидві команди повторно застосовують зміни, stash@{0}сховані в останній заначці (тобто ). A stash повторно застосовує зміни, видаляючи pop зміни зі схованки та повторно застосовуючи їх до робочої копії. Спливаюче вікно є кращим, якщо вам не потрібно, щоб приховані зміни застосовувалися повторно кілька разів.

Ви можете вибрати, яку заначку ви хочете вискочити або застосувати, передавши ідентифікатор як останній аргумент:

$ git stash pop stash@{1} 

або

$ git stash apply stash@{1}

Cleaning up the stash

Хороша практика видаляти заначки, які більше не потрібні. Ви повинні зробити це вручну за допомогою наступних команд:Команда git stash show <stash_id> дозволяє переглядати диф заначки:Щоб отримати більш детальний диф, передайте --patch або -p прапорець:

  • git stash clear empties the stash list by removing all the stashes.
  • git stash drop <stash_id> deletes a particular stash from the stash list.

Checking stash diffs

$ git stash show stash@{1}
console/console-init/ui/.graphqlrc.yml        |   4 +-
console/console-init/ui/generated-frontend.ts | 742 +++++++++---------
console/console-init/ui/package.json          |   2 +-

To get a mабоe detailed diff, pass the --patch або -p flag:

$ git stash show stash@{0} --patch
diff --git a/console/console-init/ui/package.json b/console/console-init/ui/package.json
index 755912b97..5b5af1bd6 100644
--- a/console/console-init/ui/package.json
+++ b/console/console-init/ui/package.json
@@ -1,5 +1,5 @@
 {
- "name": "my-usepatternfly",
+ "name": "my-usepatternfly-2",
  "version": "0.1.0",
  "private": true,
  "proxy": "http://localhost:4000"
diff --git a/console/console-init/ui/src/AppNavHeader.tsx b/console/console-init/ui/src/AppNavHeader.tsx
index a4764d2f3..da72b7e2b 100644
--- a/console/console-init/ui/src/AppNavHeader.tsx
+++ b/console/console-init/ui/src/AppNavHeader.tsx
@@ -9,8 +9,8 @@ impабоt { css } from "@patternfly/react-styles";

interface IAppNavHeaderProps extends PageHeaderProps {
- toolbar?: React.ReactNode;
- avatar?: React.ReactNode;
+ toolbar?: React.ReactNode;
+ avatar?: React.ReactNode;
}

expабоt class AppNavHeader extends React.Component<IAppNavHeaderProps>{
  render()

Checking out to a new branch

You might come across a situation where the changes in a branch and your stash diverge, causing a conflict when you attempt to reapply the stash. A clean fix fабо this is to use the command git stash branch <new_branch_name stash_id>, which creates a new branch based on the commit the stash was created from and pops the stashed changes to it:

$ git stash branch test_2 stash@{0}
Switched to a new branch 'test_2'
On branch test_2
Changes not staged fабо commit:
(use "git add <file>..." to update what will be committed)
(use "git restабоe <file>..." to discard changes in wабоking directабоy)
modified: .graphqlrc.yml
modified: generated-frontend.ts
modified: package.json
no changes added to commit (use "git add" and/або "git commit -a")
Dropped stash@{0} (fe4bf8f79175b8fbd3df3c4558249834ecb75cd1)

Stashing without disturbing the stash reflog

У рідкісних випадках вам може знадобитися створити заначку, зберігаючи журнал посилань на заначку (reflog) недоторканим. Ці випадки можуть виникнути, коли вам потрібен сценарій, який потрібно заховати як деталь реалізації. Це досягається git stash create командою; вона створює запис заначки і повертає назву свого об'єкта, не підштовхуючи його до рефлогу заначки:Іноді ви можете вирішити перемістити створений запис git stash create заначки до рефлогу заначки:

$ git stash create "sample stash" 
63a711cd3c7f8047662007490723e26ae9d4acf9

$ git stash stабоe -m "sample stash testing.." "63a711cd3c7f8047662007490723e26ae9d4acf9"
$ git stash list
stash @{0}: sample stash testing..

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Про автора CrazyBoy49z
WORK EXPERIENCE
Контакти
Ukraine, Lutsk
+380979856297