работа с Git

May 03, 2016 23:09





развернуть
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
git log -p
git branch commit_rescued
git checkout -b

git branch -m
git stash - положить во временное хранилище все отслеживаемые файлы.
git stash pop - восстановить последние файлы, положенные во временное хранилище.
git stash list - список всех сохраненных изменений во временном хранилище.
git stash drop - удалить последние файлы, положенные во временное хранилище.
git-resurrect
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 ']'

-------------------------------------------------------------------------------------
формируем ветку 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

Выкачать (в текущий каталог) репозитории по списку из файла:

jq -r '.[].ssh_url_to_repo' < /path/to/projects.json | xargs -n1 git clone

Как клонировать сразу все проекты группы в GitLab?

for repo in $(curl -s --header "PRIVATE-TOKEN: your_private_token" https:///api/v4/groups/ | jq -r ".projects[].ssh_url_to_repo"); do git clone $repo; done;

TOKEN='you_token'
URL='you_git'
GROUP='you_group'
number_pages=$(curl --head --header "PRIVATE-TOKEN: $TOKEN" "http://$URL/api/v4/groups/$GROUP/projects" |grep 'X-Total-Pages' |cut -d ':' -f 2 | tr -d ' ')
number_pages=$(printf %d "$number_pages")
for (( i = 1; i <= number_pages; i++ ))
do
curl -s --header "PRIVATE-TOKEN: $TOKEN" "http://$URL/api/v4/groups/$GROUP/projects?per_page=100&page=${i}" | jq -r ".[].ssh_url_to_repo";
done | tee log
for i in `cat log`; do git clone $i; done

Чтобы включить подгруппы, добавьте include_subgroups=trueпараметр запроса, например
https:///api/v4/groups/?include_subgroups=true

for repo in $(curl -s --header "PRIVATE-TOKEN: " https://gitlab.com/api/v4/groups//projects\?include_subgroups\=true | jq ".[].ssh_url_to_repo" | tr -d '"'); do git clone $repo; done;

Обновление списка репозиториев

find . -type d -name '.git' \
| xargs -n1 -- sh -c \
'cd "${0}/.." && echo \
&& basename -sa $(git rev-parse --show-toplevel) \
&& git pull --all'

скрипты на питоне

import os
from subprocess import call
from gitlab import Gitlab

# Register a connection to a gitlab instance, using its URL and a user private token
gl = Gitlab('http://192.168.123.107', 'JVNSESs8EwWRx5yDxM5q')
groupsToSkip = ['aGroupYouDontWantToBeAdded']

gl.auth() # Connect to get the current user

gitBasePathRelative = "git/"
gitBasePathRelativeAbsolut = os.path.expanduser("~/" + gitBasePathRelative)
os.makedirs(gitBasePathRelativeAbsolut,exist_ok=True)

for p in gl.Project():
if not any(p.namespace.path in s for s in groupsToSkip):
pathToFolder = gitBasePathRelative + p.namespace.name + "/" + p.name
commandArray = ["mr", "config", pathToFolder, "checkout=git clone '" + p.ssh_url_to_repo + "' '" + p.name + "'"]
call(commandArray)

os.chdir(gitBasePathRelativeAbsolut)

call(["mr", "update"])

import requests
import subprocess, shlex
import os

print('Starting getrepos process..')

key = '12345678901234567890' # your gitlab key
base_url = 'https://your.gitlab.url/api/v4/projects?simple=true&per_page=10&private_token='
url = base_url + key

base_dir = os.getcwd()

while True:
print('\n\nRetrieving from ' + url)
response = requests.get(url, verify = False)
projects = response.json()

for project in projects:
project_name = project['name']
project_path = project['namespace']['full_path']
project_url = project['ssh_url_to_repo']

os.chdir(base_dir)
print('\nProcessing %s...' % project_name)

try:
print('Moving into directory: %s' % project_path)
os.makedirs(project_path, exist_ok = True)
os.chdir(project_path)
cmd = shlex.split('git clone --mirror %s' % project_url)
subprocess.run(cmd)
except Exception as e:
print('Error: ' + e.strerror)

if 'next' not in response.links:
break

url = response.links['next']['url'].replace('127.0.0.1:9999', 'your.gitlab.url')

print('\nDone')

скрипт на баше, выкачивает с вложенными подгруппами

#!/bin/bash
URL="https://mygitlaburl/api/v4"
TOKEN="mytoken"

function check_subgroup {
echo "checking $gid"
if [[ $(curl --header "PRIVATE-TOKEN: $TOKEN" $URL/groups/$gid/subgroups/ | jq .[].id -r) != "" ]]; then
for gid in $(curl --header "PRIVATE-TOKEN: $TOKEN" $URL/groups/$gid/subgroups/ | jq .[].id -r)
do
check_subgroup
done
else
echo $gid >> top_level
fi
}

> top_level #empty file
> repos #empty file
for gid in $(curl --header "PRIVATE-TOKEN: $TOKEN" $URL/groups/ | jq .[].id -r)
do
check_subgroup
done
# This is necessary because there will be duplicates if each group has multiple nested groups. I'm sure there's a more elegant way to do this though!
for gid in $(sort top_level | uniq)
do
#curl --header "PRIVATE-TOKEN: $TOKEN" $URL/groups/$gid | jq .projects[].http_url_to_repo -r >> repos
curl --header "PRIVATE-TOKEN: $TOKEN" $URL/groups/$gid | jq .projects[].ssh_url_to_repo -r >> repos
done

while read repo; do
git clone $repo
done
rm top_level
rm repos

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:// --scm=gitlab --token=XXXXXX --preserve-dir

https://github.com/ezbz/gitlabber
gitlabber -t
-u -i '/MyGroup**' ~/GitlabRoot

ошибки
из за
https://github.com/vitejs/vite/blob/main/.gitattributes
* text=auto eol=lf
сыпятся ошибки при создании веток, git config --global core.autocrlf false не помогает, нужно оставить только
* text=auto

git, coding

Previous post Next post
Up