Який передбачуваний кейс для приховування в git?


143

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

Якщо я працюю над «А» і хочу перестати працювати на день, чи потрібно призупинити свою роботу, а потім застосувати її на наступний день (коли я відновлю роботу), чи потрібно просто залишити речі такими, якими вони є - незапущені змінені файли в робочий каталог? Я не бачу, чому мені потрібно використовувати скриньку в цьому випадку, за винятком випадків, коли є якась пільга.

Також ще один сценарій: я працюю і на роботі, і вдома. Якщо я не готовий взяти на себе зобов’язання, коли хочу повернутися додому, чи можу я приховати свою роботу, підштовхнути її до GitHub і потім витягнути цю скриньку вдома?


3
багато в чому залежать від політики вашої компанії, якщо така є. Як ви оберете «прийняту» відповідь?
Демон-художник

1
Це питання сформульований просто просять думки (я повинен використовувати мерзотник цей шлях або що шлях?) І , таким чином , повинні бути закриті або відредаговані.
TylerH

Відповіді:


161

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

Єдине місце, яке мені подобається приховувати, - це якщо я виявив, що я щось забув у своєму останньому зобов'язанні і вже почав працювати над наступним у тій же галузі:

# Assume the latest commit was already done
# start working on the next patch, and discovered I was missing something

# stash away the current mess I made
git stash save

# some changes in the working dir

# and now add them to the last commit:
git add -u
git commit --amend

# back to work!
git stash pop

2
Чи те, що ви додали, що пропало, зливається в сховище, як тільки ви знімаєте його? (Я все ще хитаюся щодо того, як працює часова шкала в git - я припускаю, що ви переписуєте історію ??)
Kiki Jewell

@KikiJewell спливаючі зміни застосовуються до індексу - вони не здійснюються. тож якщо ви git stash popдвічі, ви втратите відмінність між цими двома наборами змін.
Мурейник

Станом на кінець жовтня 2017 року в списку розсилки Git велика дискусія, в якій команда git stash save застаріла на користь існуючої альтернативи git stash push. Основна причина цього полягає в тому, що git stash pushвводиться варіант зберігання вибраних контурів шляху , щось git stash saveне підтримує.
Кришна Гупта

39

Я відповім на три абзаци.

Частина 1:

git stash(Щоб зберегти неприйнятні зміни в "сховищі". Примітка. Це видаляє зміни з робочого дерева!)

git checkout some_branch(зміна на передбачувану галузь - у цьому випадку some_branch)

git stash list (перерахуйте скриньки)

Ви можете побачити:
stash @ {0}: WIP на {гілка_файла}: {SHA-1 останнього комітету} {остання фіксація вашої гілки}
приховування @ {0}: WIP на майстер: 085b095c6 модифікація для тесту

git stash apply (застосувати скриньку до робочого дерева в поточній гілці)

git stash apply stash@{12}(якщо у вас буде багато прихованих даних, ви можете вибрати, яку копію буде застосовано - у цьому випадку ми застосуємо скриньку 12)

git stash drop stash@{0}(видалити зі списку сховища - у цьому випадку приховувати 0)

git stash pop stash@{1} (застосувати вибраний скрипт і випустити його зі списку сховища)

Частина 2:
Ви можете приховати свої зміни за допомогою цієї команди, але це не обов'язково.
Ви можете продовжити на наступний день без приховування.
Це команди для приховування змін та роботи над різними гілками або для здійснення деякої реалізації вашого коду та збереження в сховищах без гілок та коммітерів або вашої власної справи!
А пізніше ви можете скористатися деякими прихованими та перевірити, що краще.

Частина 3:
Команда приховування для локального приховування змін.
Якщо ви хочете працювати віддалено, ви повинні взяти на себе зобов'язання та натиснути.


10

Основна ідея

Заховайте зміни в брудному робочому каталозі подалі

Отже команда Basicallly Stash зберігає свої зміни, які вам не потрібні або потрібні на даний момент; але вони можуть вам знадобитися.

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


7

