Есть ли способ, которым я могу спрятать только мои поэтапные изменения? Сценарий, с которым у меня возникают проблемы, заключается в том, что я работал над несколькими ошибками в данный момент времени и у меня есть несколько неустановленных изменений. Я хотел бы иметь возможность размещать эти файлы по отдельности, создавать свои файлы .patch и прятать их до тех пор, пока код не будет утвержден. Таким образом, когда он будет одобрен, я могу спрятать всю свою (текущую) сессию, вытащить эту ошибку и нажать код.
Я поступаю об этом неправильно? Я неправильно понимаю, как git может работать другими способами, чтобы упростить мой процесс?
Ответы:
Да, это возможно с DOUBLE STASH
git stash --keep-index
. Эта команда создаст тайник со ВСЕМИ вашими изменениями ( поэтапно и не поэтапно ), но оставит поэтапные изменения в вашем рабочем каталоге (все еще в состоянии стадии).git stash push -m "good stash"
"good stash"
есть ТОЛЬКО постановочные файлы .Теперь , если вам нужно unstaged файлы до тайника, просто нанесите первый тайник ( тот , созданный с
--keep-index
) , и теперь вы можете удалить файлы , которые вы спрятали в"good stash"
.наслаждаться
источник
-u
переключатель.git stash apply --index
опция использования изменений unstages . Это попытается сохранить ваше состояние un (staged). Теперь легче удалить нежелательные изменения из рабочего дерева.С последним git вы можете использовать
--patch
опциюИ git попросит вас добавить каждое изменение в ваши файлы или нет в stash.
Вы просто отвечаете
y
илиn
UPD
Псевдоним для DOUBLE STASH :
Теперь вы можете поставить свои файлы и запустить
git stash-staged
.В результате ваши промежуточные файлы будут сохранены в тайнике .
Если вы не хотите хранить промежуточные файлы и хотите переместить их в тайник. Затем вы можете добавить другой псевдоним и запустить
git move-staged
:источник
-u|--include-untracked
опциюgit-stash
Я сделал скрипт, который прячет только то, что в данный момент ставится, и оставляет все остальное. Это замечательно, когда я начинаю вносить слишком много несвязанных изменений. Просто создайте то, что не связано с желаемым коммитом, и просто спрячьте это.
(Спасибо Bartłomiej за отправную точку)
источник
Вот простой однострочник:
И добавить сообщение просто:
источник
Чтобы сделать то же самое ...
git commit -m 'temp'
git add .
git stash
git reset HEAD~1
Boom. Файлы, которые вы не хотите, спрятаны. Все файлы, которые вы хотите, готовы для вас.
источник
В этом сценарии я предпочитаю создавать новые ветки для каждой проблемы. Я использую префикс temp /, поэтому я знаю, что могу удалить эти ветви позже.
Поместите файлы, которые исправляют ошибку 1, и зафиксируйте их.
Затем вы можете выбрать коммиты из соответствующих веток по мере необходимости и отправить запрос на извлечение.
источник
Почему бы вам не зафиксировать изменение для определенной ошибки и не создать патч из этого коммита и его предшественника?
Затем, чтобы создать соответствующие патчи, используйте
git format-patch
:Это создаст два файла:
0001-fix-bug-123.patch
и0002-fix-bug-321.patch
Или вы можете создавать отдельные ветки для каждой ошибки, так что вы можете объединять или перебазировать исправления ошибок по отдельности или даже удалять их, если они не работают
источник
git stash --keep-index
хорошее решение ... за исключением того, что оно не работало правильно на удаленных путях, которые были исправлены в Git 2.23 (Q3 2019)См. Коммит b932f6a (16 июля 2019 г.) Томаса Гуммерера (
tgummerer
) .(Слиты Junio C Hamano -
gitster
- в фиксации f8aee85 , 25 июл 2019)источник
Запоминание только индекса (поэтапные изменения) в Git сложнее, чем должно быть. Я нашел ответ @ Джо, чтобы он работал хорошо, и превратил небольшой вариант в этот псевдоним:
Он помещает как поэтапные, так и не поэтапные изменения во временный тайник, оставляя поэтапные изменения в покое. Затем он помещает поэтапные изменения в тайник, который мы хотим сохранить. Аргументы, переданные псевдониму, такие как
--message "whatever"
будут добавлены в эту команду stash. Наконец, он извлекает временный тайник для восстановления исходного состояния и удаления временного тайника, а затем, наконец, «удаляет» сохраненные изменения из рабочего каталога через приложение обратного патча.Для противоположной проблемы сохранения только неустановленных изменений (псевдоним
stash-working
) см. Этот ответ .источник
Обязательно ли нужно работать над несколькими ошибками одновременно? И под «сразу» я подразумеваю «иметь файлы, отредактированные для нескольких ошибок одновременно». Потому что, если вам это абсолютно не нужно, я буду работать только с одной ошибкой за раз в вашей среде. Таким образом, вы можете использовать локальные ветки и ребаз, что, на мой взгляд, гораздо проще, чем управлять сложным хранилищем / сценой.
Допустим, мастер находится на коммите B. Теперь поработайте над ошибкой # 1.
Теперь вы на ветке bug1. Внесите некоторые изменения, зафиксируйте, дождитесь проверки кода. Это локально, так что вы ни на кого не влияете, и это должно быть достаточно просто сделать патч из git diffs.
Теперь вы работаете над bug2. Вернуться назад к мастеру с
git checkout master
. Создать новую веткуgit checkout -b bug2
. Внесите изменения, зафиксируйте, дождитесь проверки кода.Давайте представим, что кто-то еще отправляет E & F на master, пока вы ожидаете проверки.
Когда ваш код был утвержден, вы можете повторно включить его в мастер, выполнив следующие шаги:
Это приведет к следующему:
Затем вы можете нажать, удалить свою локальную ветку bug1, и все готово. Одна ошибка за раз в вашей рабочей области, но с использованием локальных веток ваш репозиторий может обрабатывать несколько ошибок. И это позволяет избежать сложного сценического танца.
Ответ на вопрос ctote в комментариях:
Ну, вы можете вернуться к копированию для каждой ошибки и работать только с одной ошибкой за раз. По крайней мере, это спасает вас от постановки вопроса. Но попробовав это, я лично нахожу это неприятным. Тайники немного запутаны в графике git log. И что более важно, если вы что-то напортачили, вы не сможете вернуться. Если у вас грязный рабочий каталог и вы открываете тайник, вы не можете «отменить» этот треск. Гораздо сложнее испортить уже существующие коммиты.
Так
git rebase -i
.Когда вы перемещаете одну ветку на другую, вы можете сделать это в интерактивном режиме (флаг -i). Когда вы делаете это, у вас есть возможность выбрать, что вы хотите делать с каждым коммитом. Pro Git - это потрясающая книга, которая также онлайн в формате HTML, и имеет хороший раздел о перебазировании и сжатии:
http://git-scm.com/book/ch6-4.html
Я украду их пример дословно для удобства. Представьте, что у вас есть следующая история коммитов, и вы хотите перебазировать и раздавить bug1 на master:
Вот что вы увидите при вводе
git rebase -i master bug1
Чтобы раздавить все коммиты ветви до одного коммита, оставьте первый коммит как «pick» и замените все последующие записи «pick» на «squash» или просто «s». Вы также получите возможность изменить сообщение коммита.
Так что да, раздавить - это немного больно, но я все равно рекомендовал бы это, если вы используете тяжелые тайники.
источник
git checkout master; git checkout -b bug2
можно сократить доgit checkout -b bug2 master
. То же относится и к томуgit checkout bug1; git rebase master; git checkout master; git merge bug1
, что идентичноgit rebase master bug1; git push . bug1:master
(предоставлено,push
уловка не очевидна)Из ваших комментариев к ответу Майка Монкевича я предлагаю использовать более простую модель: используйте обычные ветки разработки, но используйте опцию сквоша слияния, чтобы получить один коммит в вашей основной ветке:
Преимущество этой процедуры в том, что вы можете использовать обычный рабочий процесс git.
источник
После создания псевдонима:
Здесь
git diff
возвращает список--staged
файлов--name-only
и затем мы передаем этот список , как
pathspec
вgit stash
commad.От
man git stash
:источник
Чтобы удалить случайное изменение, особенно удаление нескольких файлов, сделайте следующее:
другими словами, спрятать дерьмо и выбросить его вместе с заначкой.
Протестировано в git версии 2.17.1
источник