• Как отправить инициализированный локально репозиторий Git в свой аккаунт на Git-хостинге?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Используйте GitHub CLI
    # create a repository interactively
    gh repo create
    
    # create a new remote repository and clone it locally
    gh repo create my-project --public --clone
    
    # create a remote repository from the current directory
    gh repo create my-project --private --source=. --remote=upstream

    Или GitLab CLI
    # create a repository under your account using the current directory name
    $ glab repo create
    
    # create a repository under a group using the current directory name
    $ glab repo create --group glab-cli
    
    # create a repository with a specific name
    $ glab repo create my-project
    
    # create a repository for a group
    $ glab repo create glab-cli/my-project
    Ответ написан
    Комментировать
  • Как скачать файл напрямую из хранилища Git LFS?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Скачивайте так же, как и любой другой файл по ссылке для скачивания на сайте.
    URL вида
    https://gitlab.com/"профиль"/"репозиторий"/-/raw/"ветка"/"полное имя файла"
    Ответ написан
    Комментировать
  • Как удалить приватного репозитория GIT папку?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Грубо говоря на компе [папка1], а в репе лежит [папка1, папка2]

    Такого не может быть. Если вы не видите в рабочем каталоге папку, а она точно есть в ветке, значит в каталоге распакована другая ветка, либо каталог «не чист», т. е. содержит незакоммиченные правки.

    Если репозиторий частный, то проще удалить глючный коммит.
    git reset --hard HEAD^
    git push --force

    и сделать нормально новый
    Ответ написан
    Комментировать
  • Как узнать, от какой ветки или комита была рождена ветка

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Вопрос «от какой ветки» бессмысленен в Git, потому что ветки создаются только от какого-то коммита.
    И тут нет такого маразма, как в Mercurial, что каждый коммит намертво привязан к какой-то ветке.
    Вот типичная ситуация:
    A - B - C - - - - J     [master]
         \
          D - E - F - G     [branch-A]
               \
                H - - I     [branch-B]

    А чтобы найти начало ветки, нужно определиться, какую другую ветку мы хотим считать родительской.
    Тогда первый общий коммит находится легко, как мы видим на примере работы GitHub.

    Например так
    diff -u <(git rev-list --first-parent child_branch) <(git rev-list --first-parent parent_branch) | sed -ne 's/^ //p' | head -1
    Ответ написан
    Комментировать
  • Как обновить проект с github?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    git pull разве должна что-то откатывать?
    Чтобы вернуться к старому состоянию, не нужно ничего скачивать. Git хранит всю историю локально.
    Если не нужна работа проделанная после последней отправки, то достаточно переместить указатель ветки на тот момент
    git reset --hard example/ветка
    Если коммитов после вчера ещё не было, отменить изменения файлов ещё проще. Способов много.
    git reset --hard
    git checkout '*'
    git restore '*'

    Это отменит только изменения уже закоммиченных ранее файлов. Новые файлы можно удалить через
    git clean -d -f
    Ответ написан
    Комментировать
  • Что делать с двумя репозиториями?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    А что мешает один локальный репозиторий синхронизировать с несколькими внешними?
    git remote add server1 <URL>
    git remote add server2 <URL>
    git fetch server1
    git merge server1\main
    git push server1 <локальная_ветка>:<внешняя_ветка>

    Как угодно можно обмениваться коммитами.
    Ответ написан
    Комментировать
  • Как использовать git + gitea для работы с проектом из самостоятельных подпроектов?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Я думаю это можно реализовать с помощью команды sparse-checkout
    Все проекты храним в одном большом монорепозитории и распаковываем разные наборы каталогов для разных ситуаций.
    Ответ написан
    Комментировать
  • Как запушить SHA коммит в git?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Нельзя запушить какие то беспризорные коммиты, пушат ветки. В состоянии оторванной HEAD нет никакой ветки. Тебе нужно заново создать свою ветку, чтобы она указывала на текущее состояние проекта
    git branch -f feature_branch
    Ключ force нужен, так как ветка уже существует и мы её пересоздаём в новом месте.
    Ответ написан
    Комментировать
  • Как засунуть коммит в новую локальную ветку и запушить?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Но если я создам новую ветку не запушенный коммит пропадет.

    Странное заявление. При создании ветки от текущего коммита, он автоматически окажется в новой ветке тоже. С чего это он должен куда-то пропасть?
    git branch feature_branch # создать новую ветку для текущего коммита
    git reset origin/master # удалить коммит, он останется только в новой ветке

    одной командой сказать, что бы запушил коммит не в мастер а в другую ветку, не переходя на нее

    И так тоже можно
    git push origin HEAD:feature_branch
    Но из локального мастера всё равно не забудь удалить лишнее.
    Ответ написан
    Комментировать
  • Git squash commits?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    В книге ProGit есть описание одного интересного приёма, который возможно уместен в данной ситуации. Он позволяет спрятать начало истории и оставить только свежие коммиты, не прибегая к rebase.

    Например, допустим в вашем проекте огромная история изменений и вы хотите разбить ваш репозиторий на два — один с короткой историей для новых разработчиков, а другой с более длинной историей для людей, интересующихся анализом истории. Вы можете пересадить одну историю на другую, 'заменяя' самый первый коммит в короткой истории последним коммитом в длинной истории. Это удобно, так как вам не придётся по-настоящему изменять каждый коммит в новой истории, как это вам бы потребовалось делать в случае обычного объединения историй (так как родословная коммитов влияет на SHA-1).

    Так мы скроем историю, за которую нам стыдно. Но при желании всегда можно будет быстро вернуть историю на место не переписывая хеши всех коммитов.
    Ответ написан
    Комментировать
  • Как переключиться на другую ветку?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Всё у тебя переключилось. Ты перешел в нужное состояние (HEAD is now at...), но на него не указывает ни одна ветка (состояние detached HEAD)

    Локальную ветку надо дополнительно создать.
    Ведь ветка это лишь именованый указатель на состояние проекта.

    Либо сейчас создай ветку в текущем состоянии.
    git branch feature/acproject-access-control

    Либо повтори правильно переключение:
    git checkout -b feature/acproject-access-control origin/feature/acproject-access-control
    хотя наверное и короткая команда сработает:
    git checkout feature/acproject-access-control
    Ответ написан
    Комментировать
  • В чем разница Changes not staged for commit и Untracked files (команда git add)?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Untracked — неотслеживаемый файл, Git им не управляет. Он может быть не только новым, но и очень старым.
    Changes not staged — файл под управлением Git и был изменён в рабочем каталоге.

    Разница существенная. Например состояние этих групп файлов сбрасываются разными командами. Команда reset или checkout работает только с отслеживаемыми файлами, а например удалить неотслеживаемые можно только через clean
    Ответ написан
    Комментировать
  • Как отменить сделанный git push?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    1. Сделанный push отменяется только повторным push с противоположными изменениями в коммитах.
    2. Сам push никак не меняет локальные файлы.
    Ответ написан
    Комментировать
  • Как сменить аккаунт с которого идет пользования Git?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    При коммите в Git не используются никакие аккаунты. Сами коммиты подписываются именем и мылом прописанным в конфиге командами
    git config --global user.name "Имя Фамилия"
    git config --global user.email user@mail.com

    Представиться можно как заблагорассудится, тут нет проверок и авторизаций.
    Бывает что эти данные прописаны в нескольких местах, тогда можно вывести все параметры командой
    git config --list --show-origin
    И увидеть в каком файле лишнее.

    Аккаунт гитхаба используется только при отправке данных туда. Тут надо уже смотреть как ты авторизовывался и сбрасывать сессию.
    Ответ написан
    Комментировать
  • Как изменить автора коммита, но сохранить время предыдущего коммита?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    В 2022 году рекомендованным методом является использование пакета filter-repo

    git filter-repo --mailmap my-mailmap

    Где файл my-mailmap должен содержать строки вида
    Correct Name <correct@email.com> <old@email.com>
    Ответ написан
  • Как запушить с выбором ветки?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    git remote add front <url> # придумать псевдоним внешнего репозитория
    git fetch front # скачать «пустой» репозиторий к себе
    git rebase front/dev # пересадить готовый проект поверх существующей «пустой» ветки
    git push front HEAD:dev # отправить проект
    Ответ написан
    Комментировать
  • Как, в моем случае, запушить файл с локального на удаленный репозиторий Git в другую ветку?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Зачем создавать новый репозиторий? Не надо изобретать сложные решения.
    # Если хочешь внести изменения во внешний репозиторий, то просто клонируй его к себе
    git clone https://github.com/github-name/test.git
    # Войди в рабочий каталог
    cd test
    # Переключись в нужную ветку
    git switch additional
    # Измени файл и закоммить его 
    git add "index.html"
    git commit -m "add new sections"
    # Отправь на GitHub
    git push
    Ответ написан
    Комментировать
  • Как удалить последний коммит с сервера с сохранением на локали?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    git reset --soft HEAD^1 # откатываем локальную ветку, но не трогаем рабочую копию кода
    git push --force origin HEAD # заменяем ветку во внешнем репозитории

    Но этот рецепт применим только если это личная ветка и коллеги её ещё не успели использовать.

    Правильней будет отменять правки а не «удалять» коммиты
    git revert HEAD # отменяем предыдущую правку
    git push # отправляем во внешний репо
    git revert --no-commit HEAD # отменяем отмену, но не коммитим сразу
    # дальше оформляем уже правильный коммит, без ненужных файлов.
    Ответ написан
    Комментировать
  • Как убрать простыню из комитов в истории ветки?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Спасибо Lynn «Кофеман» за элегантное решение
    git reset --soft master # начнём ветку заново от текущего мастера
    # но все уже сделанные правки не пропадут, а останутся в индексе
    git commit -m 'Это один коммит' # зафиксируем работу
    Ответ написан
    Комментировать
  • Git не видит код?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    git reset --hard
    Чтобы код в рабочем каталоге актуализировать с тем, что в репозитории.
    Ответ написан
    Комментировать