Самые типичные ошибки и вопросы, связанные с Git, и удобные способы их решения

Если вы хотите получше узнать те части Git, про которые раньше боялись спросить, то этот список для вас. Тут собраны наиболее типичные ситуации и способы их решения как из личного опыта автора, так и собранные по всему Интернету.
Ошибка в комментарии к коммиту
Если коммит ещё не был отправлен на сервер (push), то можно воспользоваться простой командой, позволяющей редактировать текст сообщения к последнему коммиту:
Как отменить последний коммит?
Можно использовать git reset
, вот так:
HEAD~1 означает один коммит до HEAD, т.е. до текущего положения. Стоит заметить, что это «ядерный» способ, который отменит все изменения. Если вам нужно сохранить всё, что вы сделали, но еще не успели закоммитить, используйте:
Удалить ветку на сервере
В чём разница между «git pull» и «git fetch»?
git pull
— это, по сути, git fetch
, после которого сразу же следует git merge
. git fetch
получает изменения с сервера и сохраняет их в refs/remotes/
. Это никак не влияет на локальные ветки и текущие изменения. А git pull
вливает все эти изменения в локальную копию.
Как отменить «git add» до коммита?
Вы выполнили git add имя_файла
случайно и хотите отменить добавление файла. Если коммит ещё не был сделан, то поможет:
Как разрешать конфликты слияния?
Используйте программу git mergetool
, которая предоставляет удобный интерфейс для разрешения конфликтов.
Удалить все локальные файлы и директории, которые не отслеживает Git, из вашей текущей копии
Осторожно! Лучше сделайте перед этим бэкап.
Клонировать все ветки с сервера
Скорее всего, вы это уже сделали, а ветки просто скрыты. Вот команда, чтобы показать их:
Можно использовать git checkout origin/имя_ветки
, чтобы посмотреть на нужную ветку. Или git checkout -b имя_ветки origin/имя_ветки
, чтобы создать локальную ветку, соответствующую удалённой.
Переименовать локальную ветку
Вернуться к любому коммиту
Можно использовать git reset
, как показано ранее. Это будет означать, что вы хотите навсегда вернуться к тому состоянию, в котором вы были, а не просто посмотреть на него (для этого надо сделать checkout). Идентификатор коммита должен быть такой, какой прописан в выводе команды git log
.
Ещё раз повторим: команда отменит все текущие изменения, так что убедитесь, что вам это действительно нужно. Или используйте --soft вместо --hard.
Удалить подмодуль (submodule)
Создание подмодулей используется довольно редко, но иногда они всё-таки встречаются. Вот, что вам нужно:
Перезаписать локальные файлы во время git pull
Вам снова поможет git reset
:
Как добавить пустую директорию в репозиторий?
Никак! Такая возможность просто не поддерживается, т.к. считается, что вам это не нужно. Но есть один трюк. Можно создать файл .gitignore
в нужной директории со следующим содержимым:
Экспортирование исходников аналогично «svn export»
Используйте git archive
, например, так:
Отменить все изменения, кроме тех, что уже добавлены в планируемый коммит
Создать новую ветку на сервере из текущей локальной ветки
Восстановить удалённый файл
Сначала нужно найти последний коммит, где файл ещё существует:
Потом восстановить этот файл:
Вернуть один конкретный файл в состояние, в котором он был в каком-либо коммите
Почти как в прошлом примере, только чуть проще:
Сделать так, чтобы Git игнорировал изменения прав файлов
Заставить Git помнить пароль при работе с https
Для запоминания на 15 минут:
Можно настроить и более долгий период:
Перевод статьи “Most common git screwups/questions and solutions”