Контроль версий является неотъемлемой частью повседневной жизни разработчиков программного обеспечения. Трудно представить себе какую-либо команду, разрабатывающую программное обеспечение без использования инструмента контроля версий. Столь же трудно представить себе любого разработчика, который не работал с 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:
- Сохранить изменения в ветви A.
- Запустите
git stash
. - Выезд из филиала Б.
- Исправлена ошибка в ветке B.
- Фиксация и (необязательно) отправка на пульт дистанционного управления.
- Проверьте ветвь A
- Run
git 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..