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

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Вот несколько фактов, которые помогут понять как работает Git.
    • Файл .gitignore действует только на ещё не отслеживаемые файлы.
    • Файл .gitignore предназначен для описания того, что мы не хотим СЛУЧАЙНО добавить в репозиторий. Либо не хотим случайно удалить переключив ветку.
    • Мы можем ПРИНУДИТЕЛЬНО добавить в репозиторий ЛЮБОЙ файл, даже если он описан в .gitignore.
    • Добавление файла в .gitignore не удалит сам файл из репозитория. Если файл УЖЕ в репозитории, то он продолжит отслеживаться, независимо от наличия .gitignore.
    • Если больше не хотим отслеживать какой-то файл, то просто удаляем его из репозитория. Ключ --cached позволит оставить файл в рабочем каталоге текущего репозитория если он нужен.
    git rm --cached -- '.DS_Store'
    git commit

    Но последний рецепт сработает только на одном компьютере. Если коллеги переключатся на этот коммит, то файл удалится у них из рабочего каталога.
    Ответ написан
    4 комментария
  • Как не переносить все в стэш?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    перед коммитов я селектил файлы которые не должны попасть на гитлаб/гитхаб - заносил их в стеш
    Зачем так сложно?
    Что мешает перед коммитом индексировать только нужные файлы? Зачем ты коммитишь всё?

    уже их пушил
    Ты хотел сказать «коммитил»?
    Пушится всегда вся ветка целиком, коммиты, а не отдельные файлы.
    Ответ написан
    3 комментария
  • Почему после git pull у изменённых файлов статус modified?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    А после разрешения конфликтов ты завершил сбойнувший pull? Изменения то подтянулись в рабочий каталог, но надо бы ещё сам коммит слияния зафиксировать.
    Что-то вроде:
    git merge --continue
    Ответ написан
    Комментировать
  • Как удалить изминения из gitlab?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Отменить изменения = внести изменения, противоположные этому.
    Например через git revert <хеш>
    Ответ написан
    Комментировать
  • Разница между @~ и @^?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Эти символы абсолютно идентичны. Используются для относительных ссылок назад в историю от какой либо точки.
    Например git reset HEAD^3 переключит текущую ветку на три коммита назад относительно текущего состояния.
    Ответ написан
    4 комментария
  • Как удалить старый комментарий с исправлением из issue?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Не надо называть сообщения коммитов комментариями. То что ты описываешь как название коммита, на самом деле является лишь заголовком сообщения коммита.
    Реальные же комментарии на гитхабе легко удаляются, так как они не хранятся в репозитории.
    Гитхаб показывают тебе всю историю изменений истории коммитов, но это видно только в его базе, не беспокойся об этом. Коммиты с ошибками ты уже удалил из истории репозитория.
    Ответ написан
    Комментировать
  • Как откатить права к файлам в git?

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

    core.fileMode
    Tells Git if the executable bit of files in the working tree is to be honored.


    А под кем ты коммитил, совершенно не важно. И уж точно не важно, кто отправлял коммиты во внешний репозиторий (push). Коммиты подписаны хешем и точно не изменятся при передаче.
    Права файлов устанавливаются во время извлечения их в рабочий каталог (checkout), и владельцем будет тот пользователь, который извлекал.
    Ответ написан
    6 комментариев
  • Как увидеть предыдущий коммит без удаления текущего?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    А ещё можно попробовать команду
    git checkout -
    Это вернёт указатель HEAD в предыдущее состояние, в данном случае на вершину вашей ветки.
    Ответ написан
  • Ошибка git everything up-to-date или что не так?

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

    Не понимаю этой фразы. Какая команда такое выполняет?

    выполнении команды git push origin master

    Если локальный репозиторий склонирован из внешнего, то автоматически создаются связи между ветками.
    Не нужно указывать в какой репозиторий (origin) и в какую ветку (master) отправлять текущую ветку.
    Достаточно просто git push

    выдает сообщение everything up-to-date

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

    Но вы точно уверены что текущая ветка называется master, а не main? Давайте узнаем.
    Покажите вывод команд
    git branch -vv
    и
    git status

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

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Мне нравится актуализировать свои форки через rebase. Так история выглядит прозрачнее.

    ЗЫ
    В русском языке нет приставки «саб». Надо говорить подпроекты и подмодули. Но они тут не нужны. Обновление прекрасно работает через слияние либо перебазирование.
    Ответ написан
    4 комментария
  • Как откатить коммиты в git?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Откатиться на три коммита назад:
    git reset --hard HEAD~3

    А вообще не стоит вслепую повторять команды. Лучше прочитать документацию и работать осмысленно.
    Ответ написан
    5 комментариев
  • Почему не получается создать голый репозиторий на сервере для совместной работы с Git с использованием протокола SSH?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    обязательно ли в названии голого репозитория прописывать в конце .git?

    Это не название репозитория, а название папки. Оно может быть любым.

    Далее я пользовался документацией 4.2 Git на сервере — Установка Git на сервер

    Главой не ошибся? Если у тебя уже есть сервер GitLab, то и читай про него: 4.8 Git на сервере — GitLab

    Мне непонятна часть user@git.example.com:/srv/Git

    user — имя, под которым ты авторизован через ssh на внешнем компьютере
    git.example.com — адрес этого внешнего компьютера
    /srv/Git — путь к папке с репозиторием внутри внешнего компьютера

    Но это всё тебе не нужно если уже есть сервер. А GitLab это именно сервер.
    Не выдумывай ничего и делай по документации.

    там первоначально нужно создать пустой проект

    Это уже создаёт пустой голый репозиторий. Ничего руками копировать не надо. Да у тебя и прав нет на такой доступ.

    нажал на синюю кнопку Clone и мне высветились два варианта ссылки

    Если работать через https-протокол, то создавать ключи не придётся. Всё станет намного проще.

    Дальше ты либо клонируешь его себе на комп через
    git clone git@gitlab.com:potemkin277/test-project.git

    Либо связываешь свой уже существующий репозиторий с ним
    git remote add origin git@gitlab.com:potemkin277/test-project.git

    Затем отправляешь свою ветку туда и связываешь локальную и внешнюю ветки -u
    git push -u origin ветка
    Ответ написан
    2 комментария
  • Безопасно ли удалить pull request?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Удалить Pull Request невозможно, разве только закрыть его, да и не нужно ничего удалять для доработки задачи! Просто вернитесь в свою тематическую ветку. Добавьте новые коммиты с исправлениями и отправьте их на гитхаб. Pull Request обновится автоматически.

    Даже если вы закрыли пиар, но продолжили работать в той же ветке, то последующий пуш просто заново откроет этот же пиар.

    Аналогично если на Code Review будут замечания, то вы их просто исправляете локально в той же тематической ветке и пушите. Доработки сразу попадут в Pull Request.
    Ответ написан
    Комментировать
  • Появляется ошибка при вводе git push -u Error: failed to push some refs to...?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Вас унесло совсем не в ту степь. Изначальная проблема думаю в том, что у вас нет прав на запись в свой репозиторий — Remote rejected. При первом пуше обычно просит авторизоваться. Это было сделано?

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

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

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    git reset --hard 0821842 # откатить локально 
    git push --force # откатить на внешнем, это удалит и создаст заново ветку

    Master обычно имеет защиту от удаления, тогда можно поступить более правильно:
    # создать синтетический коммит, отменяющий последние коммиты
    git merge --ff $(git commit-tree -p master -m "Rollback to commit 0821842" 0821842^{tree})
    git push
    # можно ещё для надёжности проверить, что новое состояние действительно совпадает с желаемым
    git diff master 0821842
    Ответ написан
    8 комментариев
  • Как разрулить конфликт из командной строки?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    #отменить неудачное слияние
    git merge --abort
    # повторить слияние используя опцию theirs
    git merge -Xtheirs branch_b 
    # при конфликтах выберется вариант из вливаемой ветки

    Но это не точно. Я вечно путаю ours и theirs )) Советую почитать в нашей книжке про типы слияний

    По умолчанию, когда Git при слиянии веток замечает конфликт, он добавляет в код маркеры конфликта, отмечает файл как конфликтующий и позволяет вам разрешить его. Если же вместо ручного разрешения конфликта вы хотите, чтобы Git просто использовал какую-то определённую версию файла, а другую игнорировал, то вы можете передать команде merge одну из двух опций -Xours или -Xtheirs.

    В этом случае Git не будет добавлять маркеры конфликта. Все неконфликтующие изменения он сольёт, а для конфликтующих он целиком возьмёт ту версию, которую вы указали (это относится и к бинарным файлам).


    возиться с уголками лень

    Всем лень. Поэтому используют merge tools которые помогают разбираться с «уголками» в один клик.

    conflict-solver--base-changes-03906ff6.png

    Либо сразу во всём файле выбрать какой-то один вариант и разрешить конфликты в пользу одной стороны.
    resolve-dialog.png

    Если хочется сделать это именно из командной строки, то делается это так.
    git checkout branch_b -- имя_файла # оставить версию файла из ветки branch_b
    git add имя_файла # сбросить состояние конфликта
    # ... разрешить другие конфликты
    git merge --continue --no-edit # создать коммит слияния
    Ответ написан
  • В терминале Git Bash вылазит какой-то END и другое. Как убрать?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Git хочет показать вам более одного экрана с информацией, для этого он вызывает стандартную программу пейджера Unix less. Просто введите q, чтобы вернуться в терминал, когда вы больше не хотите перемещаться по выходным данным.

    j перейти на одну строку вниз
    k переместиться на одну строку вверх
    space перейти на одну страницу вниз
    b перейти на одну страницу вверх
    h показать помощь
    / поиск вперёд
    ? поиск назад

    Если вы не хотите less, просто замените его другим пейджером в конфигурации. Если вам вообще не нужен пейджер, просто используйте cat:

    git config --global --add core.pager cat
    Ответ написан
    4 комментария
  • Как проверить ветку на актуальность с удаленным репозиторием?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    git fetch # предварительно скачать обновления
    git branch -vv #  показать список локальных веток 
    # в скобках покажет с какими вышестоящими ветками они связаны
    # если вышестоящая ветка удалена, то будет пометка gone
    git switch ветка # выборочно переключиться на ветку
    git status # посмотреть отставание от вышестоящей
    Ответ написан
    Комментировать
  • Как правильно добавить в git-репозиторий папку выше по каталогу?

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

    Правильней будет перед перемещением папки .git воспользоваться командой filter-repo, чтобы пересобрать заново все предыдущие коммиты так, как будто репозиторий изначально лежал в корне.

    Исходная структура папок
    public_html
    └── wp-content
        ├── plugins
        │   └── my_plugin
        └── themes
            └── child-theme
                └── .git

    Подготовим старый репозиторий к перемещению
    git filter-repo --to-subdirectory-filter wp-content/themes/child-theme

    Получим такую структуру
    public_html
    └── wp-content
        ├── plugins
        │   └── my_plugin
        └── themes
            └── child-theme
                ├── .git
                └── wp-content
                    └── themes
                        └── child-theme


    Затем перенесём папку .git и всё остальное содержимое папки child-theme в корень сайта.
    Ответ написан
    Комментировать
  • Как отменить два последних комита без потери локальных изменений?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Очень просто. Вот один из способов.
    git reset --soft HEAD~2 # отменить два последних коммита
    # с опцией --soft состояние проекта в рабочем каталоге не изменится и ничего не потеряешь
    # и все локальные изменения после первого коммита автоматически поместятся в индекс
    git commit # создать коммит заново.


    В следующий раз вместо того, чтобы создавать дополнительный исправляющий коммит, просто пересоздавай предыдущий «плохой» коммит с помощью команды git commit --amend
    Ответ написан
    2 комментария