Извлекайте недвоичные файлы из git stash
Я довольно новичок в Git. На одном компьютере я бегал
git stash save myfeature
git stash show -p > myfeaturepatch
Я скопировал myfeaturepatch
на второй компьютер и побежал
git apply myfeaturepatch
Я сделал некоторые изменения, которые включали добавление некоторых файлов шрифтов (двоичные файлы), а затем запустил
git stash save myfeature2
git stash show -p > myfeaturepatch2
Когда я пытаюсь применить эту вторую версию обратно на мой первый компьютер, я получаю
error: cannot apply binary patch to 'myfont.ttf' without full index line
Я думаю, мне нужно было бежать git stash save --binary myfeature2
когда я сделал тайник К сожалению, так как git stash
удаляет изменения, которые он сохраняет в файл, и, поскольку я не могу применить свое исправление ни к одному из компьютеров из-за вышеуказанной ошибки, в настоящее время у меня нет доступа к внесенным изменениям.
Я пробовал кучу разных git apply
а также git stash
команды, но у меня недостаточно полного понимания того, что происходит и что означают аргументы, чтобы извлечь только недвоичные файлы из моего файла исправлений. Я предполагаю, что есть способ сделать это.
2 ответа
Я думаю, мне нужно было бежать
git stash save --binary myfeature2
когда я сделал тайник
Нет, это не нужно... и даже не вариант в любом случае: нет save --binary
,
Какие git stash
делает это совершить вашу работу. Он просто делает это странным образом, используя два отдельных коммита,1 которые не находятся ни в одной ветви.
Пока у вас есть тайник, у вас все еще есть коммиты.
Самый простой способ справиться с тайником, который у вас все еще есть, который требует выделения, - это преобразовать его в обычные коммиты в новой ветке:
git stash branch newbranchname [<stash>]
Конечно, для этого требуется, чтобы вы делали это на машине, на которой есть тайник2, но после этого вы переходите на новую ветку с индексом, как это было при запуске. git stash save
и дерево работы, как это было, когда ты бежал git stash save
, (Текущий коммит новой ветки - это коммит, который был текущим при запуске git stash save
, а также.) Теперь вы можете закончить git add
-на любые непомеченные файлы, git reset
любые файлы, которые вы не хотите ставить, и git commit
результирующий индекс (а затем делать больше коммитов из большего количества файлов рабочего дерева, пока все не будет безопасно сохранено в обычных не-stash-y коммитах).
1 Два коммита для текущего индекса и рабочего дерева. Помните, что индекс - это место, где вы строите следующий коммит, git add
и / или git rm
вещи, чтобы скопировать последнюю версию из рабочего дерева. Таким образом, индекс или рабочее дерево могут отличаться от текущей фиксации, поэтому git stash save
сохраняет оба по отдельности, так что он может восстановить их отдельно позже, если вы хотите это позже. Вы можете сказать ему сохранить третий коммит, содержащий неотслеживаемые файлы или все файлы тоже.
2 Конечно, перед тобой git stash branch
, у вас должен быть чистый индекс и рабочее дерево. Если вы этого не сделаете, вы должны будете сначала зафиксировать или спрятать. Если вы решите снова спрятать, это увеличит ваш предыдущий шкатулку на один уровень вверх, так что если раньше stash@{2}
сейчас stash@{3}
, Я нахожу, что поддержание активности многих тайников - это рецепт безумия: вместо этого, совершите коммит на новой ветке.
Попробуй хотя бы (git apply
):
git apply --reject mypatch.diff
Эта опция заставляет его применять части патча, которые применимы, и оставлять отклоненные фрагменты в соответствующих
*.rej
файлы.
А когда сделаешь патч (git diff
), добавить --binary
возможность:
вывести двоичный дифференциал, который можно применить с
git-apply
,