• Время чтения ~6 мин
  • 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. Ветви А и В расходятся друг от друга в течение довольно долгого времени и имеют разные головы. Во время работы над некоторыми файлами в ветви A ваша команда просит вас исправить ошибку в ветви B. Вы быстро сохраняете изменения в A и пытаетесь проверить ветвь B с помощью git checkout B. Git немедленно прерывает операцию и выдает ошибку: «Ваши локальные изменения в следующих файлах будут перезаписаны при оформлении заказа... Пожалуйста, зафиксируйте изменения или сохраните их перед переключением ветвей».

В этом случае есть несколько способов включить переключение ветвей:

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

Второй способ — плохая идея. Первый метод, хотя и кажется обычным, менее гибкий, потому что незавершенные сохраненные изменения рассматриваются как контрольная точка, а не исправление, которое все еще находится в стадии разработки. Это именно тот сценарий, для которого предназначен тайник git.

Хранилище Git сохраняет незафиксированные изменения локально, позволяя вносить изменения, переключать ветви и выполнять другие операции Git. Затем вы можете повторно применить скрытые изменения, когда они вам понадобятся. Тайник локально ограничен и не передается на удаленный компьютер .git push

How to use git stash

Вот последовательность, которой следует следовать при использовании git stash:

  1. Сохранить изменения в ветви A.
  2. Запустите git stash.
  3. Выезд из филиала Б.
  4. Исправлена ошибка в ветке B.
  5. Фиксация и (необязательно) отправка на пульт дистанционного управления.
  6. Проверьте ветвь A
  7. Rungit stash pop, чтобы вернуть свои скрытые изменения.

Git хранит изменения, внесенные в рабочий каталог, локально (в каталоге .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 -u или git stash --include-untracked stash untracked files.
  • git stash -a или git stash --all stash untracked files and ignилиed files.

Чтобы спрятать определенные файлы, вы можете использовать команду git stash -p или git stash –patch:

$ 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. Тайники сохраняются в режиме LIFO(last in-first-out):

$ 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 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_id> позволяет просматривать дифф тайника:

$ 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 "sample stash" 
63a711cd3c7f8047662007490723e26ae9d4acf9

Иногда вы можете решить отправить созданную запись тайника в git stash create рефлог тайника:

$ 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