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-ключа

gittroubleshoot