Як я можу git сховати певний файл?


1654

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

Наприклад, якщо статус git дає мені таке:

younker % gst      
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   app/controllers/cart_controller.php
#   modified:   app/views/cart/welcome.thtml
#
no changes added to commit (use "git add" and/or "git commit -a")

і я хочу лише сховати додаток / views / cart / welcome.thtml, як я це можу зробити? Щось на зразок (але, звичайно, це не працює):

git stash save welcome_cart app/views/cart/welcome.thtml

57
Наразі у запитанні "можливе повторення" неправильна відповідь позначена як прийнята.
Пінгвін Брайан

6
Ви можете використовувати git checkout -- filenameі повернути його до початкового стану.
visualex

7
@visualex це дійсно скасує, але не сховатиме
Jesper

2
Коментар Re Penguin Brian: Так, прийнята відповідь на "можливе повторюване" запитання посилається на це питання для останніх версій git.
Марс,

1
$ git stash - filename.ext
Linielson

Відповіді:


2510

EDIT: Так як мерзотник 2.13, є команда , щоб зберегти певний шлях до сховку: git stash push <path>. Наприклад:

git stash push -m welcome_cart app/views/cart/welcome.thtml

СТАРИЙ ВІДПОВІДЬ:

Ви можете зробити це за допомогою git stash --patch(або git stash -p) - ви ввійдете в інтерактивний режим, де вам буде представлено кожен змінений кусень. Використовуйте, nщоб пропустити файли, які ви не хочете зберігати, yколи ви стикаєтесь із файлом, який ви хочете qсховати , а також щоб вийти і залишити залишилися куски незміненими. aбуде зберігати показаний шматок та решту шматочків у цьому файлі.

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


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

56
@JamesJohnston git stash --keep-indexдозволить вам зберегти всі нестандартні зміни (протилежні тому, що ви шукаєте). stackoverflow.com/a/8333163/378253
nimser

123
Якщо ви скажете, що aзамість yцього буде сховано цей шматок + залишок файлу, що набагато швидше.
i_am_jorf

53
@jeffamaphone чудово! також dбуде робити навпаки, тобто не зберігати подальші шматки в поточному файлі. і дійсно ?покаже всі можливі варіанти.
omnikron

9
@Vencovsky Це означає "повідомлення" і використовується для вказівки необов'язкового опису схованки. Якщо вам це не потрібно, ви можете залишити -m welcome_cartчастину.
svick

337

Зазвичай я додаю до індексу зміни, які я не хочу зберігати, а потім зберігаю з --keep-indexопцією.

git add app/controllers/cart_controller.php
git stash --keep-index
git reset

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


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


5
Це набагато краще прийнятої відповіді, якщо у вас є багато змін, які ви не хочете проходити за допомогою опції --patch.
quux00

181
Ні, це поміщає все в скриньку, як інсценізоване, так і неінсценоване. --keep-indexТільки виходить індекс в поодинці після того, як схованку робиться. Отже, це не правильна відповідь на запитання, AFAICT.
Раман

2
Дивіться моя відповідь на @ питання Рахілі для вирішення робити інверсію цього (приховати стадийность змін, замість unstaged змін) - stackoverflow.com/questions/3040833 / ...
JesusFreke

3
Після цього, якщо ви хочете повернути сховані файли, не фіксуючи додані вами файли, ви можете запустити git stash; git stash pop stash@{1}.
yndolok

8
ПОПЕРЕДЖЕННЯ: Зверніть увагу на думку Рамана. Це робить не те, що слід. Це призведе до тих самих змін у схованці та залишить їх у робочому дереві. Коли ви пізніше спробуєте вивести схованку, ви, ймовірно, отримаєте конфлікти злиття, і вони часто дуже заплутані та важко виправляються.
rjmunro

28

Щоб додати відповідь svick, -mпараметр просто додає повідомлення до вашого сховища і є абсолютно необов’язковим. Таким чином, команда

git stash push [paths you wish to stash]

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

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