Ответы пользователя по тегу Git
  • Почему зависает commit?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    В коммите пишешь нужный текст, потом жмешь
    ESC
    Shift+Z+Z
    Ответ написан
  • Git удалил коммит/ы при переключении веток с помощью checkout?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    повезло что я переименовал тогда файлы и сейчас нахожусь на предпоследней версии.


    Вот тут ничего не понятно.
    Гит ничего не удаляет, если оно было закоммичено. Возможно вы просто что-то правили локально, но забыли добавить и закоммитить?
    и файлы переименовывали не через git mv
    Ответ написан
    Комментировать
  • Допустимы ли такие коммиты?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    Если ты делаешь для себя, делай как хочешь.
    Но смысл делать подобный .md файл немного отсутствует - есть же git log
    Сейчас не совсем понятна мысль - ты хочешь автоматический change log, или тебе просто хочется иметь текстовый файлик?
    Но в бренче может быть много коммитов, пока не закончишь фичу, и зачастую "чистовик" пишется уже при слиянии в основной ветке, со сквизом промежуточных коммитов.
    Ответ написан
  • Как работает команда git checkout?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    1) По какому принципу меняется "состав" рабочего каталога при переключении между ветками?
    Ну просто берет и меняет состав рабочего каталога на соответствие конкретной ветке (последнему коммиту в этой ветке по умолчанию)

    2) В каких случаях данная команда выбросит исключение и как его обойти в каждом конкретном случае?
    если у тебя есть локальные изменения рабочего каталога, которые ты не закомиттил (или не засташил). Об этом тебе напишет.
    Ответ написан
  • Почему в git добавляются папки, которые содержатся в gitignore?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    1. так у вас сам .gitignore еще не был закоммичен
    2. в .gitignore указан /Debug, а в архив попадает папка /learning/Debug. Или кидайте в .gitignore просто Debug или прямо /learning/Debug
    Ответ написан
    Комментировать
  • Как получить список всех удаленных файлов из всех коммитов?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    git log --diff-filter=D --summary | grep delete
    Ответ написан
    Комментировать
  • Как в Git в организовано хранение файлов?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    Вообще-то как раз гит хранит целые копии файла.
    Для каждого файла создается его хеш, и файл-объект хранится под именем с этим кешом.

    If you again examine your objects directory, you can see that it now contains a file for that new content. This is how Git stores the content initially — as a single file per piece of content, named with the SHA-1 checksum of the content and its header. The subdirectory is named with the first 2 characters of the SHA-1, and the filename is the remaining 38 characters.


    То есть любое изменение файла - создает еще один файл-объект.
    Два одинаковых файла не будут занимать два места, даже если они хранятся под разными именами.

    Каждый коммит - содержит список файлов и хеш для содержимого.
    А ветка - это просто ссылка на конкретный коммит и немного метаданных.

    Также файлы-объекты хранятся упакованными, а периодически файлы-объекты могут быть объеденены в отдельный пакет.

    Чтобы посмотреть содержимое любого гит-объекта, юзай
    git cat-file -p ID_объекта (где айди объекта это как раз его хеш)

    И собственно именно эта фича - хранение каждого изменения файла отдельным объектом и позволило создать легковесные ветки, где переключение на любой коммит любой ветки - быстрая проверка и копирование файлов, в отличие от CVS и SVN, где любое переключение ветки - куча пересчетов диффов как назад так и вперед.

    Но, поскольку SVN - централизированная система, где все изменения хранятся только на сервере, можно менять формат хранения между версиями, так как это не нужно согласовывать со всеми пользователями репозитория.
    Например кроме диффов, в поздних SVN периодически сохраняются полные снепшоты, например каждые 1000 коммитов делается полный слепок, что ускоряет перерасчеты.
    Ответ написан
  • Алгоритм или бестпрактис для синхронизации .dotfiles?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer

    Предполагаю, что можно сделать его зашифрованным через openssl и именно его синхронизировать или даже версионировать через git (или оставить текущую схему с ансибл). При входе в систему расшифровывать его, кладя в RAM и подключать через "source .bashrc". Работать. После окончания рабочего дня расшифрованный файл надо удалить (ну или изначально при начале работы класть его в RAM).
    Но в этот файл регулярно вносятся изменения, бывает раз в день, а бывает лишь один раз в месяц.


    Не самый плохой вариант шифровать через openssl.
    Только зачем расшифровывать файл? Расшифровывайте прямо в память во время использования

    то есть в .bashrc можно например так

    dbuser=database_user
    dbpass="$(openssl enc -d -base64 -aes-128-ctr -nopad -k secret_key.txt<<<"l1k2j3kl14jjkl321h4lk124123;ljk2`13jlkj")"

    Синтаксис из головы написал, надо уточнить как указать путь к файлу с мастер секретом.
    При этом файл остается зашифрованным, но в текущей сесии переменная уже с открытым паролем.
    Либо можно сделать несколько файлов подобного типа и инклюдать их в скрипты прямо перед использованием.
    Ответ написан
    Комментировать
  • Как правильно мержить в main из dev, если там есть незаконченные фичи?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    пока фича не доделана - не мержить.
    мержом в мейн нужно смержеть мейн в свою фича ветку, убедиться что нет конфликтов ни по синтаксису ни по логике. Если фича долго в разработке можно в принципе периодически мержить в нее мейн, чтобы не сильно отставать и уменьшить работу на потом.

    А уже потом мержить в мейн, в идеале еще и со squash

    Есть еще варианты более сложные, если фичу разделяют на разные спринты, на разные команды - тогда внедряешь заглушки или конфиг/апи для включения/выключения фичи
    Ответ написан
  • Как сделать исключение в .gitignore?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    It is not possible to re-include a file if a parent directory of that file is excluded. Git doesn’t list excluded directories for performance reasons, so any patterns on contained files have no effect, no matter where they are defined.

    Можно только добавить разово .pub руками.
    Ответ написан
    5 комментариев
  • Как исключить файл из Pull Request?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    Как я понял, вы хотите в одном и том же репозитории хранить два енвайрнмента, на одной и той же машине.
    Но это неверный подход. Ветки это не разные версии софта, ветки это разные состояния исходников.
    Сделайте ваш код, чтобы там был prod.config, dev.config и все
    Ответ написан
    2 комментария
  • Как настроить ssh config файл для gitflic.ru?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    так а почему у вас https:// а не ssh:// ?
    Ответ написан
    Комментировать
  • Как происходит работа с Git в крупных проектах?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    В проекте имеются ветви: master, dev, release и features. Я создал feature от master и, при попытке слияния с dev, вижу, что моя ветка отстаёт от dev на 200 коммитов


    Тогда может надо было создавать feature от dev, а не от master?
    или выяснить почему ваш dev так отстает от master

    git flow в каждом проекте может быть немного свой, но он должен быть описан и установлен тимлидом/архитектором. Если в вашем проекте хаос бардак и никто не париться, то имеет смысл всем собраться и продумать как минимизировать конфликты.

    200 коммитов разницы это довольно много, или слишком долго висел feature или реально бардак в проекте.
    Ответ написан
    Комментировать
  • Можно ли сказать, что Гит работает на блокчейне?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    нет.
    Несложно же почитать как под капотом работает гит. Никаких блоков цепочек там нет. Есть версии.
    Ответ написан
    Комментировать
  • Как называется такая практика и является ли она приемлемой?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    Ветка отпочковывается от любого коммита. Обычно руками никто не создает ветку из старых коммитов, делают из последнего свежего.
    Просто весь смысл ветки в том, чтобы свою фичу пилить не блокируя мастер или релиз

    И когда ты мержишь в мастер, ты не затираешь в нем коммиты, а добавляешь свои изменения.
    Если в исходниках в одном и том же месте правили в твоей ветке и в мастере - при попытке мержа получишь конфликт, который надо будет исправить.

    P.S. в фичаветку можно периодически мержить из мастера, чтобы держать свою ветку "свежей" и в конце, при мерже в мастер, вероятность конфликтов была меньше.

    А так - обычный feature-branch flow
    Ответ написан
    Комментировать
  • Как настроить Git для работы с Си/Си++?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    В официальной документации, минимальная настройка заключается в том, что нужно указать user.name и user.email, что используется при коммитах
    Ответ написан
    Комментировать
  • Как использовать несколько ключей SSH для разных аккаунтов Github через KeePassXC?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    Можно настроить config для ссш и юзать разные хостнеймы для конкретных репозиториев
    Пример:

    ~/.ssh/config:
    Host github-user1
          HostName github.com
          User git
          IdentityFile ~/.ssh/id_rsa_user1
    
        Host github-user2
          HostName github.com
          User git
          IdentityFile ~/.ssh/id_rsa_user2


    В разных репозиториях редактируешь ремоут (.git/config)
    url = git@github-user1:user1/myrepo.git
    или
    url = git@github-user2:user2/myrepo.git

    ну или можно командой
    git remote set-url origin git@github-user1:user1/repo.git
    Ответ написан
    3 комментария
  • Почему изменения сохраняются и на новой ветке и в main?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    без коммита, вы не фиксируете изменения в ветке, а только в working directory
    Проверьте все изменения, добавьте их в коммит, закоммитьте, а уже потом переключайтесь в другую ветку

    Либо юзайте git stash
    Ответ написан
    Комментировать
  • Как правильно организовать работу с Git для соло-разработки?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    Если ты один, сделай флоу какой тебе удобный с нейм конвеншеном какой тебе удобен.

    Сделай две ветки:
    site-ru
    dev-site-ru

    Делай ветки для вставки новых крупных фич типа:
    feature-XXXX

    как ветка готова, мержи ее в dev-site-ru c --squash
    Как протестировал на дев, делай мерж в site-ru

    Для тебя и клиента будет интуитивно понятно что за ветки, и не надо будет запоминать зачем нужен мастер или транк.
    Ответ написан
    3 комментария
  • Как организовать парную разработку с Git для отладки на сервере?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    Банально сделать несколько "енвайрнментов", то есть тестовых ботов, и привязать ветки к этим веткам.

    Намример можно привязать к именованиям бренчей, и создать заранее токены для release-bot, main-bot, dev1-bot, dev2-bot.
    Каждый разработчик делает свои ветки согласно dev1/feature-blabla и так далее.

    Триггер на сервере, что если пришел коммит в ветку по указанной регулярке - пересобрать и перезапустить бота с его токенами.
    Ответ написан