Мой Справочник | 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>

Влить изменения определенного коммита в текущую ветку