Один лайк — один факт (забавный, забытый, неизвестный, полезный) про #git.
Стартую с 30 лайков чтобы дать себе фору. Go
1) #git использует простую концепцию:
4 типа хранимых объектов — blob, tree, commit, annotated tag и два типа ссылок — reference (branch, tags), symbolic reference (HEAD, ORIG_HEAD etc)
Всё остальное тулинг для работы с этими сущностями.
Недавно мне прислали ссылку что это меняют введением «замыканий» веток m.habr.com/ru/post/445676/ (что натолкнуло меня на написание этих заметок)
До версии 2.x команда push с параметром --force форсировано пушила историю всего репозитория затиранием всех веток, которые трекались.
С тех пор я советую использовать полный синтаксис push remote +branch для контроля ситуации
Многие, даже сейчас, не видят разницы между merge и rebase. И в большинстве случаев на маленьких проектах — это не столь важно, главное понимать суть работы с объектами и патчами.
Git работает с состояниями проекта, а не с изменениями. Каждый комит — это фиксация конкретного состояния, изменения же «патчи» всегда высчитываются в рантайме.
Не советую для первого чтения git-scm.com/book/en/v2/Git…
Лучше почитайте think-like-a-git.net
В репозитории можно создавать «скрытые» ветки — git update-ref refs/hidden/branch branch, такими являются все референсы вне папки refs/heads
На GitHub'е так, в частности, реализованы ссылки на пулл-реквесты help.github.com/en/articles/ch…
Скрытые ветки или так называемые «неймспейсы» можно создавать в удалённом репозитории, например на GH — git push upstream +BRANCHANME:refs/namespace/BRANCHANME
Но работа таких веток не регламентированна и зависит от работы вашего remote'а
Это обычные shell-скрипты, которые помогут вам настроить свой workflow.
Для быстрого создания таких на проекте можно использовать готовый фреймворк, например github.com/typicode/husky
Для решения этой проблемы было придумано много инструментов, одним из актуальных на сегодня является git-lfs от GitHub'а git-lfs.github.com
А вот запушить в remote вы сможете только если вам разрешит сервер (GitHub, например)
Но «если очень хочется, то можно» — команда git-replace, позволяет заменить любой объект git-scm.com/docs/git-repla…, однако у неё куча условностей и ограниченная поддержка тулинга.
У git-log есть куча параметров, одни из моих любимых --graph --oneline — позволяют визуализировать граф коммитов и найти нужный merge визуально. git-scm.com/docs/git-log
Если в merge-commit'ах писать номер задачи, то их лего будет грепать даже в автоматическом режиме: git log --grep "SERP-2019"
Минус в том, что придётся носить свой конфиг с собой. git-scm.com/book/en/v2/Git…
@ — текущий HEAD
@~2 — два шага назад по истории в «основной линии»
@^2 — второй родитель комита
@~2^2~3 — вполне себе удобно ;)
atlassian.com/git/tutorials/…
Я сам сливала в один комит порядка 80 разных веток.
Т.е. реф @^5 волне себе валидная запись, если таковой родитель имеется ;)
22) git-lfs решает часть проблем, но приносит новые — ещё один уровень абстракции, тулинг рядом — хуки и драйвера, что сильно повышает порог входа.
MS пошли другим путём — виртуальная файловая система: vfsforgit.org
В git можно использовать merge-tool — внешний инструмент для слияния файлов, например разницу в структурированных фалах json или мета-информацию в jpeg ;) git-scm.com/docs/git-merge…
npmjs.com/package/npm-me…
npmjs.com/package/git-po…
etc.
Однако я не рекомендую её использовать — просто «комитьте и пуште» в свою ветку, потом не забудьте причесать ;)
Stash — организован посредством веток, но это не очень удобный тулинг.
Подобная конфигурация может помочь вам при использовании длинных URL к вашим репозиториям
git clone ght:gurugray/talks.git
git remote add ght:partner/talks.git
git-init.ru/2013/post/inst…
— изотерический язык программирования morr.cc/legit/
— генеалогическое habr.com/ru/post/351158/
(спасибо подписчикам ;))