Заховайте зміни, зберігаючи зміни в робочому каталозі в Git


146

Чи є git stashкоманда, яка приховує ваші зміни, але також зберігає їх у робочому каталозі? Так в основному за git stash; git stash applyодин крок?




1
@MariuszPawelski Ні, не дуже. Це питання є більш конкретним, ніж моє. Відповідь на моє запитання була просто «ні». Дякуємо за посилання, проте, можливо, згодом це допоможе деяким людям, а то й мені самому.
Майкл Дорст

Щоб було зрозуміло, моє питання інше, тому що я не вимагаю, щоб файли залишалися недоторканими. Я просто шукав альтернативи git stash && git stash apply. Ви помітите, що відповіді на це питання сильно відрізняються від моїх.
Майкл Дорст

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

Відповіді:


157

Для того, що варто, ще один спосіб зробити це - поетапно змінити зміни, які ви хочете зберегти, а потім приховати все, використовуючи --keep-index:

$ git add modified-file.txt
$ git stash push --keep-index

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

З офіційної документації Linux Kernel Git дляgit stash або від git-scm :

Якщо --keep-indexпараметр використовується, всі зміни, вже додані до індексу, залишаються цілими.


3
це, безумовно, найпростіше пояснення --keke-index, який я бачив. Я не зрозумів, як це було написано на документах.
40детективи

52

git stashа потім git stash apply( git stash && git stash apply) збереже файли та застосує сховище одразу після нього. Тож після цього у вас з’являться зміни в схованці та в робочому режимі.

Ви можете створити псевдонім, якщо ви хочете його в одному творі. Просто поставте щось подібне до ~/.gitconfig:

[alias]
    sta = "!git stash && git stash apply"

Недолік такого підходу полягає в тому, що всі файли зберігаються та відтворюються. Це означає, що часові позначки на відповідних файлах будуть змінені. (Змушує Emacs скаржитися, коли я намагаюся зберегти файл, якщо його відкрив до того, як я зробив це git sta, і може спричинити непотрібні перебудови, якщо ви використовуєте makeабо друзів.)


1
також, в чому різниця між git stash; git stash applyі git stash && git stash apply?
Майкл Дорст


2
@anthropomorphic git config --global alias.sta "!git stash && git stash apply"повинен це зробити.

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

1
@JaySidri, вибух означає, що це насправді зовнішня команда, а не сам аргумент git. Відповідно до документів : "Як ви можете сказати, Git просто замінює нову команду тим, на що ви її псевдонімом. Однак, можливо, ви хочете запустити зовнішню команду, а не підкоманду Git. У такому випадку ви запускаєте команду з ! характер ".
божевілля

10

Невелике доповнення у відповіді, яке на практиці може скористатися.

$ git add modified-file.txt  
(OR $ git add .    ---- for all modified file)
$ git stash save --keep-index "Your Comment"

ПРИМІТКА: не працює без "git add" (наприклад, для модифікованих, але не доданих для фіксації файлів)
alex_1948511

4

Тут може вам допомогти хитрість, а не приховування речі, але FWIW:

git add -A
git commit -m "this is what's called stashing"       (create new stash commit)
git tag stash                               (mark the commit with 'stash' tag)
git reset HEAD~        (Now go back to where you've left with your working dir intact)

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


3

Ви можете git stash createстворити папір для зберігання, а потім зберегти його в сховищі за допомогою git stash store:

git stash store $(git stash create) -m "Stash commit message"

Це можна зберегти на псевдонімі git, щоб зробити його зручнішим:

git config --global alias.stash-keep '!git stash store $(git stash create)'

git stash-keep -m "Stash commit message"

Зауважте, що це не робить все, що git stash pushробить. Наприклад, він не додає назву гілки до комітету, наприклад, " stash@{0}: On myBranch: Stash commit message".


1
Любіть це !! Однак одна корекція: man git-stashговорить, що -m <message>має бути зроблено перед хешем фіксації. За винятком чогось змінити в новітньому git.
таніум
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.