- Самые типичные ошибки и вопросы, связанные с Git, и удобные способы их решения
- Ошибка в комментарии к коммиту
- Как отменить последний коммит?
- Удалить ветку на сервере
- В чём разница между «git pull» и «git fetch»?
- Как отменить «git add» до коммита?
- Как разрешать конфликты слияния?
- Удалить все локальные файлы и директории, которые не отслеживает Git, из вашей текущей копии
- Клонировать все ветки с сервера
- Переименовать локальную ветку
- Вернуться к любому коммиту
- Удалить подмодуль (submodule)
- Перезаписать локальные файлы во время git pull
- Как добавить пустую директорию в репозиторий?
- Экспортирование исходников аналогично «svn export»
- Отменить все изменения, кроме тех, что уже добавлены в планируемый коммит
- Создать новую ветку на сервере из текущей локальной ветки
- Восстановить удалённый файл
- Вернуть один конкретный файл в состояние, в котором он был в каком-либо коммите
- Сделать так, чтобы Git игнорировал изменения прав файлов
- Заставить Git помнить пароль при работе с https
- Почему git pull не работает?
- 2 ответа
- Не работает git pull?
- Не работает git pull?
- Git для начинающих. Урок 6. git push и git pull
- Видеоурок
- Конспект урока
- Что такое push (пуш)
- Зачем пушить на сервер
- Когда пушить на сервер
- Как узнать, что есть незапушенные коммиты
- master и origin/master
- git push в терминале
- Как пушить в PhpStorm
- Что такое pull (пулл)
- Зачем пулиться с сервера
- git pull в терминале
- Как пулить в PhpStorm
- Когда что-то пошло не так.
- git push rejected
- Как избавиться от мердж-коммита
- Мердж-коммит в PhpStorm
- Что могу посоветовать
Самые типичные ошибки и вопросы, связанные с Git, и удобные способы их решения
Если вы хотите получше узнать те части Git, про которые раньше боялись спросить, то этот список для вас. Тут собраны наиболее типичные ситуации и способы их решения как из личного опыта автора, так и собранные по всему Интернету.
Ошибка в комментарии к коммиту
Если коммит ещё не был отправлен на сервер (push), то можно воспользоваться простой командой, позволяющей редактировать текст сообщения к последнему коммиту:
git commit --amend
Как отменить последний коммит?
Можно использовать git reset , вот так:
git reset --hard HEAD
1 означает один коммит до HEAD, т.е. до текущего положения. Стоит заметить, что это «ядерный» способ, который отменит все изменения. Если вам нужно сохранить всё, что вы сделали, но еще не успели закоммитить, используйте:
git reset --soft HEAD
Удалить ветку на сервере
git push origin --delete имя_ветки
В чём разница между «git pull» и «git fetch»?
git pull — это, по сути, git fetch , после которого сразу же следует git merge . git fetch получает изменения с сервера и сохраняет их в refs/remotes/ . Это никак не влияет на локальные ветки и текущие изменения. А git pull вливает все эти изменения в локальную копию.
Как отменить «git add» до коммита?
Вы выполнили git add имя_файла случайно и хотите отменить добавление файла. Если коммит ещё не был сделан, то поможет:
git reset имя_файла
Как разрешать конфликты слияния?
Используйте программу git mergetool , которая предоставляет удобный интерфейс для разрешения конфликтов.
Удалить все локальные файлы и директории, которые не отслеживает Git, из вашей текущей копии
Осторожно! Лучше сделайте перед этим бэкап.
Клонировать все ветки с сервера
Скорее всего, вы это уже сделали, а ветки просто скрыты. Вот команда, чтобы показать их:
Можно использовать git checkout origin/имя_ветки , чтобы посмотреть на нужную ветку. Или git checkout -b имя_ветки origin/имя_ветки , чтобы создать локальную ветку, соответствующую удалённой.
Переименовать локальную ветку
git branch -m oldname newname
Вернуться к любому коммиту
Можно использовать git reset , как показано ранее. Это будет означать, что вы хотите навсегда вернуться к тому состоянию, в котором вы были, а не просто посмотреть на него (для этого надо сделать checkout). Идентификатор коммита должен быть такой, какой прописан в выводе команды git log .
git reset --hard идентификатор_коммита
Ещё раз повторим: команда отменит все текущие изменения, так что убедитесь, что вам это действительно нужно. Или используйте --soft вместо --hard.
Удалить подмодуль (submodule)
Создание подмодулей используется довольно редко, но иногда они всё-таки встречаются. Вот, что вам нужно:
git submodule deinit submodulename
git rm submodulename
git rm --cached submodulename
rm -rf .git/modules/submodulename
Перезаписать локальные файлы во время git pull
Вам снова поможет git reset :
git fetch --all
git reset --hard origin/master
Как добавить пустую директорию в репозиторий?
Никак! Такая возможность просто не поддерживается, т.к. считается, что вам это не нужно. Но есть один трюк. Можно создать файл .gitignore в нужной директории со следующим содержимым:
# Игнорируем всё в этой директории
*
# Кроме самого файла .gitignore
!.gitignore
Экспортирование исходников аналогично «svn export»
Используйте git archive , например, так:
git archive --format zip --output /путь/к/файлу/файл.zip master
Отменить все изменения, кроме тех, что уже добавлены в планируемый коммит
Создать новую ветку на сервере из текущей локальной ветки
git config --global push.default current
git push -u
Восстановить удалённый файл
Сначала нужно найти последний коммит, где файл ещё существует:
git rev-list -n 1 HEAD -- имя_файла
Потом восстановить этот файл:
git checkout найденный_коммит^ -- имя_файла
Вернуть один конкретный файл в состояние, в котором он был в каком-либо коммите
Почти как в прошлом примере, только чуть проще:
git checkout идентификатор_коммита имя_файла
Сделать так, чтобы Git игнорировал изменения прав файлов
git config core.fileMode false
Заставить Git помнить пароль при работе с https
Для запоминания на 15 минут:
git config --global credential.helper cache
Можно настроить и более долгий период:
git config --global credential.helper "cache --timeout=XXXX"
Хинт для программистов: если зарегистрируетесь на соревнования Huawei Cup, то бесплатно получите доступ к онлайн-школе для участников. Можно прокачаться по разным навыкам и выиграть призы в самом соревновании.
Перейти к регистрации
Источник
Почему git pull не работает?
Сегодня предположительно я столкнулся с проблемой мерзавца. Уже 1 год я использую git (только команды push и pull ) , и пока все в порядке. Но сегодня эта команда не работает и выдает ошибку:
Кто-нибудь знает в чем проблема и как я могу это исправить?
2 ответа
Проверьте, есть ли у вас главный файл в .git\refs\remotes\origin
Если вы это сделаете, удалите его, а затем попробуйте снова git pull .
В качестве альтернативы просто попробуйте снова клонировать свой репозиторий в другую папку, чтобы посмотреть, не исчезнет ли ошибка.
строка " reference broken " означает, что указанное имя ссылки существует, к нему просто прикреплен неверный хэш-идентификатор SHA-1.
Этого не должно произойти (само название ссылки должно было быть уничтожено), поэтому неясно, как это произошло.
Вы можете увидеть сообщение об ошибке в >>
Эта проверка была введена в Git 2.10 (апрель 2016 г.), в котором упоминалось:
Это использует новую функцию lock_raw_ref() , которая аналогична read_raw_ref() , но получает ссылку на ссылку перед ее чтением.
Это изменение по-прежнему имеет две проблемы:
- Есть избыточные read_ref_full() справочные поиски.
- Все еще возможно получить неправильные reflogs для символических ссылок если есть параллельное обновление другим процессом, так как old_oid symref определяется до того, как блокировка на Ручной.
Проверьте этот вопрос на StackOverflow, который разрешил ту же ошибку:
Чтобы процитировать принятый ответ:
Это случилось со мной, когда мой git remote (bitbucket.org) изменил свой IP-адрес. Быстрое решение было удалить и повторно добавить пульт, а затем все работало как положено. Если вы не знакомы с тем, как удалите и повторно добавьте пульт в git, вот шаги: Скопируйте SSH git URL вашего существующего пульта. Вы можете распечатать его в терминал используя эту команду:
, который распечатает что-то вроде этого:
Удалите пульт из локального репозитория git:
Добавьте пульт обратно в локальный репозиторий.
Источник
Не работает git pull?
Привет.
Я создал удалённый и локальный репозиторий.
Создал в локальном репозитории файл README.md и запушил в удалённый.
Удалил в локальном репозитории файл и хочу его из удалённого вновь вернуть.
Пишу:
Ещё пробовал делать так:
По итогу ничего не меняется.
Почему так?
- Вопрос задан 23 июн.
- 145 просмотров
Ты не удалил файл в локальном репозитории. Ты лишь удалил его из рабочего каталога, в котором лежит копия ветки master. Файл по прежнему остался и в локальном и во внешнем репозитории. Даже больше скажу — файл невозможно удалить из репозитория. Однажды закоммитив файл, он навсегда останется в истории и в любой момент его можно вытащить оттуда. Удалить файл можно только из какой-то версии ветки.
Хочешь восстановить? Восстанови! Git тебе даже подсказку написал какой командой файл восстановить.
Нет никакой нужды скачивать что-то с внешнего репозитория. Already up to date означает что ветка master в локальном репо полностью идентична ветке master вышестоящего репозитория.
Потому что pull тянет новые коммиты с удаленного репозитория. Коммитов там новых нет.
Удалил в локальном репозитории файл и хочу его . вернуть.
use "git restore . " to discard changes in working directory
Источник
Не работает git pull?
Привет.
Я создал удалённый и локальный репозиторий.
Создал в локальном репозитории файл README.md и запушил в удалённый.
Удалил в локальном репозитории файл и хочу его из удалённого вновь вернуть.
Пишу:
Ещё пробовал делать так:
По итогу ничего не меняется.
Почему так?
- Вопрос задан 23 июн.
- 145 просмотров
Ты не удалил файл в локальном репозитории. Ты лишь удалил его из рабочего каталога, в котором лежит копия ветки master. Файл по прежнему остался и в локальном и во внешнем репозитории. Даже больше скажу — файл невозможно удалить из репозитория. Однажды закоммитив файл, он навсегда останется в истории и в любой момент его можно вытащить оттуда. Удалить файл можно только из какой-то версии ветки.
Хочешь восстановить? Восстанови! Git тебе даже подсказку написал какой командой файл восстановить.
Нет никакой нужды скачивать что-то с внешнего репозитория. Already up to date означает что ветка master в локальном репо полностью идентична ветке master вышестоящего репозитория.
Потому что pull тянет новые коммиты с удаленного репозитория. Коммитов там новых нет.
Удалил в локальном репозитории файл и хочу его . вернуть.
use "git restore . " to discard changes in working directory
Источник
Git для начинающих. Урок 6.
git push и git pull
Видеоурок
Конспект урока
Краткое содержание урока, основные инструкции для командной строки, полезные ссылки и советы.
Во втором уроке мы создавали репозитории на github и научились клонировать их. После этого мы работали только с локальным репозиторием, на своей машине. Сегодня мы рассмотрим взаимодействие с удаленным репозиторием.
Что такое push (пуш)
Это отправка данных на сервер, в удаленный репозиторий, на github. Данные - это коммиты и ветки.
Зачем пушить на сервер
- для работы в команде, чтобы делиться своим кодом с коллегами
- чтобы иметь резервную копию на случай потери данных на своей машине
Когда пушить на сервер
Когда сделали новый коммит или несколько коммитов
Как узнать, что есть незапушенные коммиты
В командной строке набрать git status
Ключевая фраза здесь "Your branch is ahead of 'origin/master' by 5 commits.". Это значит, что у нас есть 5 неотправленных на сервер коммитов. Если незапушенных коммитов нет, то картина будет такая
"is up-to-date" означает, что у нас нет незапушенных коммитов
В PhpStorm понять, есть ли неотправленные коммиты, можно посмотрев в окно Version Control - Log, где находятся метка master и origin/master. Если master выше, то есть незапушенные коммиты.
master и origin/master
Это ветки: локальная и удаленная (на сервере, в github). По умолчанию мы находимся в ветке master. Подробно работу с ветками мы рассмотрим в следующем уроке, а пока достаточно запомнить, что master - это то, что на нашей машине, а origin/master - в удаленном репозитории, на github.
git push в терминале
- push - что сделать, отправить
- origin - куда, на сервер
- master - что, ветку master
Как пушить в PhpStorm
Правый клик - Git - Repository - Push. - Кнопка Push
Что такое pull (пулл)
Это скачивание данных с сервера. Похоже на клонирование репозитория, но с той разницей, что скачиваются не все коммиты, а только новые.
Зачем пулиться с сервера
Чтобы получать изменения от ваших коллег. Или от себя самого, если работаете на разных машинах
git pull в терминале
- pull - что сделать, получить данные
- origin - откуда, с сервера
- master - а точнее, с ветки master
Как пулить в PhpStorm
Правый клик - Git - Repository - Pull. - Кнопка Pull
Когда что-то пошло не так.
Иногда при работе в команде git push и git pull могут вести себя не так, как пишут в учебниках. Рассмотрим примеры
git push rejected
Вы сделали новый коммит, пытаетесь запушить его, а git в ответ выдает такое
Написано много, но суть в том, что коммит отклонен, пуш не прошел. Почему?
Git устроен так, что локально мы можем коммитить сколько угодно. Но прежде чем отправить свои коммиты на сервер, то есть запушить, нужно подтянуть новые коммиты с сервера. Те самые, которые успели сделать наши коллеги. То есть сделать git pull.
Когда мы делаем git push, git сначала проверяет, а нет ли на сервере новых коммитов. Если они есть, то git выдает то самое сообщение - git push rejected. Значит, нам нужно сначала сделать git pull, а затем снова запушить
Здесь нас подстерегает неожиданность - в терминале выскакивает окно редактирования коммита. Пока просто сохраним, что предложено по умолчанию и закроем редактор. Вот теперь можно пушить свои коммиты
Все, наши коммиты на сервере. При этом появится странный коммит "Merge branch 'master' of github.com:Webdevkin/site-git". Это так называемый мердж-коммит, о нем чуть ниже.
Если же при попытке пуша новых коммитов на сервере нет, то git push пройдет сразу и отправит наши коммиты на сервер.
Как избавиться от мердж-коммита
Мердж-коммит появляется, когда вы сделали локальный коммит, а после этого подтянули новые коммиты с сервера. Мердж-коммит не несет смысловой информации, кроме самого факта мерджа. Без него история коммитов выглядит чище.
Чтобы избавиться от него, подтягивайте изменения командой git pull с флажком --rebase
При этом ваш локальный коммит окажется "поверх" нового коммита с сервера, а мердж-коммита не будет. И не забудьте после этого запушить свой коммит на сервер.
Мердж-коммит в PhpStorm
PhpStorm помогает избавиться от мердж-коммитов через меньшее количество действий. Если мы запушим локальные коммиты и получим rejected из-за того, что на сервере есть новые коммиты, то PhpStorm выдаст предупреждение, где предложит выбрать вариант: как подтянуть новые коммиты, с мерждем или ребейзом. Жмите кнопку "Rebase", мердж-коммита не будет и при этом локальный коммит сразу запушится на сервер.
Что могу посоветовать
Если мы работаем в одиночку, то удаленный репозиторий нужен только для сохранения резевной копии. Скорее всего, мы будем в него только пушить.
Но при работе в команде имеет смысл подумать над такими вещами:
- пушить коммиты почаще, чтобы коллеги быстрее получали доступ к новым изменениям
- пулиться почаще - обратная ситуация, почаще получать свежие изменения
- всегда пультесь с флажком ребейза - git pull --rebase origin master
- не удивляйтесь, что при пуллах и пушах могут возникать подобные ситуации, как мы рассматривали выше
- не стесняйтесь спрашивать коллег, если увидели незнакомую ситуацию
- больше практикуйтесь. Посадите домашний проект на git и работайте с ним
Не переживайте, если иногда будете чувствовать себя, как друзья ниже. Это нормально, новый инструмент не осваивается за 5 минут. Немного практики, и мы будем понимать, почему иногда git ведет себя не так, как хочется, и главное, будем понимать, как это исправить.
В следующем уроке мы узнаем, что такое ветки и будем активно работать с ними. Там мы будем активно использовать git push и git pull, и это поможет закрепить уже пройденный материал.
Источник