git-stash проти git-branch


92

У попередньому питанні Git Даніель Бенамі говорив про робочий процес у Git:

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

Він хотів відновити свій робочий стан до попереднього моменту, не втрачаючи поточних змін. Всі відповіді оберталися навколо, різними способами, приблизно так

git branch -m master crap_work
git branch -m previous_master master

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


@ Джорді Банстер : Дякую, це прояснює ситуацію. Думаю, я якось вважав би "сховання" схожим на легку, безіменну гілку. Отже, все, що можна зробити, може і галузь, але з більшою кількістю слів. Приємно!

Відповіді:


109

'stash' бере незакріплені " брудні " речі на вашій робочій копії та зберігає їх, залишаючи вам чисту робочу копію.

Це насправді взагалі не розгалужується. Потім ви можете застосувати схованку поверх будь-якої іншої гілки. Або, починаючи з Git 1.6, ви можете зробити:

git stash branch <branchname> [<stash>]

застосувати схованку поверх нової гілки, все в одній команді.

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

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


1
одне, що мене кусає ... чи можете ви написати, як насправді виглядає [<stash>]! Вони вкладають це в цю нотацію в документах, але не очевидно, чи має це бути 1 або @ {1} чи що.
Gregg Lind

1
Якщо ви хочете послатись на конкретний тайник "N", використовуйте stash @ {N}
Jordi Bunster

9
Перегляньте git stash listназви ваших схованки.
idbrii

6
Грегге, так, ти можеш: git stash save (назва вашого сховища). Робить це набагато кориснішим, якщо ви багато використовуєте його, щоб ви знали, що робить кожен схован. Ви можете використовувати git stash show -p (name), щоб показати вам патч схованки.
Томас Вандер Стікеле 02.03.11

7
також, git stash show -uщоб показати різницю схованки проти робочої копії.
ken

49

Після відновлення схованки ваші зміни повторно застосовуються, і ви продовжуєте працювати над своїм кодом.

Щоб зберегти поточні зміни

$ git stash save 
Saved "WIP on master: e71813e..."

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

$ git stash list
stash@{0}: WIP on master: e71813e..."

Зверніть увагу на stash@{0}частину? Це ваш ідентифікатор схованки. Він вам знадобиться, щоб відновити його пізніше. Давайте зробимо це прямо зараз. Ідентифікатор схованки змінюється при кожному створеному вами схованці. stash @ {0} відноситься до останнього схованки, яке ви зробили.

Застосувати схованку

$ git stash apply stash@{0}

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

$ git stash drop stash@{0}

Або, оскільки схованка діє як стек, ви можете витягнути останню збережену схованку:

$ git stash pop

Якщо ви хочете стерти всі свої схованки, запустіть команду 'clear':

$ git stash clear

Цілком може бути, що ви не так часто використовуєте схованки. Якщо ви просто хочете швидко сховати зміни, щоб відновити їх пізніше, ви можете залишити ідентифікатор сховища.

$ git stash
...
$ git stash pop

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

У моєму блозі також є більш поглиблена версія цього .


набагато корисніший ресурс, ніж передбачувана „найкраща” відповідь ... (хоча найкраща відповідь все це
дала

9

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

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

Зверніть увагу, що я використовую git 1.5.4.3, і, на мою думку, 1.6 додає git stash pop, який, на мою думку, застосує вибраний тайник і видалить його зі списку. Що здається набагато чистішим.

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


3
Ви робите гілки, не даючи їм корисних назв? Якщо ні, то я не розумію, чому ви не робите те саме зі схованкою. Якщо ви дійсно хочете знати, що вони містять, ви просто використовуєте git-stash show, щоб показати, які файли змінено, або git-stash застосовуйте та git-diff, щоб побачити фактичні відмінності. Зберігання схованки - це те саме, що тримати свої гілки під контролем.
Xiong Chiamiov

18
насправді ви можете видалити один тайник, використовуючиgit stash drop [<stash>]
kumarharsh

1
Правда, git вже давно втрачає git stash. Зараз набагато менше ПІТА. Я використовую його щодня, і навіть протягом тривалого періоду часу, зараз.
webmat

3

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

Основні відмінності від git stash:

  • git stashвузько зберігає брудний git-стан (модифіковані файли та додані файли в індексі), тоді git-bottleяк призначений для збереження всього, що відрізняється від цього HEAD, і він зберігає диференціацію між модифікованими, модифікованими та не доданими, не доданими, не об’єднаними шляхами, і повний стан перебазування / злиття ( .gitignoreне зберігаються лише шляхи в ).
  • git stashзберігає в схованці об’єкти, які потрібно вести окремо. Якби я щось сховав 2 тижні тому, я міг би не запам'ятати це, тоді як git-bottleзберігає як попередні коміти до поточної гілки . Зворотна дія - git-unbottleце еквівалент git stashpop. Ці коміти можна передавати та ділити між репозиторіями. Це може бути корисно для віддалених збірок, де у вас є інше сховище на віддаленому сервері лише для побудови або для співпраці з іншими людьми щодо вирішення конфліктів.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.