Відповіді:
На сторінці " git stash" ви можете прочитати (у розділі "Обговорення", відразу після опису "Параметри"), що:
Схована скринька представлена як команда, дерево якої записує стан робочого каталогу, а її першим батьківським елементом є команда в HEAD, коли створено копію.
Таким чином, ви можете ставитись до сховища (наприклад stash@{0}
, перший / верхній сховище) як об'єднання об'єднань та використовувати:
$ git diff stash@{0}^1 stash@{0} -- <filename>
Пояснення: stash@{0}^1
означає перший з батьків даного сховища, який, як зазначено в поясненні вище, є комітом, при якому зміни були приховані. Ми використовуємо цю форму "git diff" (з двома координатами), оскільки stash@{0}
/ refs/stash
є об'єднанням об'єднань, і ми повинні сказати git, з яким батьків ми хочемо відрізнятись. Більш криптовалюта:
$ git diff stash@{0}^! -- <filename>
також повинен працювати (див. сторінку git rev-розбору для поясненняrev^!
синтаксису в розділі "Вказання діапазонів").
Так само ви можете використовувати git checkout, щоб перевірити один файл із сховища:
$ git checkout stash@{0} -- <filename>
або зберегти його під іншим іменем файлу:
$ git show stash@{0}:<full filename> > <newfile>
або
$ git show stash@{0}:./<relative filename> > <newfile>
( зауважте, що тут <повне ім'я файлу> - це повне ім'я файлу відносно верхнього каталогу проекту (думаю: відносно stash@{0}
)).
Ви , можливо , буде потрібно , щоб захистити stash@{0}
від оболонки розширення, тобто використання "stash@{0}"
або 'stash@{0}'
.
git checkout
сторінку чоловіка. Він не може перенести файл в інше місце. На це є посилання на: stackoverflow.com/questions/888414/…
git checkout
підхід копіює точний файл із сховища - він не об'єднує його з тим, що хотілося git stash apply
б у вашій робочій директорії . (Отже, якщо у вас є якісь зміни від бази, на якій створено сховище, вони будуть втрачені).
git stash apply
об'єднання змін у файлі, який був змінений у робочому дереві з моменту зберігання файлу, цей файл у робочому дереві повинен бути інсценований. Щоб автоматичне злиття працювало, одні і ті ж файли не можуть бути змінені як у робочій копії, так і в прихованій копії для об'єднання копії. Нарешті, застосунок приховування не видаляє елемент із сховища, як git stash pop
хотілося.
Якщо ви використовуєте, git stash apply
а неgit stash pop
, він застосує приховану скриньку до вашого робочого дерева, але все одно збереже приховування.
Після цього ви можете add
/ commit
файл, який ви хочете, а потім скинути решту змін.
git stash pop stash@{0}
(Перерахуйте захованих зміни: git stash list
)
Існує простий спосіб отримати зміни з будь-якої галузі, включаючи скрині:
$ git checkout --patch stash@{0} path/to/file
Ви можете опустити специфікацію файлу, якщо ви хочете зробити виправлення у багатьох частинах. Або опустіть виправлення (але не шлях), щоб отримати всі зміни в одному файлі. Замініть номер 0
на скриньку git stash list
, якщо у вас їх більше. Зауважте, що це схоже diff
, і пропонує застосувати всі відмінності між гілками. Щоб отримати зміни лише від однієї комісії / сховки, подивіться git cherry-pick --no-commit
.
git help checkout
. --patch
робить інтерактивне злиття, застосовується все те, що ви схвалюєте в оболонці (або що ви збережете, якщо ви вирішите e
випустити патч). Сам шлях замінить файл, як я написав, "всі зміни".
git config --global alias.applydiffat '!git checkout --patch "$1" -- $(git diff --name-only "$1"^ "$1")'
- тоді git applydiffat stash@{4}
використовується лише файли, які змінилися між сховищем та його батьківським.
Щоб переглянути весь файл: git show stash@{0}:<filename>
Щоб побачити різницю: git diff stash@{0}^1 stash@{0} -- <filename>
diff
з difftool
використовувати ваш улюблений зовнішній диф.
$ git checkout stash@{0} -- <filename>
Примітки:
Переконайтеся, що ви поставили пробіл після параметра "-" та імені файлу
Замініть нуль (0) своїм конкретним номером скриньки. Щоб отримати список сховищ, використовуйте:
git stash list
На основі відповіді Якуба Нарбського - Коротша версія
Ви можете отримати diff для сховища за допомогою " git show stash@{0}
" (або будь-якої кількості скриньки; див. "Git stash list"). Вилучити розділ diff для одного файлу легко.
git show stash
щоб показати найвищу сховку (як правило, єдину у вас є). Аналогічно ви можете показати різницю між вашою поточною гілкою і сховищем з git diff head stash
.
Найпростіша концепція, яку можна зрозуміти, хоча, можливо, і не найкраща, це те, що ви змінили три файли і хочете зберегти один файл.
Якщо ви все це git stash
сховали, git stash apply
поверніть їх знову, а потім git checkout f.c
у відповідний файл, щоб ефективно скинути їх.
Коли ви хочете видалити цей запуск файлу, виконайте команду a, git reset --hard
а потім запустіть git stash apply
знову, скориставшись тим фактом, git stash apply
який не очищає відмінність від стека.
Якщо сховані файли потрібно об'єднати з поточною версією, то використовуйте попередні способи, використовуючи diff. В іншому випадку ви можете використовувати їх git pop
для видалення їх, git add fileWantToKeep
для постановки свого файлу, а також для того git stash save --keep-index
, щоб зберігати все, крім того, що знаходиться на сцені. Пам'ятайте, що відмінність цього способу від попередніх полягає в тому, що він "вискакує" файл із сховища. Попередні відповіді зберігають цеgit checkout stash@{0} -- <filename>
так, щоб він відповідав вашим потребам.
Скористайтеся наведеними нижче способами, щоб застосувати зміни до файлу у сховці до вашого робочого дерева.
git diff stash^! -- <filename> | git apply
Це, як правило, краще, ніж використовувати, git checkout
тому що ви не втратите жодних змін, внесених до файлу після створення папки.
Використовуйте розширення Git Stash у коді Visual Studio