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


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.