Хранить только один файл из нескольких файлов,которые изменились с помощью Git'а.

git git-stash


Как я могу спрятать только один из нескольких измененных файлов в своей ветке?




Answer 1 bukzor


Отказ от ответственности : следующий ответ для git перед git 2.13. Для git 2.13 и выше, проверьте другой ответ ниже .


Warning

Как отмечается в комментариях,это ставит все в тайник,как инсценированное,так и не инсценированное.Индекс --keep-index просто оставляет индекс в покое после того,как тайник закончен.Это может привести к конфликтам слияния,когда вы позже попадёте в тайник.


Это сохранит все, что вы ранее не добавляли. Просто git add то, что хотите сохранить, и запустите.

git stash --keep-index

Например,если вы хотите разделить старый коммит на более чем один changeset,вы можете использовать эту процедуру:

  1. git rebase -i <last good commit>
  2. Отметить некоторые изменения как edit .
  3. git reset HEAD^
  4. git add <files you want to keep in this change>
  5. git stash --keep-index
  6. Исправьте вещи по мере необходимости. Не забудьте git add изменения.
  7. git commit
  8. git stash pop
  9. Повторяю,с №5,по мере необходимости.
  10. git rebase --continue



Answer 2 konrad.kruczynski


Вы также можете использовать git stash save -p "my commit message" . Таким образом, вы можете выбрать, какие блоки должны быть добавлены в тайник, а также целые файлы.

Вам будут предложены несколько действий для каждого кусочка:

   y - stash this hunk
   n - do not stash this hunk
   q - quit; do not stash this hunk or any of the remaining ones
   a - stash this hunk and all later hunks in the file
   d - do not stash this hunk or any of the later hunks in the file
   g - select a hunk to go to
   / - search for a hunk matching the given regex
   j - leave this hunk undecided, see next undecided hunk
   J - leave this hunk undecided, see next hunk
   k - leave this hunk undecided, see previous undecided hunk
   K - leave this hunk undecided, see previous hunk
   s - split the current hunk into smaller hunks
   e - manually edit the current hunk
   ? - print help



Answer 3 VonC


Since git is fundamentally about managing a all repository content and index (and not one or several files), git stash deals, not surprisingly, with the all working directory.

Actually, since Git 2.13 (Q2 2017), you can stash individual files, with git stash push:

git stash push [--] [<pathspec>...]

Когда для pathspec задано ' git stash push ', новый stash записывает измененные состояния только для файлов, которые соответствуют pathspec. Дополнительные сведения см. В разделе « Stash изменения для определенных файлов ».

Упрощенный пример:

 git stash push path/to/file

Тестовый пример для этой функции показывает еще несколько опций:

test_expect_success 'stash with multiple pathspec arguments' '
    >foo &&
    >bar &&
    >extra &&
    git add foo bar extra &&

    git stash push -- foo bar &&   

    test_path_is_missing bar &&
    test_path_is_missing foo &&
    test_path_is_file extra &&

    git stash pop &&
    test_path_is_file foo &&
    test_path_is_file bar &&
    test_path_is_file extra

Оригинальный ответ (ниже,июнь 2010 г.)был о ручном выборе того,что вы хотите спрятать.

Casebash комментарии:

Это ( оригинальное решение stash --patch ) хорошо, но часто я модифицировал много файлов, поэтому использование патча раздражает

bukzor «s ответ (upvoted, ноябрь 2011) предлагает более практичное решение, основанное на
git add + git stash --keep-index .
Идите и проголосуйте за его ответ,который должен быть официальным (а не моим).

Об этой опции chhh указывает альтернативный рабочий процесс в комментариях:

Вы должны " git reset --soft " после такого тайника , чтобы получить чистую постановку:
Для того,чтобы перейти в исходное состояние-которое является четкой сценической областью и только с некоторыми выбранными нестадийными модификациями,можно было мягко сбросить индекс,чтобы получить (без фиксации чего-либо подобного-bukzor-сделал).


(Оригинальный ответ, июнь 2010 г .: тайник)

Тем не менее, git stash save --patch может позволить вам получить частичное копирование, после которого вы:

С помощью --patch вы можете интерактивно выбирать фрагменты в разнице между HEAD и рабочим деревом, которое нужно спрятать.
Запись тайника построена таким образом,что ее индексное состояние совпадает с индексным состоянием вашего репозитория,а ее рабочее дерево содержит только те изменения,которые вы выбрали интерактивно.Выбранные изменения затем откатываются из вашего рабочего дерева.

Однако это сохранит полный индекс (который может быть не тем,что вы хотите,так как он может включать другие файлы,уже проиндексированные),и частичное рабочее дерево (которое может выглядеть как то,что вы хотите спрятать).

git stash --patch --no-keep-index

может быть лучше подойдет.


Если --patch не работает, ручной процесс может:

Для одного или нескольких файлов промежуточным решением будет:

  • скопировать их за пределами Git repo
    (На самом деле, eleotlecram предлагает интересную альтернативу )
  • git stash
  • переписывать их обратно
  • git stash # на этот раз спрятаны только те файлы, которые вы хотите
  • git stash pop stash@{1} # повторно применить все ваши модификации файлов
  • git checkout -- afile # сбросить файл до содержимого HEAD перед любыми локальными изменениями

В конце этого довольно громоздкого процесса у вас будет спрятан только один или несколько файлов.




Answer 4 blueyed


Когда git stash -p (или git add -p с stash --keep-index ) будет слишком громоздким, я обнаружил, что проще использовать diff , checkout и apply :

Чтобы "спрятать" только определенный файл/файл:

git diff path/to/dir > stashed.diff
git checkout path/to/dir

Затем после этого

git apply stashed.diff



Answer 5 sandstrom


Используйте git stash push , как это:

git stash push [--] [<pathspec>...]

Например:

git stash push -- my/file.sh

Это доступно с Git 2.13, выпущенной весной 2017 года.