git troubleshoot
Обычно git сам вместе с выводом о проблеме приводит команды для ее решения, так что полезно туда смотреть!
Ошибка идентификации
Если не были установлены основные конфигурации (имя и email), то git не даст сделать коммит (Author identity unknown), так как для коммита нужны эти конфиги - они указываются в инфе об авторе коммита. Чтобы исправить это - нужно:
git config --global user.email "yourMail@mail.ru"
git config --global user.name "your name and optionally surname"
# просмотреть конфиги git-а можно той же командой
git config -l
Коммит в неправильную ветку
Чтобы исправить - сначала делаем git reset <commit>
с хэшем коммита, который стоит раньше нашего коммита.
git reset <commit> # Изменения вернулись в рабочую директорию (не в индекс)
git add .; git stash # Откладываем изменения
git checkout <branch> # Переключаемся на нужную ветку
git stash pop # Возвращаем отложенные изменения
git commit -m "message" # И делаем коммит в текущей (правильной) ветке
Второй способ решения проблемы.
После коммита в неправильной ветке:
git checkout <branch> # Переходим на нужную ветку
git merge <wrong-branch> # Сливаем ту "неправильную" ветку в текущую, чтобы этот коммит тоже появился в нужной нам текущей ветке
git checkout <wrong-branch> # Возвращаемся на "неправильную" ветку
git reset --hard HEAD~1 # И сбрасываем жестко на один коммит
# Всё, теперь этот коммит есть в нужной ветке, а в ненужной мы сбросили его
Не получается сделать git pull
Обычный конфликт слияния из-за несовпадения версий в remote и local repos. Если файлов конфликтных много и времени или желания заниматься правкой нет, то можно кинуть конфликты в другую ветку.
git reset <penultimate-commit> # Изменения попадут п рабоучю директорию
git stash # Откладываем их
git checkout <branch> # Переключаемся на ветку, куда будем грузить конфликты
git stash pop # Возвращаем отложенное на эту ветку
git add .; git commit -m "message" # И коммитим
# И уже можно вернуться на предыдущую ветку и затянуть там изменения
git pull
Не получается сделать git push
В gitlab, к примеру, ветка master защищена и просто так сделать push туда не выйдет - нужно просить админа разблокировать ветку либо создать другую ветку.
Но последний вариант тоже может не сработать, если remote repo пустой - нужно просить админа создать там хотя бы один файл, потом затянуть эти изменения себе на local и уже потом делать push.
Ошибка при клонировании репозитория с SSH-URL
Если при клонировании репозитория с SSH-URL вы получили ошибку, то, скорее всего, у вас есть несколько ключей на локальной машине. Алгоритм ниже подходит только для решения этой проблемы. Найдите или создайте файл config (без расширения) в папке ~/.ssh/. В файле напишите, какой ключ для какого хостинга или аккаунта использовать. Настроенный файл выглядит примерно так:
Блок Host определяет обёртку - то, какому аккаунту соответствует некоторый SSH-ключ.
Внутри блока Host укажите:
- HostName - адрес интернет-хостинга, где размещён ваш репозиторий;
- User - git;
- IdentityFile - путь до SSH-ключа, привязанного к аккаунту с соответствующим Host.
Чтобы избежать конфликта ключей SSH и решить проблему, создайте такой блок для каждого SSH-ключа.
В конце замените строку github.com во всей ссылке SSH, которую вы копировали на восьмом шаге, на строку из Host, которую вы вписали в файл config.
Соус: 2.5 Создание SSH-ключа