# https://habr.com/post/306166/
# Между прочим, это хороший тон
git config user.name "FirstName LastName"
git config user.email "user@example.com"
# В репозитории файлы хранятся в кодировке utf-8
# Фильтры применяются для типов файлов: *.bas filter=win1251 eol=crlf
git config --global filter.win1251.clean "iconv -f windows-1251 -t utf-8"
git config --global filter.win1251.smudge "iconv -f utf-8 -t windows-1251"
git config --global filter.win1251.required true
ssh-keygen -t rsa -b 4096 -C "Email"
# Нажать Enter (запомнить путь публичного ключа)
# Пароль закрытого ключа (кодовая фраза)
> passphrase
> passphrase again
# Проверка подключения
ssh -T git@github.com
# //gnupg.org/download/integrity_check.html
# //habr.com/post/73642/
# //debianzilla.com/gnupg-pgp/ (not "PGP keys")
gpg --full-generate-key
# //linux.org.ru/forum/security/10904313
# RSA and RSA (4096) 6мес //k806.ru/help/gpg_create
> 1
> 4096
> 6m
> Y
> FirstName LastName
> Email
> comment
> O
# Пароль закрытого ключа (кодовая фраза) для версии GnuPG 2.20 и ниже
> passphrase
# Показать список открытых ключей
gpg --list-keys
# Показать список закрытых ключей (хеш совпадает)
gpg -K --keyid-format LONG | grep -C 1 "^sec"\
| GREP_COLOR="01;36" egrep -i --color "([0-9A-F]{8,}|-\W+)"
# Добавить зашифрованный открытый ключ GPG в учётную запись GutHub
gpg --armor --export <KEY>
# Удалить ключ //eax.me/gpg/
gpg --delete-secret-keys <KEY>
gpg --delete-sigs <KEY>
gpg --delete-keys <KEY>
# //help.github.com/articles/generating-a-new-gpg-key/
# Обязательная подпись всех коммитов
git config --global commit.gpgsign false
git config --global tag.gpgsign true
# Установка ключа для подписи по умолчанию
# //stackoverflow.com/questions/10161198/
git config --global user.signingkey <KEY>
# GitHub Desktop не поддерживает подпись, т.к. нужно передавать passphrase
# //github.com/desktop/desktop/issues/78
# //stackoverflow.com/questions/36941533
# поэтому, надо удалить всё, что было избыточно введено в консоли (создать хук к $ git commit -S)
git config --global --unset commit.gpgsign
git config --global --unset gpg.program
# и в файле конфигурации gpg.conf; путь к "~" echo ${HOME}
# //lists.gnupg.org/pipermail/gnupg-users/2003-May/018492.html
sed -i "/^no-tty/d" ~/.gnupg/gpg.conf
# //ant0.ru/comment/52
# Типы ключей https://habr.com/post/358182/
# Установка истечения срока ключа (закрытого и открытого)
gpg --edit-key <найденный_KEY>
> key 0 > usage: SC
> expire
>> Changing expiration time for the primary key.
> 1y
> Y
>> Changing expiration time for a subkey.
> key 1 > usage: E
> expire
> 22w
> Y
> save
# Удалить открытый ключ GPG из учётной записи GutHub и вставить новый
# Тогда все предыдушие подписи к коммитам станут валидными
# (при key 0 и key 1 с одинаковой датой - подпись оставалась валидной)
# ? Создание зашифрованного архива по паролю (gpg умеет BZIP2 из коробки)
# Просмотр содержания архива
tar -tj -f backup.tbz2
# Необходимо передать открытый ключ человеку, который будет шифровать файлы текущей директории
tar -cjv ../${PWD##*/} | gpg -e -r <KEY> -o ../backup.tbz2.gpg
# Расшифровка архива по закрытому ключу
gpg -d backup.tbz2.gpg | tar -xj
gpg -o backup.tbz2 -d backup.tbz2.gpg
Коммит создаётся от имени, указаного в настройках GitHub Desktop. Заменяем его.
Создаём файлы .gitattributes и .gitignore. Затем нужно удалить коммит <234567KEY>
git log --pretty=oneline
<234567KEY>
<123456KEY>
git reset --soft <234567KEY>
Для изменения последнего коммита лучше сразу использовать (см. ниже --amend)
# Добавить/удалить файлы в индекс. Список файлов можно перечислять через пробел
git add/rm <FILE>
# Команда (также) может просто изменить комментарий коммита - меняется KEY (не применять после push)
git commit --amend -S (-a только для изменённых файлов (без первой команды); -v при редактировании описания коммита показывает все сделанные изменения)
# Создать пустой репозиторий (origin) на GitHub, и проверить путь:
cd .. && \
git init <docs> && cd "$_" && git remote add origin https://github.com/h8nor/"$_".git
git remote -v
# //github.com/Imangazaliev/git-tips
# //help.github.com/articles/creating-releases/
git remote add origin https://github.com/h8nor/<docs>.git
# -u связывает локальный и удалённый репозитории
git push -u origin master
# Индексация новых файлов и всех изменений (для текущей директории заменить -A на .)
# Очень опасная команда, подумайте прежде чем пользоваться ею
git add -A
# Краткий список всех изменений
# //habr.com/post/420529/
git status -sb
# Самая важная команда (commit)
git commit -m"comment1" -m"comment2" (ключ -a коммитит только файлы из индекса)
🧑🏭 Картинки в комментариях можно посмотреть здесь.
# Список файлов можно перечислять через пробел
git reset folder/ReadMe.md
git checkout README.md
# Отмена изменений всех файлов после модификации
git checkout -- .
# Переименовать изменив только регистр
git mv -f Readme.md README.md
# Переключиться на ветку master
git checkout master
git pull origin master
# Вливаем изменения в активную ветку master из ветки dev
# с сохранением истории изменений
git merge --no-ff -m"comment" dev
# ! или применить указанный коммит к ветке master
# Список файлов можно перечислять через пробел
# (ключ -n применяет изменения к дереву проекта без индексации и создания коммита)
git cherry-pick <KEY>
# Обновляем ветку master (обязательно)
git push origin master
git checkout dev
git merge --squash master
git push origin dev
Синхронизируем ветку dev через клиент (если требуется)
# Ветка dev создаётся из текущей
git branch dev
# Создать ветку на определенном коммите
git branch new_branch <KEY>
# Создать чистую новую ветку
git checkout --orphan new_branch
# Рисовать дерево репозитория
git log --oneline --graph --decorate --all
# Команда забирает изменения и проводит слияние ветки master (с активной веткой)
git pull origin master
git merge --abort
Отмена всех изменений, сделанных в дереве, до состояния, которое было при последнем комите в локальный репозиторий:
# Очень опасная команда, подумайте прежде чем пользоваться ею
# чтобы файлы не загружались из локального репозитория - ключ --soft
git reset --hard ^HEAD
# Вернуть курсор к актуальному коммиту
git reset ORIG_HEAD
git fetch origin
git reset --hard origin/dev
# Копируем исправленные файлы
git add --all && git commit -m"fix commit"
# Пушим. Ветка должна быть не заблокирована? //tonyganch.com/git/rebase/
# git rebase -i HEAD~2 (не вышло)
# s - вводим вместо "pick" для самого нижнего
# Коммиты должны быть запушины?
git reset --soft <KEY>
git push --force
# Перед этим должен быть снят "Branch protection"
# //tonyganch.com/git/reset/
# //marklodato.github.io/visual-git-guide/index-ru.html
find -not -path './.git*' -type f | xargs unix2dos
# Просмотреть символы переноса строк в `i/N` удалённом и `w/N` локальном репозиториях
git ls-files --eol
# Удалить все локальные изменения до последнего коммита
git reset --hard
find . -type f \( -name "*.md" -o -name "*.html" \) -print0\
| xargs -0r awk "/^\xEF\xBB\xBF/ {print FILENAME}{nextfile}"
https://gist.github.com/c55f1538454755fdff71fba0d686e371
bash pre-commit.sh