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

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Просмотр истории
    Если вы укажете каталог или имя файла, вы ограничите вывод только теми коммитами, в которых были изменения этих файлов. Эта опция всегда указывается последней после двойного тире (--), чтобы отделить пути от опций:
    git log --name-status --graph --oneline --since=4.months -- ToModel*.php
    Ответ написан
    4 комментария
  • Как добавить в .gitignore такие файлы как gulpfile.js, package-lock.json и package.json?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Такие файлы добавляются в .gitignore так же, как и любой другой файл.
    Но, подозреваю, что вопрос в другом. Хочется чтобы файлы исчезли из проекта?
    Ты видишь, что файл никуда не исчез и сделал вывод, что файл не добавлен в игнор. Но это не так.
    По сути .gitignore тебе совершенно не нужен, потому что добавление файла в игнор не удалит его автоматически из репозитория, если он ранее уже был добавлен в отслеживаемые. Этот файл нужен только чтобы случайно не добавить в репозиторий лишнее. Но даже он не помешает нам добавить любой файл в репо командой git add файл

    Когда не хочешь видеть файл в репо, просто удали его физически и сделай коммит.

    Если же файл нужен в рабочем каталоге, но ты не хочешь его светить в репозитории, то удали файл только из индекса командой git rm --cached имя_файла и закоммить это.
    Ответ написан
    1 комментарий
  • Почему мне VSC, когда я пушу на гитхаб ее средствами, предлагает сразу после пуша сделать пулл?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Скорее всего pull предлагает сделать не после push, а после нажатия кнопки синхронизации в VSCode.
    До того как собственно сделает сам push, спрашивает «а не хотите ли сначала обновиться?»
    Более точный ответ мы увидим в консоли, смотри там что происходит.
    Скачивать ветку заново сразу после отправки действительно нет никакого смысла.
    Ответ написан
    Комментировать
  • Как запушить ветки на гитхаб?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Ветки создаются командой: git branch имя
    Всё! Никаких коммитов дополнительно создавать не надо. Главное чтобы репозиторий уже содержал хотя-бы один коммит, чтобы веткам было куда указывать (ветка это лишь указатель на коммит).

    Push отправляет конечно же не файлы а именно ветки. По умолчанию только одну ветку, которая текущая. Чтобы отправить сразу все, следует его об этом попросить: git push origin --all
    Ответ написан
    Комментировать
  • Как удалить merge commit из проекта?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Если капитан любит линейную историю то легко можно избавиться от коммита слияния:

    git rebase origin/master databаse_branch

    Эта команда пересадит ветку databаse_branch на вершину актуальной ветки database, которая судя по всему связана с веткой master в вышестоящем репозитории origin. Коммит слияния исчезнет.

    Затем придётся принудительно обновить в вышестоящем репозитории эту ветку:

    git push --force

    И если кто-то её уже скачивал к себе, то попросить их обновиться через:

    git pull databаse_branch --rebase

    Как-то так. Я мог не угадать названия веток, так как по скрину не всё видно. Но принцип решения должен сработать.
    Ответ написан
    5 комментариев
  • Как правильно перенести ветку в Git на наследник предыдущего коммита?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Это называется перебазирование. Мы пересаживаем одну ветку на вершину другой ветки.
    git rebase deps react-app
    Но ветка react-app у тебя уже запушена, значит её придётся принудительно обновить во внешнем репозитории.
    git push --force
    И будь внимателен, если ветку react-app уже кто-то скачал себе, то ты их должен предупредить, чтобы они удалили её у себя и скачали заново. Либо обновили через git pull --rebase
    Ответ написан
    1 комментарий
  • GitHub не входит в аккаунт, проблема с токеном?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Перед тем как применить новую аутентификацию, удали старую командой:
    echo "url=https://github.com" | git credential reject
    Ответ написан
  • Откуда берутся пустые табуляции при любом изменении файла?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    На твоём скрине я вижу обратное. Не появляются, а наоборот исчезают. И не табуляции, а пробелы.
    По умолчанию в редакторах JetBrains удаляются лишние пробелы (trailing spaces) только в изменённых строках. Проверь это у себя в настройках редактора вот тут Editor / General / On Save
    61441ce3441d5609665470.png

    Но, по хорошему, надо эти косяки в коде везде поправить.
    Ответ написан
    Комментировать
  • Как очистить папку .git (из локального и удаленного репозитория)?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Если нужно просто удалить старую историю, то это можно сделать быстро и безопасно всего парой команд.
    Первая команда схлопнет всю историю ветки в один коммит:
    git reset $(git commit-tree HEAD^{tree} -m 'Новое начало истории')

    Вторая команда очистит папку .git от мусора:
    git gc --prune=now --aggressive

    Ну и конечно отправить новое состояние ветки на гитхаб:
    git push --force

    Если у вас Windows, то работайте в git-bash, а не в стандартной командной строке.
    Ответ написан
    Комментировать
  • Как на git поменять аунтификацию с пароля на токен если не запрашивается пароль?

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

    Но можно попробовать универсальный метод сброса авторизации:
    echo "url=https://github.com" | git credential reject

    Если теперь снова попробовать git push, то вылезет окошко выбора способа авторизации.
    Ответ написан
    Комментировать
  • А можно ли как-то иметь файл в локальном репозитории, но при этом чтобы он не пушился в удаленный?

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

    Но ты можешь распаковать (checkout) разные ветки в разные каталоги (worktree). И уже для каждого сможешь сделать нужные настройки. Так ты получишь желаемое и пароли не придётся светить в публичном внешнем репозитории.
    Ответ написан
    1 комментарий
  • Нужно ли каждый раз делать для себя pull request?

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

    Твоя команда
    git push -u origin master
    отправляет твою текущую локальную ветку master в такую же ветку master на гитхабе и настраивает связь между ними (ключ -u).
    Если ты хочешь отправлять из локальной master в вышестоящий main, то пиши иначе
    git push -u origin master:main
    После того как связь создана, то дальше можно отправлять короткой командой
    git push

    Лучше переименовать локальный master чтобы не путаться
    git branch -M main
    Ответ написан
    Комментировать
  • Как синхронизировать github репозиторий в vscode?

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

    А правильней было копировать ТОЛЬКО сам репозиторий на флешку. И не в виде папки, а одним файлом, так надёжнее и быстрее. Для этого даже специально придумали команду git bundle. Затем на новом компьютере распаковываешь файл пакета и восстанавливаешь рабочий каталог.

    Сам создал себе проблему на пустом месте, но она легко решаема:

    Если ты вернулся на рабочий компьютер, то просто удали все файлы с кодом из рабочей папки и верни туда файлы с флешки. Git сам увидит какие файлы были удалены и какие изменены или добавлены. ВСЁ.
    Останется закоммитить изменения и потом отправить их на гитхаб.

    Либо если ты нашел другой компьютер с интернетом, то клонируй туда снова свой проект с гитхаба (надеюсь ты не забыл сделать push перед тем как копировать файлы на флешку?) и потом так же очисти рабочий каталог и запиши изменённый проект на это место.
    Ответ написан
    1 комментарий
  • Создать новую ветку, правильно ли я себе представляю, что нужно делать?

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

    А судя про то, что пишешь про комментирование кода чтобы временно скрыть и про перебазирование для синхронизации — ты похоже не понимаешь зачем нужен и как работает Git.
    Почитай документацию или посмотри Git-курс на Ютубе.
    Ответ написан
    3 комментария
  • Как удалить или засинхронизировать HEAD и удалённую ветку на GitLab?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Желтая бирка означает что ты сейчас не находишься ни в какой ветке (состояние отсоединенного указателя HEAD). Что ты собрался запушить? Ветка же нужна, которую пушить. HEAD это не ветка, это просто указатель на текущее состояние. Вот хороший мультик, который поможет тебе понять что происходит.

    Тебе надо установить указатель твоей ветки на текущий коммит, на который указывает HEAD
    git checkout -B имя_твоей_ветки HEAD
    Тут важен регистр опции -B, так как ветка с таким именем уже где-то существует и мы принудительно пересоздаём её на новом месте. А находясь в ветке, мы уже сможем её запушить.
    Ответ написан
    Комментировать
  • Как добавить чужую ветку в проекте?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Это называется не добавить, а распаковать ветку в рабочий каталог из локального репозитория (сделать текущей), в который она уже загружена (добавлена) командой fetch.
    git checkout -b develop origin/develop --
    И всё. После checkout сможешь работать с этой веткой.
    Ответ написан
    6 комментариев
  • В чем разница между undo commit, revert commit и reset branch to commit?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Там в меню вашей IDE есть ещё несколько методов откатить изменения.
    Это же JetBrains? Все способы подробно описаны в справке, например вот как в IntelliJ IDEA

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

    Revert не удаляет коммит, а создаёт новый, который описывает действия необходимые для отмены выбранного коммита.

    Undo позволяет отменить последний коммит. Но изменения коммита предлагает сохранить в новый changelist. Файлы в рабочем каталоге не изменятся и можно будет их подправить и заново закоммитить.

    Drop — удобная команда для удаления произвольного коммита из середины истории. Под капотом там на самом деле выполняется интерактивный rebase, но в автоматическом режиме.

    Revert Selected Changes напоминает Revert, но отменяет изменения отдельного файла, а не всего коммита. Эта команда доступна на Панели изменённых файлов.

    Get позволяет вернуть любой файл к состоянию на определённый коммит в истории. Выберем файл любым удобным способом и контекстное меню Git | Show History покажет все коммиты, в которых изменялся данный файл. Кликнув на нужном коммите правой кнопкой увидим команду Get
    Ответ написан
    Комментировать
  • Почему пропадают commit в show history в pycharm?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Show history показывает историю только в пределах конкретной ветки.
    Если ты новый коммит не привязал ни к какой ветке, то ты его не увидишь ни в истории, ни в общем журнале коммитов. Не забывай проверять в какой ветке находишься и присваивай цепочке коммитов название ветки если начал строить ответвление не от вершины, а от середины другой ветки. Иначе потеряешь работу и придётся искать эти коммиты через git reflog
    Ответ написан
    3 комментария
  • Как удалить commit на Github?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Раз первый коммит единственный и он тебе не нужен, то можно просто удалить репозиторий на GitHub и создать заново. Но можно и не пересоздавать:
    # удалить все файлы в рабочей копии
    git rm -r * 
    # создать на месте первого коммита пустой коммит
    git commit --allow-empty --amend --message "Initial commit" 
    # отправить текущую ветку на GitHub 
    git push --force

    Получишь чистый репозиторий с начальным пустым коммитом.
    Сам пустой коммит можно использовать как основу для построения своего дерева коммитов.
    Либо через ключ --amend замени его на что-то более осмысленное.

    А ещё лучше не заниматься ерундой, исправить код и исправить коммит ключиком --amend
    Ответ написан
  • Как откатить изменения только у одного файла на несколько коммитов?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    В терминале пишем
    git checkout хеш_коммита -- полное_имя_файла
    и состояние файла вернётся к тому, что было после коммита с указанным хешем.

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