Спеціальна гілка git stash чи для цілого сховища?


95

Я зайшов у філію і зробив якусь роботу. Я хотів перейти в інше відділення, але не хотів робити зобов’язання, тому я зробив git stash. Тоді я зробив git checkout <otherbranch>. Я зробив там якусь роботу, і, як і в першій гілці, я хотів вимкнути її, перш ніж виконати роботу. Так я git stashтам теж зробив . Я повернувся до першої гілки і спробував її зняти ( git stash pop), думаючи, що вона отримає схованку з цієї конкретної гілки. Я був здивований, що він розкрутив схованку <otherbranch>(остання схована). У мене склалося враження, що схованка залежить від галузі, але така поведінка свідчить про те, що для всього локального сховища існує лише одна схованка.

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

Відповіді:


43

Щоб переглянути поточний стек стелажу:

git stash list

Щоб вибрати певний тайник зі стеку, зверніться до нього, як показано вище.stash@{number}

Якщо ви хочете, щоб поведінка була по гілці, ви можете просто зробити коміт (або кілька комітів) у гілці. Ви завжди можете «зняти» коміти (пізніше) (наприклад, за допомогою git resetбудь-якого --softабо --mixed; перегляньте документацію щодо скидання git ; або з, git rebase -iщоб зберегти лише можливі «реальні» коміти), відкидаючи тимчасові).

(Щоб насправді емулювати git stashвам потрібні принаймні два коміти, один для стану індексу та інший для стану робочого дерева. Якщо ви не плануєте зберігати та відновлювати стан індексу, ви можете просто git add -Aвесь стан робочого дерева і помістіть це у тимчасовий коміт. Або git stashсценарій оболонки, щоб ви могли досить легко скопіювати та змінити його, щоб він працював за гілкою за замовчуванням, використовуючи, наприклад, як робочий простір імен, а не єдиний глобальний для весь репо. Ви все одно зможете перенести схованку з однієї гілки в іншу, вказавши її явно.)refs/pb-stash/branchrefs/stash


Ви знаєте, як відобразити список файлів кожного stash listелемента на додаток до просто опису?
амфібієнт

2
git stash show(або git stash show stash@{<number>}для чогось іншого, ніж @{0}версія) дає вам a diff --stat; додати, -pщоб отримати більшу різницю Примітка: це порівнює "робоче дерево" в "мішку зберігання" та коміт, з якого він зависає; немає інтерфейсного інтерфейсу, який би міг побачити, що міститься в "покажчику" в даному схованці.
torek

55

Ні та Ні. Git stash - це для кожного сховища.

Ось приємна сторінка про те, як нею користуватися.


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

1
Ні, тоді ви отримаєте стос (останній-у-першому-вихід) схованки. Ви штовхаєте схованку до своєї скриньки, потім ще одну, потім вискакуєте 2-ю, потім вискакуєте першу і т. Д.
abasterfield

18

git stash не по гілці.

  • Замість git stash(що можна легко загубити, коли у вас багато схованки та гілок)
  • Я пропоную зробити a, git commitщоб зберегти незавершений код у вашій гілці, і коли ви будете готові закінчити код, зробіть a, git reset ${COMMIT_HASH_VALUE}щоб повернути незавершений код назад
  • git commitі git resetпри використанні разом правильно може імітувати git stashдля конкретної галузі

Ось загальний сценарій реального життя, який демонструє значення та використання команд commitі reset:

  • Ви працюєте над гілкою функцій X, і ваш код навіть не компілює та не проходить тести
  • існує помилка, яка має вищий пріоритет, ніж поточна нова функція, тому вам слід негайно розпочати роботу з виправлення помилки
  • замість того, щоб робити сховання git (і сховище втрачається в суміші, тому що у вас багато схованки і багато гілок)
  • ви можете зробити git commitна гілці функцій X
    • запишіть COMMIT_HASH_VALUEна потім
  • перевірте нову гілку Y для виправлення
  • завершити виправлення на гілці Y (зробіть запит на об’єднання, щоб виправити виправлення на базовій лінії та видалити гілку виправлення)
  • потім перевірте гілку функцій X ще раз
  • щоб показати свою незавершену роботу, яка не склалася або не пройшла тестування -> просто виконайте git reset ${COMMIT_HASH_VALUE}

(FYI за замовчуванням для git resetце --mixed)


2
У цьому сценарії є зручний ярлик для скидання git reset HEAD~1.
Сем А. Горват-Хант,

1
@samHH у мене було занадто багато екземплярів із git reset HEAD ^ 1, випадково потрапляючи двічі ... тому я вирішив не використовувати HEAD^1або HEAD~1.
Тревор Бойд Сміт

11

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

Отже, ось робочий процес схованки:

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

git stash save "Your custom stash message"

Повернувшись до філії, перевірте схованку

git stash list

введіть тут опис зображення

Якщо ви перебуваєте на гілці, FixIssue0203ви можете використовувати use, git stash popоскільки це застосує верхню частину stash@{0}та видалить її з схованки.

Однак, якщо у вашій гілці, ImproveReadmeвам слід спочатку застосувати схованку 1, git stash apply stash@{1}а потім вилучити схованку 1 зі стеку git stash drop stash@{1}.

Це воно!

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