работа с Git

развернуть
https://github.com/git/git
https://githowto.com/ru
https://git-scm.com/book/ru/v2
http://learngitbranching.js.org/
http://www-cs-students.stanford.edu/~blynn/gitmagic/intl/ru/ch02.html
Справочник предопределенных переменных CI/CD
Ежедневная работа с Git
Работаем с Git: первые шаги в GitHub
Удачная модель ветвления для Git
Эффективное использование Github
Шпаргалка с основными командами для Git
19 советов по повседневной работе с Git
Git Rebase: руководство по использованию
Подробное введение в работу с Git
GIT: Инструкция-шпаргалка для начинающих
Git на сервере - Генерация открытого SSH ключа
https://webhamster.ru/mytetrashare/index/mtb0
Как работать с системой GIT: делимся опытом
Шпаргалка по работе с командами git
Git Rebase: руководство по использованию
Git: Восстановить удаленную (удаленную) ветку
Можно ли восстановить ветку после ее удаления в Git?
Как удалить все удаленные ветки git, которые уже были интегрированы?
Откат ошибочной команды git push --force
Как использовать git с несколькими удалёнными репозиториями
git bisect: путешествие по времени и багам
Git Rebase: руководство по использованию
https://dangitgit.com/ru — некоторые простые рецепты для git
Как выложить свой проект на GitHub.com
Как настроить собственный сервер Git
Как настроить свой сервер Gitlab
Создание сайта на github.io с помощью Landing Pages Framework
Создаем свой персональный сайт на Github
https://docs.gitlab.com/ee/ci/
Введение в GitLab CI
Руководство по CI/CD в GitLab для (почти) абсолютного новичка
Настройка GitLab CI/CD
Devcolibri Базовый курс по Git
https://www.youtube.com/playlist?list=PLIU76b8Cjem5B3sufBJ_KFTpKkMEvaTQR
Dmitry Afanasyev Git. Система контроля версий. Видеокурс
https://www.youtube.com/playlist?list=PLoonZ8wII66iUm84o7nadL-oqINzBLk5g
Илья Кантор JavaScript.ru Git: курс
https://www.youtube.com/playlist?list=PLDyvV36pndZFHXjXuwA_NywNrVQO0aQqb
Илья Кантор JavaScript.ru Git: разное
https://www.youtube.com/playlist?list=PLDyvV36pndZEB7kWWocU4QSn-G78LoaEE
Самоучитель
https://learngitbranching.js.org/?locale=ru_RU
Тренажёр
https://git-school.github.io/visualizing-git/
Git-шпаргалка
частые команды
https://docs.gitlab.com/ee/ssh/
ssh-keygen -t rsa -C "email@example.com"
nano ~/.ssh/config
cat ~/.ssh/id_rsa.pub
ssh -T git@gitlab.com
Git global setup
git config --global user.name "user123"
git config --global user.email "user123@example.com"
git config --list
-------------------------------------------------------------------------------------
Создание локального репозитория
git clone [url, например, https://tau.home.local/user/test_project.git] dir_name — создать локальную копию репозитория в каталоге dir_name.
склонировать ТОЛЬКО конкретную ветку
git clone --branch=branch-name https://github.com/project.git
склонировать репозиторий без многолетней истории его коммитов, тогда нужно использовать параметр --depth=5, где 5 - количество коммитов от последнего:
git clone --depth=1 --branch=branch-name http://whatever.git
склонировать ветку и загрузить субмодули
git clone --branch=bookworm --recurse-submodules https://github.com/sonic-net/sonic-buildimage.git
Работа с удаленным репозиторием
git remote — просмотр списка настроенных удаленных репозиториев.
git remote add [shortname] [url] — добавить удаленный репозиторий и присвоить ему имя.
git remote rename [shortname] [new_shortname] — изменить короткое имя.
git fetch [shortname] — загрузка изменений из удаленного репозитория.
git push [remote-name] [branch-name] — выгрузка изменений в удаленный репозиторий.
git pull [remote-name] [branch-name] — загрузка изменений с заданной ветки репозитория.
git fetch --all --prune — получить список актуальных веток
git remote show [remote-name] — просмотр состояния удаленного репозитория.
git remote rm [shortname] — удалить удаленный репозиторий из списка.
git push origin --delete — удалить ветку удаленного (т.е. не локального) репозитория
git tag --delete имя_тега — удалить тег
git push -f ветка — принудительное изменение ветки удаленного (т.е. не локального) репозитория
git config --local --get remote.origin.url - получить адрес удалённого репозитория
git fetch --prune origin - удалит устаревшие ветки, которые у вас есть локально
Коммиты
Обратите внимание: коммиты делаются в локальную копию репозитория. Указанные команды НЕ загружают изменения на сервер. Для изменения удаленного репозитория используйте git push.
git add список_файлов — добавить файлы в индекс ( поставить их под версионный контроль). Обычно делается перед коммитом.
git commit -m «Комментарий к коммиту» — сделать коммит файлов из индекса.
git commit -a -m «Комментарий к коммиту» — добавить измененные файлы в индекс и сделать коммит
git commit --amend — исправление последнего сообщения о фиксации
git commit --amend --no-edit — исправление коммита Применяйте команду лишь для коммитов в локальной ветки
изменение коммитов
не изменяйте ваш последний коммит, если вы уже отправили её в общий репозиторий.
git commit --amend -m "Новое название" — Изменение названия последнего коммита
git rebase -i r reword — переименовать коммит e edit изменить коммит s squash склеить два или больше коммитов
git rebase --continue — выполнить после успешного коммита
git ls-remote — Полный список удалённых ссылок
git fetch — получает с сервера все изменения, которых у вас ещё нет, но не будет изменять состояние вашей рабочей директории
быстро обновить коммит в удалённом репозитории
git commit --amend
git push --force origin ветка
Отмена коммита или операции
git checkout – имя_файла — отмена изменений из измененного файла.
git reset имя_файла — удаление добавленного (но не закоммиченного) файла из индекса.
git commit –amend — команда для изменения коммита.
git reset --hard HEAD~1
git rebase коммит --onto master — изменения идут с этого коммита
git revert коммит — укажите хэш коммита, который хотите отменить
Git создаст изменения, имеющие прямо противоположный эффект по сравнению с изменениями, содержащимися в этом исходном коммите
git revert коммит --no-commit — если необходимо проверить эти изменения и зафиксировать их вручную
git checkout [сохранённый хеш] -- путь/к/файлу — отменить изменения в файле
git reflog — посмотреть где находился указатель HEAD в любой момент времени
git reset --hard HEAD@{index} — вернуться туда, когда всё работало
Работа в локальном репозитории
git checkout -b новая_ветка origin/ветка_из_репозитория — создание новой локальной ветки
git branch -a — посмотреть все ветки
git branch -r — посмотреть ветки в удалённом репозитории
git branch -d — удалить ветку
git branch -D — удалить принудительно ветку
git status — определение состояния файлов.
git add список_файлов — добавить файлы в индекс ( поставить их под версионный контроль).
git add . — добавить все файлы в индекс
git diff — просмотр сделанных изменений.
git diff -staged — сравнение проиндексированных изменений с последним коммитом.
git rm имя_файла — удаление физически удаленного файла из индекса.
git rm –cached имя_файла — удаление файла из индекса ( из версионного контроля ) без физического удаления.
git rebase master server — Это повторит работу, сделанную в ветке server поверх ветки master
git cherry-pick — для бекпортирования отдельных изменений в долгоживущие ветки
git diff ветка1 ветка2 — для ревью изменений между версиями ветки
git diff origin/ветка ветка_после_черрипика
git bisect — для бинарного поиска коммита, вносящего баг
см https://git-scm.com/book/ru/v2/Инструменты-Git-Обнаружение-ошибок-с-помощью-Git
получить разницу коммитов меж ветками
git log --oneline "origin/ветка1..origin/ветка2"
git log --oneline "origin/ветка2..origin/ветка1"
Просмотр истории
git log — выдает список коммитов, сделанных в репозитории.
git log -p — выдает список коммитов с просмотром изменений, сделанных в каждом коммите.
git log -p filename — найти в каких фиксациях изменялся файл и что именно было изменено
git log -stat — выдает список коммитов с просмотром краткой статистики изменений.
git log -pretty=… — выдает список коммитов, изменяя формат вывода.
git log -since=… — выдает список коммитов с ограничением по времени. Например, 2.weeks — коммиты за последние 2 недели.
git log -число — выдает указанное число коммитов.
git log --oneline -n 3 — вывести три верхних коммита
git log --pretty=format:"%h %s" --graph
git log --graph --left-right --cherry-pick --oneline master
Предосмотр
https://www.amitmerchant.com/git-commands-that-you-can-dry-run-before-actually-running-them/
опция --dry-run покажет, что она будет делать, прежде чем фактически запустить команду
git add . --dry-run — покажет что будет проиндексировано
git clean -df --dry-run — покажет что будет удалено
git commit --short --dry-run — кратко покажет что будет зафиксировано
git commit --long --dry-run — более подробно покажет что будет зафиксировано
git mv --dry-run — покажет какие файлы будут перемещены
Откат
git reflog — показывает журнал ссылки, предоставленной в командной строке (или HEAD, по умолчанию)
git reset HEAD@{index} — делаем откат изменений в репозитории до состояния index
git checkout master — Выбираем нужный бранч(ветку)
git reset --hard HEAD~2 — делаем откат изменений в репозитории для примера на два коммита назад
git reset --hard HEAD hash — Можно сделать до какого то определенного коммита по хешу
git reset HEAD myfilename — Отменяем индексирование файла
git clean -f — отображает файлы, подлежащие удалению
git clean -n — Удаляем неотслеживаемый файл
git reset --hard — сбрасывает индекс и рабочее дерево
git clean -f -d -x — удаляет все изменеия и все неотслеживаемые файлы, включая продукты сборки
git push -f origin master — делаем принудительный коммит в основной репо на гитхабе
git revert — отменить локально и отправить это изменение в удаленную ветку
rm -rf .git — Отменяем git init
восстановление
git fsck --lost-found — обзор оборванных коммитов
git show коммит — посмотреть содержание коммита
git rebase коммит — наложение коммитов поверх другого базового коммита
git reflog — журнал ссылки
git cherry-pick коммит — применить изменение коммита в ветку
git reset
–hard — заставляет весь контент соответствовать коммиту, к которому вы сбрасываете (ресетите)
git reset --hard означает git reset --hard HEAD, то есть, не изменяя ветку, избавиться от всех локальных изменений.
–mixed — это опция по умолчанию, то есть git reset означает git reset --mixed. Эта команда сбрасывает индекс, но не рабочее дерево
для изменений нужно проиндексировать, т.е. git add .
--soft не изменяет индекс или рабочее дерево. Все ваши файлы остаются нетронутыми, как если бы вы использовали --mixed, но все изменения показываются как готовые к коммиту во время выполнения
–merge — эта опция добавлена в git относительно недавно, ее предназначение — прервать неудачное (failed) слияние (merge)
HEAD~ — это сокращенная запись HEAD~1 и означает первого родителя коммита. HEAD~2 означает первого родителя у первого родителя коммита. HEAD~n можно понимать как «n коммитов перед HEAD» или «n-ый предок HEAD».
HEAD^ (или HEAD^1) тоже означает первого родителя коммита. Но вот HEAD^2 означает второго родителя коммита
изменения
git stash — спрятать изменения
git stash -u — спрятать неотслеживаемые файлы
git stash -a — включить изменения в игнорируемые файлы
git stash pop — вернуть спрятанные изменения
git stash list — посмотреть весь список stash
git stash show — команда покажет файлы из последнего stash
git stash show -p — покажет какие изменения лежат в stash
git stash show -p stash@{5} — узнать какие изменения в git stash под конкретным номером
git stash apply — как и
git stash apply stash@{0} — применяет последний stash
git stash apply stash@{5} — внесёт изменения, которые хранятся в стэке под 5-ым номером
git stash clear — удалит все сохранённые в git stash состояния, безвозвратно
git stash drop — удалить один последний сохранённый git stash
git stash drop stash@{NUMBER} — очистить определённый stash по его номеру
создаем сабмодуль:
git submodule add --force gitlab:/репа/пакет.git папка_субмодуля
git submodule sync
git submodule update --init --remote
обновить субмодуль адрес и версию
vim .gitmodules
git config --file=.gitmodules -e
git submodule sync
git submodule update --remote
git submodule update --init --recursive --remote
git submodule update --recursive --remote
если не грузится субмодуль
git submodule init
git submodule update --remote
git reflog show HEAD
git reflog --relative-date
git reflog --no-abbrev
git fsck --full --no-reflogs | grep commit
git reset --hard your_deleted_commit
git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\ -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt
find . -ctime -12h -type f | sed 's/[./]//g' | git cat-file --batch-check | grep commit
git cat-file -p <your commit>
git log -p <your commit>
git branch commit_rescued <your commit>
git checkout -b <branch> <sha>
git branch -m <restored branch> <final branch>
git stash — положить во временное хранилище все отслеживаемые файлы.
git stash pop — восстановить последние файлы, положенные во временное хранилище.
git stash list — список всех сохраненных изменений во временном хранилище.
git stash drop — удалить последние файлы, положенные во временное хранилище.
git-resurrect <name>
git stash save
git merge origin/master
git stash pop
gitk --reflog
git rebase -i HEAD~n
git reset HEAD^
git reset HEAD~1 --hard
откат
git reflog - выведет все список всех действий
git reset HEAD@{index}
git checkout master - Выбираем нужный бранч(ветку)
git reset --hard HEAD~2 - делаем откат изменений в репозитории для примера на два коммита назад
git reset --hard HEAD hash - Можно сделать до какого то определенного коммита по хешу
git reset HEAD myfilename - Отменяем индексирование файла
git clean -f - отображает файлы, подлежащие удалению
git clean -n - Удаляем неотслеживаемый файл
git push -f origin master - делаем принудительный коммит в основной репо на гитхабе
rm -rf .git - Отменяем git init
найти ближайший коммит по дате
git log --oneline --before='2021-01-20' -1
https://overcoder.net/q/13265/как-выборочно-объединить-или-выбрать-изменения-из-другой-ветки-в-git
git diff origin/master origin/master123 files - сравнить файл из разных веток
Если нужно отменить изменения в отдельном файле, то подойдет команда git checkout имя_файла
git checkout 3f25701874aa5a2c16cc6275fa30baa5b6e477a6 имя_файла
git merge --no-ff --no-commit -s ours branchname1
git checkout --patch exp1 file_to_merge
git diff branch_b > my_patch_file.patch
git apply -p1 --include=pattern/matching/the/path/to/file/or/folder my_patch_file.patch
Если вы не хотите объединять file1 и хотите сохранить версию в текущей ветке
git checkout HEAD file1
Если вы не хотите объединять file2 и хотите только версию в branchX
git checkout branchX file2
проверить, как было выполнено слияние, запустив git diff --cached
git diff --cached file1
quit — выходит из интерактивной консоли;
git commit --amend
git rebase --continue
git log --pretty=format:"%h %s" --graph
git log --graph --left-right --cherry-pick --oneline master
git branch -m new-name - переименовать ветку
git branch -m old-name new-name
git push origin :old-name new-name переименовать удалённую ветку
быстрый способ:
git push origin -u new-name
git branch -m old_branch new_branch # Rename branch locally
git push origin :old_branch # Delete the old branch
git push --set-upstream origin new_branch # Push the new branch, set local branch to track the new remote
изменение коммитов
не изменяйте ваш последний коммит, если вы уже отправили её в общий репозиторий.
git commit --amend -m "Новое название" - Изменение названия последнего коммита
git rebase -i r reword переименовать коммит e edit изменить коммит s squash склеить два или больше коммитов
git rebase --continue - выполнить после успешного коммита
git ls-remote - Полный список удалённых ссылок
git fetch - получает с сервера все изменения, которых у вас ещё нет, но не будет изменять состояние вашей рабочей директории
git stash для временного сохранения изменений
git rebase -i для причёсывания коммитов во время разработки
git reset во всех своих ипостасях (откат, разбиение коммитов, и т. д.)
git reflog для отката своего репозитория, если случайно ветку
git cherry-pick для бекпортирования отдельных изменений в долгоживущие ветки
git diff origin/ветка ветка_после_черрипика
git range-diff для ревью изменений между версиями ветки
git bisect для поиска коммита, вносящего баг
git revert для отката изменений, вносящих баги
git log -S для поиска коммита по диффу
git rerere для особо долбанутых мерджей с конфликтами
git revert коммит - откатить коммит (коммит обратный этому)
git name-rev --name-only $(git branch | cut -d ' ' -f 5 | tr -d ')')
git name-rev --name-only $(git branch | cut -d ' ' -f 5 | tr -d ')') |cut -d '/' -f 3
git describe
git show-branch |cut -d ' ' -f 1 |tr -d '[' |tr -d ']'
5 малоизвестных Git-приёмов
1⃣ git reflog — история всех ваших шагов
Не только коммиты, но и переключения веток, сбросы и прочие «хаки»:
git reflog
# вернёт список всех HEAD-перемещений
git checkout HEAD@{3}
# вернёт вас на три шага назад
2⃣ git rerere — повторное разрешение конфликтов
Если в одной и той же точке вы часто сталкиваетесь с конфликтами, включите rerere:
git config —global rerere.enabled true
# при повторном конфликте Git запомнит ваше решение
3⃣ git bisect — автоматический поиск «битого» коммита
Когда баг появился неясно где, let Git do the detective work:
git bisect start
git bisect bad # текущая версия с багом
git bisect good v1.0 # последний рабочий тег
# Git сам предложит вам протестировать промежуточные коммиты
4⃣ git stash push -m — храни временные изменения с заметкой
Чтобы не забыть, зачем вы сохраняете рабочие правки:
git stash push -m "WIP: эксперимент с OAuth"
git stash list
# будет видно вашу подпись
5⃣ git worktree — несколько рабочих копий одного репозитория
Для одновременной работы над фичами и багфиксами без переключений:
git worktree add ../my-feature-branch feature/X
cd ../my-feature-branch
# у вас рядом две папки: main и my-feature-branch
-------------------------------------------------------------------------------------
формируем ветку open-source
git checkout master
# COMMIT_SHA - хэш коммита, который соотвествует исходникам наиболее близким к текущей ванильной версии
git checkout COMMIT_SHA
git checkout -b open-source
git push origin open-source
коммитим новую версию
git rm -rf .
cp -rfvP --preserve=all NEW/SRC/PATH/. ./
git add -f .
git commit -m "version NEW_VERSION"
git push origin open-source
создаём тэг ванильных исхоников новой версии
git tag -a -m "vanilla version NEW_VERSION" vNEW_VERSION-vanilla
git push origin vNEW_VERSION-vanilla
создаём ветку для обновления master
git checkout master
git checkout -b upgrade-NEW_VERSION
git merge vNEW_VERSION-vanilla
git commit -m "update with version NEW_VERSION"
git push origin upgrade-NEW_VERSION
фиксим
git checkout master -- *
git checkout master -- *.py
клонировать проекты группы в GitLab
GitLab: склонировать список репозиториев
Список репозиториев: https://your-gitlab-host/api/v4/projects?per_page=1000
список для группы проектов: https://your-gitlab-host/api/v4/groups/{group-id}/projects?per_page=1000
https://your-gitlab-host/api/v4/groups/{group-id}/projects?per_page=9999&page=1&include_subgroups=true
Выкачать (в текущий каталог) репозитории по списку из файла:
Как клонировать сразу все проекты группы в GitLab?
Чтобы включить подгруппы, добавьте include_subgroups=trueпараметр запроса, например
https://<your-host>/api/v4/groups/<group_id>?include_subgroups=true
Обновление списка репозиториев
скрипты на питоне
скрипт на баше, выкачивает с вложенными подгруппами
https://github.com/adroste/gitlab-clone-group
python3 gitlab-clone-group.py --token 'токен' --gitlab-domain gitlab.домен группа_которую_склонировать /путь/каталог_куда_клонировать
https://github.com/gabrie30/ghorg
ghorg clone group3 --base-url=https://<your.instance.gitlab.com> --scm=gitlab --token=XXXXXX --preserve-dir
https://github.com/ezbz/gitlabber
gitlabber -t <personal access token> -u <gitlab url> -i '/MyGroup**' ~/GitlabRoot
ошибки
из за
https://github.com/vitejs/vite/blob/main/.gitattributes
* text=auto eol=lf
сыпятся ошибки при создании веток, git config --global core.autocrlf false не помогает, нужно оставить только
* text=auto



