*.[oa] # игнорить все файлы с расширением .o и .a
!*.a # отслеживать даже если попал в список выше
*.zip # игнорить все .zip
/TODO # игнорить только в корневой папке, но не вложенных
build/ # игнорить все файлы в каталоге build
doc/**/*.txt # игнорить все файлы txt в каталоге doc
Просмотр изменений
git diff
Посмотреть все
git diff --staged
Посмотреть индексированные
Коммит
git commit
Во внешнем текстовом редакторе, для ввода многострочных комментариев
Получение изменений из репы. Ветка master теперь у нас виден как origin/master
git pull
Получили изменений, при этом сразу делается попытка слияния (!). То же самое что git fetch, git merge.
Настройка: git config --global pull.rebase "true"
git push origin master
Отправка ветки master в репу origin
git remote show origin
Расскажет подробно какие ветки там живут и какие ветку и куда будут посланы при git push и git pull
git remote rename old_repo new_repo
Переименование удаленной репы. old_repo/master станет new_repo/master
git remote remove my_repo
Удаление репы
Работа с тегами
git tag
Посмотреть список тегов
git tag -a v1.4 -m "Версия 1.4"
Создать тег v1.4
git tag v1.4
То же самое, создать тег v1.4 но без описания
git tag -d v1.4
Удалить тег
git push origin v1.4
Отправить тег v1.4 в удалённую репу (он не передается сам)
git push origin --tags
Отправить все теги в удалёную репу
git push origin --delete v1.4
Удалили тег из удалённой репы
git checkout -b version1.3 v1.2
Загрузить с тэга v1.2 и создать + переключиться в ветку version1.3
Список веток разработки
git branch
* - покажет HEAD
git branch --all
включая на сервере в репах
git branch -v
с инфой о последних коммитах
git branch --merged
только слитые с текущей
git branch --no-merged
неслитые с текущей
Новая ветка, переключение на ветку
git branch test2
создали новую ветку test2, HEAD указывает на текущий коммит (например master)
git log --oneline --decorate
посмотрели куда указыает HEAD
git checkout test2
переключились на ветку test2, HEAD теперь указывает на test2
git switch test2
новый синтаксис вместо checkout
git switch -c test2
Создать ветку test2 и переключится на неё
git checkout -b test2
Создать ветку test2 и переключится на неё (старый синтаксис)
Переименование ветки
git branch --move old-name new-name
Перерименовали локально
git push --set-upstream origin new-name
Отправили новое имя на сервер
git push origin --delete old-name
Удалили старое имя с сервера
git branch -move master main
Переименование главной ветки. ВНИМАНИЕ: скорее всего сломает настроенный CI/CD на сервере, не надо так делать
Статус отслеживания веток
git branch -vv
Список локальных отслеживаемых веток и инфа о состоянии
Удаление ветки на сервере
git push origin --delete fix19803
Удалили на сервере ветку fix19803
Слияние веток (merge)
git checkout master
Сначала перешли на ветку master, куда и будем сливать
git merge hotfix
fast-forward: master и hotfix указывают на один коммит, без нового коммита слияния.
Если с коммитом слияния и возник конфликт, то выдаст ошибку и пометит в исходниках где и что отличается
git merge @{u}
Слить c апстримом (аналог, например вместо git merge origin/master)
git branch -d hotfix
Теперь можно удалить ветку hotfix т.к. она больше не нужна
git mergetool
Для разрешения конфликтов слияния
Перебазирование (rebase)
Команда rebase вместо слияния последовательно применяет коммиты из текущей ветки разработки к другой ветке.
Смысл в том, чтобы видеть линейную историю разработки и все коммиты без ветвлений.
НЕ ДЕЛАТЬ ПЕРЕМЕЩЕНИЯ КОММИТОВ, УЖЕ ОТПРАВЛЕНЫХ НА СЕРВЕР В РЕПУ!!!
ИНАЧЕ ДРУГИМ РАЗРАБОТЧИКАМ ПРИДЕТСЯ ЗАНОВО СЛИВАТЬ СВОИ РАЗРАБОТКИ И ДЕЛАТЬ git pull --rebase
Пример последовательности действий:
git checkout fix19803
Переключились на ветку fix19803
git rebase develop
добавили коммиты из ветки fix19803 в хвост к develop
git checkout develop
Переключились на ветку develop
git merge fix19803
Передвинули develop на fix19803
Каскадное перебазирование из дерева веток:
git rebase --onto develop branch1 branch2
Переключить на branch2, найти изменения относительно branch1 и прицепить их на
develop, но при этом коммиты из branch1 не добавляется к develop