Копить только один файл

177

Я хотел бы иметь возможность сохранить только изменения из одного файла:

git stash save -- just_my_file.txt

Выше не работает, хотя. Есть альтернативы?

EoghanM
источник
для одного файла вместо жонглирования командами stash гораздо проще подойти для копирования одного файла, а когда вы хотите вернуть его, просто скопировать оригинал. например. cp just_my_file.txt just_my_file.txt.manualstash теперь вы можете делать все проверки и прочее, а поскольку копия является «неотслеживаемым файлом», вы можете перемещаться по веткам и фиксировать без каких-либо проблем. Когда вы находитесь на правильной ветке / коммите, где вы хотите «объединить один файл», просто сделайте это, mv just_my_file.txt.manualstash just_my_file.txtи теперь вы можете просматривать изменения и фиксировать их там, где это необходимо
Dimitry K

Ответы:

174

Я думаю, что stash -pэто, вероятно, тот выбор, который вам нужен, но на случай, если в будущем вы столкнетесь с другими, более сложными вещами, помните:

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

# 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+

sealocal
источник
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>
мюон
21

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

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

Как указывает Дэн, thefiletostashэто единственная папка, которая сбрасывается с помощью тайника, но она также хранит другие файлы, так что это не совсем то, что вы хотите.

CharlesB
источник
2
Несмотря на то, что это сохраняет индекс в том же состоянии, разве это также не хранит файлы, которые находятся в индексе? Другими словами, если после этого вы фиксируете индекс в текущей ветви, затем переключаетесь на другую ветку и делаете git stash pop, не будет ли она применять все файлы, а не только один файл, который мы хотели сохранить?
Дэн Молдинг
@DanMoulding: вы абсолютно правы, я не думал об этом.
CharlesB
16

На тот случай, если вы на самом деле имеете в виду «отменить изменения» всякий раз, когда вы используете «git stash» (и на самом деле не используете git stash для его временного хранения), в этом случае вы можете использовать

git checkout -- <file>

Обратите внимание, что git stash - это просто более быстрая и простая альтернатива ветвлению и тому подобному.

Devesh
источник
Я думаю, что это лучший ответ, если вы хотите удалить все ваши измененные изменения в один файл.
Мохамед Хейзел
и я бы сказал, что это лучший ответ для этой конкретной задачи
Закир Хуссейн
6
Вопрос был достаточно ясен и не спрашивал, как отменить изменения в одном файле. Downvoted.
Ричард Смит
@MukulJain Мне действительно нужно было использовать stash-per-file очень временным образом (в основном, разделяя некоторые изменения в двух коммитах, которые затрагивали одни и те же строки, для одного файла). Я не буду на самом деле отрицать, просто заявить, что это бесполезно для меня.
Пол Стелиан