Из Git SCM Book :
Часто, когда вы работали над частью своего проекта, все в беспорядочном состоянии, и вы хотите немного переключить ветки, чтобы работать над чем-то другим. Проблема в том, что вы не хотите делать коммит наполовину проделанной работы, чтобы потом вернуться к этому вопросу. Ответом на этот вопрос является команда git stash.
Stashing берет грязное состояние вашего рабочего каталога, то есть ваших измененных отслеживаемых файлов и поэтапных изменений, и сохраняет его в стек незавершенных изменений, которые вы можете повторно применить в любое время.
Учитывая это описание, я бы сказал, что это Anti Pattern. Чрезмерно упрощенным объяснением Git Stash будет то, что это «вырезать и вставить» управления исходным кодом. Вы берете кучу измененных файлов, «прячете» их в ручке для хранения вне обычного рабочего процесса ветвления в Git, а затем позднее применяете эти изменения к другой ветви.
Возвращаясь немного дальше, приверженность мастерству - это анти паттерн здесь. Используйте ветки. Вот для чего они были созданы.
Это действительно сводится к этому:
Вы можете вбить винт в стену, и он удержит изображение, но вы должны использовать отвертку. Не используйте молоток, когда отвертка сидит рядом с вами.
О совершении "сломанного" кода
Хотя следующее мнение, я пришел к этому мнению из опыта.
Фиксируйте рано, и совершайте часто. Зафиксируйте столько битого кода, сколько захотите. Просматривайте свою локальную историю коммитов как «точки сохранения», пока вы что-то взламываете. Как только вы выполнили логическую часть работы, сделайте коммит. Конечно , это может нарушить все, но это не имеет значения до тех пор , пока вы не толкать эти коммиты. Перед тем как нажать, перебазировать и раздавить ваши коммиты.
- Создать новую ветку
- Взломать взломать взломать
- Зафиксируйте испорченный код
- Отполировать код и заставить его работать
- Зафиксируйте рабочий код
- Ребаз и Сквош
- Тест
- Нажмите, когда тесты проходят
Для OP эта ветка сообщений ядра Linux может представлять интерес, потому что это звучит так, как будто некоторые члены команды OP используют Git аналогичным образом.
@RibaldEddie сказал в комментарии ниже:
Прежде всего, тайник не находится вне «ветвящегося рабочего процесса», так как тайник - это просто еще одна ветвь.
(рискуя навлечь на себя гнев многих людей)
Линус сказал:
С помощью «git stash» вы также можете иметь несколько разных спрятанных вещей, но они не стоят в очереди друг на друга - это просто случайные независимые патчи, которые вы спрятали, потому что они были неудобны в какой-то момент.
Я думаю, что @RibaldEddie пытается сказать, что вы можете использовать его git stash
в рабочем потоке ветви функций - и это правда. git stash
Проблема не в том, что это проблема. Это комбинация совершения, чтобы освоить и использовать git stash
. Это анти паттерн.
Разъяснение git rebase
Из комментария @ RibaldEddie:
Перебазирование намного больше похоже на копирование и еще хуже изменяет фиксированную историю.
(Акцент мой)
Изменение истории коммитов не так уж и плохо, если это локальная история коммитов . Если вы перебазируете коммиты, которые вы уже выдвинули, вы, по сути, осиротите любого, кто использует вашу ветку Это плохо.
Теперь, скажем, вы сделали несколько коммитов в течение дня. Некоторые коммиты были хорошими. Некоторые ... не очень хорошие. Команда git rebase
в сочетании с уничтожением ваших коммитов - это хороший способ очистить вашу локальную историю коммитов. Приятно объединить один коммит с публичными ветками, потому что он сохраняет историю коммитов общих веток вашей команды в чистоте. После перебазирования вы захотите снова протестировать, но если тесты пройдут, вы можете нажать один чистый коммит вместо нескольких грязных.
Есть еще один интересный поток ядра Linux по чистой истории коммитов .
Опять от Линуса:
Я хочу чистую историю, но это действительно означает (а) чистую и (б) историю.
Люди могут (и, вероятно, должны) перебазировать свои частные деревья (свою работу). Это уборка . Но никогда код других людей. Это "уничтожить историю"
Так что часть истории довольно проста. Есть только одно основное правило и одно незначительное уточнение:
Вы никогда не должны разрушать историю других народов. Вы не должны перебазировать коммиты других людей. По сути, если на нем нет вашей подписи, значит, он запрещен: вы не можете перебазировать его, потому что он не ваш.
Обратите внимание, что это действительно история других народов , а не кодекс других народов . Если они отправили вам материал в виде патча по электронной почте, и вы применили его с помощью «git am -s», то это их код, но это
ваша история.
Таким образом, вы можете сходить с ума от «git rebase», даже если вы не писали код, если сам коммит является вашим личным.
Небольшое уточнение к правилу: как только вы опубликовали свою историю на каком-то общедоступном сайте, ее могут использовать другие люди, и теперь она явно больше не является вашей личной историей.
Таким образом, небольшое пояснение на самом деле заключается в том, что речь идет не только о «вашем коммите», но и о том, что он является приватным для вашего дерева, и вы еще не выдвинули его и не объявили об этом.
...
Теперь «чистая» часть немного более тонкая, хотя первые правила довольно очевидны и просты:
Держите свою историю читабельной
Некоторые люди делают это, просто сначала разбираясь со своими мыслями, а не совершая ошибок. но это очень редко, и для остальных из нас мы используем «git rebase» и т. д., пока работаем над нашими проблемами.
Так что "git rebase" не ошибается. Но это правильно, только если это ВАШЕ СОБСТВЕННОЕ ЧАСТНОЕ дерево.
Не выставляй свое дерьмо.
Это означает: если вы все еще находитесь в фазе «git rebase», вы ее не выталкиваете. Если он не готов, вы отправляете патчи или используете частные git-деревья (просто как «замену серии патчей»), о которых вы не говорите широкой публике.
(акцент мой)
Вывод
В конце концов, у ОП есть разработчики, которые делают это:
git checkout master
(edit files)
git commit -am "..."
(edit files)
git stash
git pull
git stash (pop|apply)
Здесь есть две проблемы:
- Разработчики стремятся освоить. Закрой это немедленно. Действительно, это самая большая проблема.
- Разработчики постоянно используя
git stash
и git pull
на мастере , когда они должны использовать полнометражную ветвь.
Нет ничего плохого в использовании git stash
- особенно перед извлечением - но использование git stash
таким способом является антишаблоном, когда в Git есть лучшие рабочие процессы.
Их использование git stash
красной сельди. Это не проблема. Обязательство освоить это проблема.