Ви можете використовувати такі команди:

  • Щоб зберегти свої незапрошені зміни

    git stash

  • Щоб перерахувати збережені сховища

    git stash list

  • Застосувати / повернути невмілі зміни, де х 0,1,2 ...

    git stash apply stash@{x}

Примітка:

  • Щоб застосувати копію та видаліть її зі списку

    git stash pop stash@{x}

  • Щоб застосувати скриньку та зберегти її у списку

    git stash apply stash@{x}


4

Якщо ви потрапите, git stashколи у вас є зміни в робочій копії (не в області постановки), git створить прихований об’єкт і натисне на стек сховищ (так само, як ви це зробили, git checkout -- .але ви не втратите зміни). Пізніше ви можете вискочити з верхньої частини стека.


2

Команда stash приховує всі зміни, які ви внесли з моменту останнього вчинення. У вашому випадку немає підстав для того, щоб приховувати, якщо ви збираєтеся продовжувати працювати над ним наступного дня. Я б використовував скриньку лише для того, щоб скасувати зміни, які ви не хочете робити.


2
Ні, git stashне змінить вашу філію. Це особливо не "поверне" будь-які здійснені зміни. Це лише (тимчасово) відкине будь-які невідомі зміни у ваших файлах. - Це може здатися прискіпливим, але такі слова мають дуже особливе значення в контексті git. Вам не слід змішувати це.
micha

Дякуємо, що вказали на це. Я відповідно змінив свою відповідь.
Северин

У git "гілка" визначається як серія комітів. git stashне торкнеться жодних комітетів, і тому взагалі не змінить жодної гілки. Він нічого не "видалить" із гілки, а не "скине" його жодним чином. Гілка залишається такою ж, змінюються лише файли в робочому дереві. - Це дві абсолютно різні речі.
michas

Він не відкидає, а "приховує" ваші зміни! Git підтримує структуру LIFO для сховищ, тому сховище насправді є поштовхом, і ви можете попхнути з верху. Слово "відкинути" означає, що ви втратите що-небудь, але не будете.
gyorgyabraham

2

Я знаю, що StackOverflow не є місцем для відповідей, що базуються на думках, але я дійсно маю хорошу думку про те, коли відкладати зміни зі сховищем.

Ви не хочете здійснювати експериментальні зміни

Коли ви вносите зміни у робочу область / робоче дерево, якщо вам потрібно виконати будь-які операції на базі гілок, такі як злиття, натискання, витягнення або витягнення, ви повинні знаходитись у точці точки збору. Тож якщо у вас є зміни в робочій області, вам потрібно зробити їх. Але що робити, якщо ви не хочете їх виконувати? Що робити, якщо вони експериментальні? Щось, чого ви не хочете, щоб частина вашої історії зобов’язань? Щось, чого ви не хочете, щоб інші бачили, коли ви натискаєте на GitHub?

Ви не хочете втрачати локальні зміни з допомогою жорсткого скидання

У такому випадку ви можете зробити жорсткий скидання. Але якщо зробити жорсткий перезавантаження, ви втратите все місцеве робоче дерево тому що все буде перезаписано там, де воно було в момент останнього введення, і ви втратите всі свої зміни.

Отже, що стосується відповіді "коли слід приховувати", відповідь полягає в тому, коли вам потрібно повернутися до чистої точки фіксації із синхронізованим робочим деревом / індексом / фіксацією, але ви не хочете втрачати свої локальні зміни в процес. Просто відкладіть свої зміни в сховищі, і ви добре.

І як тільки ви зробите свою сховище, а потім об'єднаєте, потягнете або висунете, ви можете просто приховати поп або застосувати, і ви повернетесь туди, звідки почали.

Git stash та GitHub

GitHub постійно додає нові функції, але на сьогоднішній день існує спосіб зберегти сховище там. Знову ж таки, ідея приховування полягає в тому, що це місцевий та приватний характер. Ніхто інший не може зазирнути у вашу скриньку без фізичного доступу до вашої робочої станції. Так само, як git reflog є приватним, а журнал git є загальнодоступним. Це, мабуть, не було б приватним, якби його підштовхнули до GitHub.

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

git diff > git-dif-file.diff

попс скриньку

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.