Задать вопрос
Ответы пользователя по тегу Git
  • Как сменить аккаунт GitHub?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Нужно не аккаунты переключать, а давать права на репозиторий. Зачем вам несколько аккаунтов? Достаточно одного.

    Либо работать через SSH, тогда аккаунты не понадобятся в принципе.
    Ответ написан
    Комментировать
  • Как отменить добавление файлов, которые появились при pull?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Отменить pull можно так
    git reset --merge ORIG_HEAD
    Это делается сразу после pull
    Ответ написан
    Комментировать
  • Как перестать отслеживать папку?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    а можно ли сделать так, чтобы при git clone папка /vendor на локалку сливалась, после чего убедить git перестать ее отслеживать?

    Можно. Разрешаю ))
    после клонирования удали папку из репозитория
    git rm -r --cached -- 'vendor/*'
    git commit

    Если папка упомянута в gitignore, то перестанет отслеживаться в рабочем каталоге.
    Но удалится в origin/
    Ответ написан
    Комментировать
  • Как восстановить все удаленные файлы из всех коммитов в Git?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Посмотреть все коммиты, где удалялись файлы
    git log --name-status --graph --oneline --diff-filter=D --branches

    Затем восстановить нужные файлы командами вида
    git restore <SHA>^ -- <полное имя файла>
    Ответ написан
    Комментировать
  • Почему не могу запушить репозиторий в github?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Большой файл видимо был добавлен в один из новых, ещё не запушенных коммитов. И затем был удалён, но остался в истории. Неважно, что сейчас в рабочем каталоге. Пушится не рабочий каталог, а ветки репозитория. Это разные сущности.

    Просто склейте новые коммиты в один, это решит проблему.
    git reset --soft github/master
    git commit -с
    git push github -all
    Ответ написан
    Комментировать
  • Как перебазировать разросшуюся ветку в git?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    # 1 -> 2
    git rebase --onto master tmp1~2 tmp1 # пересадить два коммита ветки tmp1
    git rebase --onto master tmp2~3 tmp2 # пересадить три коммита ветки tmp2
    git reset HEAD~1 # обрезать ветку tmp2 на один коммит
    
    # 1 -> 3
    git rebase --onto master tmp1~3 tmp1# пересадить три коммита ветки tmp1
    git switch master # вернуться в мастер
    git reset tmp1~2 # и подвинуть его на шаг вперёд
    git rebase --onto master tmp2~3 tmp2 # пересадить три коммита ветки tmp2
    Ответ написан
    Комментировать
  • Возможно ли игнорировать файл/папку через .gitignore, которые уже есть в репозитории?

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

    Игнор действует только на те файлы, которые ещё не отслеживаются. Помогает СЛУЧАЙНО не добавить файл. Но лаже игнор не запрещает принудительно загнать файл в репозиторий.

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

    Ещё есть трюк с временным игнорированием изменений в файле, ранее уже добавленном. Но он будет работать только в локальной копии репозитория и только после ввода команды
    git update-index --assume-unchanged файл
    Ответ написан
    Комментировать
  • Почему git rebase HEAD~3 --autosquash не работает?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Потому что склеиваются только смежные коммиты.
    Ответ написан
    Комментировать
  • Что почитать про решение Pull Request merge конфликта?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Это называется mergetool.
    Во нормальных GUI-клиентах инструмент слияния встроен и здорово помогает разруливать конфликты. SmartGit рекомедую, он под все операционки есть.
    Ответ написан
    Комментировать
  • Как сделать хитрый reset с сохранением коммитов?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Решение в одну строку
    # удостовериться что мы в нужной ветке
    git checkout branch2 
    # создать коммит с нужным состоянием 
    git merge --ff $(git commit-tree -p branch2  -m "Magic commit" branch1^{tree})
    Ответ написан
    Комментировать
  • Как сменить пользователя для доступа в GitHub?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Удалить предыдущую авторизацию
    echo "url=https://github.com" | git credential reject

    И при повторном пуше войти под другим пользователем.

    Либо перейти на ssh-протокол. Это немного сложнее, но как вариант сгодится.
    Ответ написан
    Комментировать
  • Как отправить инициализированный локально репозиторий 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
    Но из локального мастера всё равно не забудь удалить лишнее.
    Ответ написан
    Комментировать