Мой Справочник | Git
Настройка:
git config --list
Показывает список конфигураций
git config --global user.name "Username"
Установить глобальное имя пользователя
git config --global user.email "user@email.com"
Установить глобально адрес почты пользователя
git config --global push.default simple
Настройка команды git push. Будет пушить только в текущую ветку
git help <git_command>
Справочник для отдельных гит-команд
Репозиторий:
git init (--bare)
Создать (только для истории, без файлов)
git clone <path> (.)
Склонировать (в текущую директорию)
git remote add <rep_name> <path>
Привязать удаленный репозиторий
git remote rm <rep_name>
Отвязать удаленный репозиторий
git remote -v
Посмотреть привязанные репозитории
Ветки:
git branch (-v)
Показать все ветки репозитория (с инфой), текущую ветку
git branch <branch_name>
Создать новую ветку
git checkout <branch_name>
Переключиться в указанную ветку
git checkout (-b) <branch_name>
Создать новую ветку (и сразу переключиться в неё)
git checkout -b <branch_name> <commit_hash>
Создать новую ветку (и сразу переключиться в неё) от указанного коммита
git branch -d (-D) <branch_name>
Удалить указанную ветку (принудительно)
git merge <branch_name> (--ff-only)
Сделать слияние указанной ветки с текущей (принудительно)
git merge --abort
Отменить слияние
Изменения:
git status
Статус файлов
git add <filename> <filename2> (.)
Добавить указанные (все) измененные файлы к коммиту
git checkout <filename> <filename2>
Убрать указанные измененные файлы из коммита
git checkout <filename> <commit_hash>
Вернуть состояние файла, какое оно было в указанном коммите
git checkout -- .
Убрать измененния во всех файлах
git reset HEAD <filename>
Если случайно добавили файл, а потом решили, что нужно его убрать из коммита, но при этом не удалять в нём изменения
git rm (--cached) <filename>
Удалить файл из коммита и с диска (не удалять с диска), если случайно добавили ненужный файл в коммит и закоммитили его, далее выполнить команду ниже
git commit --amend --no-edit
Измнить последний коммит, без изменения сообщения, если удалялись или изменялись файлы в коммите
git commit -m "<commit_message>"
Создать коммит
git commit --amend -m "<commit_message>"
Измнить коммит-сообщение
git diff <filename>
Посмотреть непроиндексированные изменения (до git add)
git diff --staged <filename>
Посмотреть проиндексированные изменения (после git add)
git log (-3)
Получить список коммитов до текущего (последних трёх)
git log --oneline
Получить список коммитов до текущего в одну строку
git log --all
Получить всю историю (не только до текущего)
git log --oneline --all --graph
Получить всю историю (с графиком)
git show <commit_hash>
Посмотреть какие были изменения в этом коммите
git cat-file -p <commit_hash>
Посмотреть информацию о коммите
git checkout <commit_hash>
Переключиться в указанный коммит
git checkout <branch_name>
Переключиться в последний коммит указанной ветки
git reset <commit_hash> (--hard)
Сбросить историю до указанного коммита (принудительно)
Отправка / Принятие:
git pull <remote_name> <branch_name>
Принять изменения
git push <remote_name> <branch_name>:<remote_branch_name> (-f)
Отправить изменения (принудительно)
Rebase:
Перебазирование ветки, сдвигаем первый коммит дочерней ветки в состояние последнего коммита родительской.
Актуально, когда родительская ветка наполниласть новыми коммитами после создания дочерней ветки и при этом перебазировании можно заблаговременно исправить все конфликты, находясь в дочерней ветке.
git checkout <parent_brunch_name>
1. Переключаемся в родительскую ветку
git pull origin <parent_brunch_name>
2. Забираем все новые коммиты
git checkout <child_brunch_name>
3. Переключаемся в дочернюю ветку
git rebase <parent_brunch_name>
4. Перебазируемся в родительскую ветку. При этом могут возникать конфликты, которые нужно разрешать
git add <conflict_file_name>
5. Разрешаем конфликты, сохраняем, добавляем разрешенные файлы в отслеживание
git rebase --continue
6. Продолжаем перебазирование (5 и 6 пункты могут повторяться несколько раз)
git push origin -f
7. Если все конфликты решены и перебазирование закончено, то можно форсированно пушить изменения дочерней ветки
Squash commits:
Схлопывание нескольких коммитов в один.
Актуально, когда мы имеем много непонятных коммитов в процессе разработки и хотим оставить один понятный, когда работа по созданию нового функционала уже закончена, и при этом в истории останется один понятый коммит.
git rebase -i <parent_brunch_name>
1. Делаем ребейз ветки (интелектуальный), возможны моменты, описанные выше.
1. pick
2. pick -> s
3. pick -> s
...
10. pick -> s
2. Меняем в vim pick -> s (или squash), кроме первого коммита
"Add new feature"
3. Пишем финальный commit-message
git push origin -f
4. Форсированно пушим эти изменения
Cherry pick:
git cherry-pick <commit-hash>
Влить изменения определенного коммита в текущую ветку