Зберігайте лише один файл


176

Я хотів би мати можливість зберігати лише зміни з одного файлу:

git stash save -- just_my_file.txt

Наведене, однак, не працює. Будь-які альтернативи?



для одного файлу, замість того, щоб жонглювати прихованими командами, набагато простішим підходом є копіювання одного файлу, а коли ви хочете повернути його, щоб просто скопіювати оригінал. напр. cp just_my_file.txt just_my_file.txt.manualstash тепер ви можете робити всі каси та інше, і оскільки копія є "незавершеним файлом", ви можете переміщатись через гілки та виконувати без будь-яких проблем. Коли ви перебуваєте на правій гілці / виконайте команду, де ви хочете "об'єднати єдиний файл", просто зробіть це, mv just_my_file.txt.manualstash just_my_file.txtі тепер ви можете переглянути зміни та ввести їх там, де необхідно
Dimitry K

Відповіді:


173

Я думаю, stash -pце, мабуть, вибір, який ви хочете, але про всяк випадок, якщо в майбутньому ви зіткнетеся з іншими ще більш хитрими речами, пам’ятайте про це:

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

# git checkout -b tmpbranch
# git add the_file
# git commit -m "stashing the_file"
# git checkout master

ідіть і робіть те, що хочете, а потім просто rebaseта / або mergetmpbranch. Це на самому ділі не що багато додаткової роботи , коли вам потрібно зробити більш ретельне відстеження , ніж збирати дозволить.


2
Зверху ви можете без великих болів перетворити кучерики в справжні гілки.
Уес Хардакер

90

Якщо ви не хочете вказувати повідомлення з прихованими змінами, передайте ім’я файлу після подвійного тире.

$ git stash -- filename.ext

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

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

git stash push -m "describe changes to filename.ext" filename.ext

Обидва методи працюють у git версіях 2.13+


1
Відповідь на це питання здається найбільш прямо вперед для мене при прийнятті поправки зміни: git stash -- filename.ext, git commit --amend, git stash pop
Brandon Dewey

1
Я думаю, що це має спиратися на якийсь новий функціонал. Він не працює в git 2.1.4.
Річард Сміт

Це призводить до якоїсь дивної поведінки для мене: зберігається схована скринька, але ті ж файли додаються до постановки одночасно (git v2.20.1),
paradroid

58

Ви можете інтерактивно зберігати окремі рядки за допомогою git stash -p(аналогічно git add -p).

Це ім'я файлу не приймає, але ви можете просто пропустити інші файли, dпоки ви не дійшли до потрібного файлу, і зберігаєте всі зміни там a.


3
Це займе багато часу, якщо у вас багато файлів, які ви не хочете зберігати.
jjj

23
я не знаю, коли це змінилося, але git 2.14.1ви можете вказати ім'я файлуgit stash -p <filename>
muon

21

Найкращий варіант - git stash save --keep-indexналаштувати все, крім цього файлу, і сказати приховувати, щоб зберігати індекс , таким чином зберігаючи ваш нестандартний файл:

$ git add .
$ git reset thefiletostash
$ git stash save --keep-index

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


2
Хоча це зберігає індекс у тому ж стані, чи це також не приховує файли, що знаходяться в індексі? Іншими словами, якщо після цього ви зафіксуєте індекс до поточної гілки, переключіться на іншу гілку і зробіть git stash pop, чи не збирається застосувати всі файли, а не лише один файл, який ми хотіли зберегти?
Dan Molding

@DanMoulding: ти абсолютно прав, я не думав про це.
CharlesB

16

Про всяк випадок, якщо ви дійсно маєте на увазі "відмінити зміни", коли ви використовуєте "git stash" (і не використовуйте git stash для тимчасового зберігання), у цьому випадку ви можете використовувати

git checkout -- <file>

Зауважте, що приховування git - лише швидша та проста альтернатива розгалуженню та виконанню роботи.


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

і я хотів би, що це найкраща відповідь для цього конкретного завдання
Закір Хусейн

6
Питання було досить чітким і не задавало питання, як відновити зміни до одного файлу. Захищений.
Річард Сміт

Це хороша відповідь, чітко показана як альтернатива. Але деякі люди будуть досить впертими, щоб використати потворну функцію як функцію зловживання: +1
Mukul Jain

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