книга "Pro Git" https://github.com/rostov-da/git-tips https://learngitbranching.js.org/?demo https://githowto.com/ru
- Рабочий каталог, рабочая область.
- Stage = Staging area = область подготовки = индекс
- Head - указатель, где сейчас вы находитесь. Относительно него создаются новые коммиты.
- origin — имя по умолчанию для удалённого репозитория.
- Три состояния файла: зафиксированный, изменённый, подготовленный.
- dangling commits // висячие коммиты.
- unreachable commit // недостижимый коммит.
git -- - путь к файлу, если не указана, то используется текущая директория.
Некоторые ключи: --verbose // будет отображать, что именно сделал гит. --dry-run // выполнить команду без внесения каких-либо изменений. -f // принудительное исполнение, очень опасная опция.
UserHome.gitconfig // файл с основными параметрами UserHome.config\git\ignore // файл со списком игнорируемых объектов для текущего пользователя. .git/info/exclude // файл со списком игнорируемых объектов для репозитория. git config --global core.excludesfile ~/.gitexcludes // указываем файл со списком объектов для игнорирования.
- git help [command] // справка
- git [command] --help // справка
- git config --global --edit // открыть в редакторе настройки user-a.
- git config --system --edit // открыть в редакторе настройки для всех пользователей.
- git config // параметры
- git config --list // параметры git.
- git config --global //
- git config user.name // вывести текущее имя автора
- git config --global user.name "[name]" // задать имя автора
- git config --global user.email "[email address]" // задать электронную почту автора
- git config --global merge.conflictstyle diff3 // конфликты в виде трёх стороннего слияния.
Параметры окончания строк.
- git config --global core.autocrlf true
- git config --global core.safecrlf true
- git gui // запускает программу с GUI интерфейсом.
- gitk // визуализация истории коммитов.
- git init // Create a new local repository, create folder CurrentFolder/.git
- git init [project-name] // Create a new local repository, create folder CurrentFolder/project-name/.git
- git clone // Клонирование удалённого репозитория в текущий каталог, при этом создаёт новая папка, имя репозитория по умолчанию origin.
- git status -s // сведения в коротком виде.
- git status -u // вывести все untracked файлы поимённой, а не только корневую папку.
- git status --ignored // статус игнорируемых файлов. Описание кратких обозначений состояния файлов: red - файл не в индексе. green - файл в индекс. М-red - файл из репозитория был изменён, но ещё не проиндексирован. M-green - файл был изменён и проиндексирован. A - файл впервые попал в индекс (новый файл). ?? - файл не в индексе. AM - файл впервые внесли в индекс, но после ещё был изменён. R - файл переименован. UU - конфликтные файлы при слиянии.
Добавляет файлы в индекс.
- git add . // добавить все файлы в индекс
- git add -p // интерактивный режим: по очереди через консоль позволяет выбрать патч.
- git add -e // интерактивный режим: отображает все патчи в текстовом редакторе и позволяет их редактировать.
- git add -i // интерактивный режим.
- git add -u // add only tracked files.
- git add -A или --all // add all files.
- git add -N // добавляет в индекс файл с пустым содержимым, чтобы diff работал.
- git add -f // принудительно добавить файл, который попадает в список игнорируемых.
* command 1: показать статус файлов.
* command 2: update // добавить файл в индекс.
* command 3: revert // удалить файл из индекса.
* command 4: revert // добавить untraced файлы.
* command 5: patch: // проиндексировать по частям (выбрать отдельные куски).
* command 6: diff // посмотреть дельту для проиндексированных изменений.
* command 7: quit // выйти из режим.
-
git diff // показывает различие между рабочей областью и индексом.
-
git diff [pathFile] // разница для конкретного файла.
-
git diff --cached (или синоним --staged) // сравнивает индекс с последним коммитом.
-
git diff HEAD // разница между рабочей областью и последним коммитом.
-
git diff HEAD~ HEAD // отображает разницу между двумя последними коммитами.
-
git diff [hashOld] [hashNew] // разница между коммитами
-
git diff [branch] // сравнивает текущую ветку с указанной.
-
git diff master..develop // разница между последними коммитами указанных веток.
-
git diff --ours // сравнивает результат слияния с тем, что было в вашей ветке до слияния.
-
git diff --theirs // чем результат слияния отличается от сливаемой ветки.
-
git diff --base // как изменился файл после слияния по сравнению сразу с обеими ветками.
-
git diff -w // при сравнении не учитывает пробельные символы
-
git diff --stat // кратка форма для каждого файла.
-
git diff --shortstat // кратка форма, разница одной строчкой.
-
git diff --name-only // отобразит только имена файлов, которые были изменены.
Отображает разницу между файлами в сторонней программе.
- git difftool --tool-help // список доступных программа для просмотра файлов для их сравнения.
- git difftool HEAD~ HEAD [pathFile] // отобразит разницу между двумя последними коммитами.
- git difftool -d // открывает два каталог в редакторе, между которым есть различия.
- git commit -m "Текст сообщения коммита" // делает коммит с указанным сообщением.
- git commit -a // все файлы, которые есть в репозитории, автоматически индексируются и фиксируются, кроме новых файлов.
- git commit -v // автоматически добавит в сообщение информацию об изменениях.
- git commit --amend // позволяет изменять существующий коммит, попросит отредактировать сообщение к коммиту.
- git commit --amend --no-edit // изменяет существующий коммит, а сообщение оставляет прежним.
- git commit --amend --date=now // изменяет дату коммита на текущую.
- git checkout -- . // удаляет все изменеrmия из рабочего каталога и восстанавливает состояние из последнего коммита, untracked файлы не трогает.
- git checkout -- [FileName] // откат изменений, файл из рабочей области заменяется файлом из последнего коммита.
- git checkout [nameBranch] // переключает на указанную ветку, изменённые файлы не трогаются.
- git checkout [hashCommit] // переключает на указанный коммит.
- git checkout -b nameNewBranch // создаёт новую ветку, переключает на неё, рабочий каталог и индекс переносит в новую ветку.
- git checkout -t origin/branch-name // загрузить ветку с сервера origin.
- git checkout [hashCommit] // указатель HEAD будет указывать на коммит [hashCommit].
- git checkout master^ // шаг назад к первому предку.
- git checkout master^2 // шаг назад ко второму предку.
- git checkout master~3 // три шага назад, всегда будет выбираться первый родитель.
- git checkout HEAD^ // шаг назад к первому предку.
- git checkout HEAD~ // шаг назад относительно HEAD.
- git checkout HEAD~^2~2 // делает: шаг назад, шаг назад ко второму предку, два шага назад.
- git branch -f master HEAD-3 // перемещает ветку master на три родителя назад относительно HEAD.
- git show : // отобразить данные указанного коммита и файла.
- git diff : // выводит разницу между коммитами для указанного файла.
- git rm [file] // удаляет файл из рабочего каталога и добавляет в индекс это изменение.
- git rm -f [file] // удаляет файл из рабочего каталога и индекса, даже если в индексе.
- git rm --cached [file] // удаляет файл только из индекса.
- git rm -r [file] // рекурсивно удалить все файлы с указанным именем.
Файлы которые под версионным контролем и модифицированы никак не изменяются.
-
git clean // удалит только untracked файлы, игнорируемые файлы не трогает.
-
git clean -n // выводит информацию, что будет удалено, но не удаляет.
-
git clean -i // интерактивный режим очистки (будет спрашивать что делать для каждого файла).
-
git clean -x // удаляет игнорирумеы и untracked файлы.
-
git clean -X // удаляет только игнорируемые файлы, при этом untracked файлы не трогает.
-
git clean -d // удаляет каталоги ставшие пустыми.
-
git clean -f // силой, требуется указывать этот ключ, чтобы реально выполнить команду clean, иначе выдаст ошибку.
-
git clean -Xdf // удаляет только игнорируемые файлы и папки ставшие пустыми, при этом untracked файлы не трогает.
- git mv [file-original] [file-renamed] // изменяет имя файла.
- git ls-files --others --ignored --exclude-standard // выводит список всех игнорируемых файлов.
Временное сохранение состояние работы без использования коммита.
- git stash // спрятать текущую работа в тайник.
- git stash -u // также сохранять файлы которые не под версионным контролем.
- git stash --all // сохранять все файлы, даже те, которые в игноре.
- git stash -m "message" // добавит message к закладке.
- git stash list // список всех спрятанных работ.
- git stash apply // применить последнюю спрятанную работу.
- git stash apply [nameStash] // применить спрятанную работу с указанным именем, состояние индекс не восстанавливается.
- git stash apply [nameStash] --index // применить спрятанную работу с указанным именем и восстановить состояние индекс.
- git stash pop // применяет последний сделанный тайник и удаляет его из списка.
- git stash drop // удаляет последний тайник.
- git stash drop [nameStash] // удаляет тайник с указанным именем.
- git stash branch [newNameBranch] // создаёт новую ветку на основе тайника.
Пример сохранения работы в закладку и перенос её в новую ветку:
- git stash
- git checkout -b new_useless_feature
- git stash pop
-
git reset // удаляет все файлы из индекса (сбрасывает индекс), рабочий каталог не трогает.
-
git reset HEAD // удаляет все файлы из индекса, рабочий каталог не трогает.
-
git reset [NameFile] // удаляет файл из индекса (если он был добавлен), рабочий каталог не трогает.
-
git reset [HashCommit] // переключит ветку на указанный коммит, обновит индекс, рабочий каталог не трогает.
-
git reset --mixed HEAD^ // отменит последний коммит, обновит индекс, рабочем каталог не трогает.
-
git reset --soft HEAD^ // отменит последний коммит, не трогает индекс, рабочий каталог не трогает.
-
git reset --hard HEAD^ // отменит последний коммит, обновит индекс и рабочий каталог.
Удалить файл из предыдущего коммита
- git reset --soft HEAD~1
- git reset /assets/img/misty-and-pepper.jpg
- rm /assets/img/misty-and-pepper.jpg
- git commit
- git revert [hashCommit] // делает возврат к коммиту c помощью создания специального нового коммита.
-
git log // выводит коммиты в историческом порядке от старых до HEAD.
-
git log --all // вывод все коммиты, включая те, которые после HEAD.
-
git log --follow [file] // выводит историю файла.
-
git log release..test // отобразит все коммиты которые есть в ветке test, но нет в ветке release.
-
git log --oneline // выводи историю коммитов по одной строчки на коммит.
-
git log -p // вывод разницу (патч) между коммитами (изменения).
-
git log --stat // вывод разницу между коммитами (изменения) в сокращённой форме.
-
git log -S "FunctionName" // выводит коммиты, которые затронули строку FunctionName
-
git log -3 // вывод только трёх последних коммитов.
-
git log --shortstat // Отображает только строку с количеством изменений/вставок/удалений для команды --stat.
-
git log --name-only // Показывает список файлов, которые были изменены.
-
git log --name-status // Показывает список файлов, которые были изменены + как изменены.
-
git log --abbrev-commit // Показывает только несколько символов SHA-1 чек-суммы вместо всех 40.
-
git log --relative-date // Отображает дату в относительном формате (например, "2 weeks ago") вместо стандартного формата даты.
-
git log --no-merge // не выводить коммиты, у которых более одного родителя.й
-
git log --graph // Отображает ASCII граф с ветвлениями и историей слияний.
-
git log --pretty={oneline|short|full|fuller} // вывод коммитов с разным количество сопровождающей информации.
-
git log --pretty=format:"%h - %an, %ar : %s" // вывод коммитов в указанном формате formating: %s Сообщение коммита. %H Хеш коммита %h Сокращенный хеш коммита %T Хеш дерева %t Сокращенный хеш дерева %P Хеш родителей %p Сокращенный хеш родителей %an Имя автора %ae Электронная почта автора %ad Дата автора (формат даты можно задать опцией --date=option) %ar Относительная дата автора %cn Имя коммитера %ce Электронная почта коммитера %cd Дата коммитера %cr Относительная дата коммитера %d Отображает метку ветки и указателя HEAD.
-
$ git log --pretty=format:"%h %s" --graph // граф коммитов в указанном формате
-
git log --since, --after Показывает только те коммиты, которые были сделаны после указанной даты.
-
git log --until, --before Показывает только те коммиты, которые были сделаны до указанной даты.
-
git log --author="Rostov" // коммиты конкретного автора
-
git log --committer="Dmitry" // коммиты автора-committer
-
git log --grep="Текс" // Показывает только коммиты, сообщение которых содержит указанную строку.
-
git log --oneline --decorate --tags --no-walk // отображает все теги в краткой форме.
Examples
- git log --all -2 --oneline
- git log --oneline --decorate --graph
- git log -10 --pretty=format:"%h | %ad | %s" --date=format:'%Y-%m-%d %H:%M:%S'
- git show // отобразить данные последнего коммита.
- git show [hashCommit] // отобразить данные указанного коммита.
- git show [hashCommit]:pathFile // отобразить данные указанного коммита и файла.
- git remote // выводи информацию о доступных удалённых репозиториях.
- git remote -v // просмотреть адреса для чтения и записи, привязанные к репозиторию
- git remote add [shortname] [url] // добавить удалённый репозиторий под указанным именем
- git remote rename [oldName] [newName] // переименовать удалённый репозиторий.
- git remote rm [name] // удалить.
- git remote show [nameRemoteRepo] // отобразить информацию об удалённом репозитории (как связаны ветки с локальным репозиторием).
- удалить старый пароль: Панель управления\Все элементы панели управления\Диспетчер учетных данных → Учетные данные Windows.
- get merge [branch] // в текущую ветку добавить изменения из указанной ветки.
- git merge [branch] --ff // it is default, будет использоваться стратегия fast-forward, если возможно.
- git merge [branch] --no-ff // делает merge без возможности перемотки, тем самым остаётся история ветвления.
- git merge [branch] --ff-only // будет использоваться стратегия fast-forward, если не получается, слияние не про
- git merge [branch] -e // даст возможность отредактировать сообщение (по умолчанию сообщение генрируется само).
- git fetch (или git fetch origin master) // забирает данные в локальный репозиторий, но не сливает их с какими-либо вашими наработками и не модифицирует то, над чем вы работаете в данный момент. Если есть в локальном репозитории изменённый файлы (в индекс или нет, без разницы), то merge сделать не получится. git fetch origin master:master // сделать fast-fording слияние локальной ветки master с серверной. git fetch origin master:feature // сделать fast-fording слияние локальной ветки feature с локальной веткой master. git fetch . feature:master // fast-fording слияние локальной ветки master в feature.
- git pull (или git pull origin master) // получить скачать данные из удалённого репозитория и сразу пытаться мержить с локальным репозиторием.
- git push (или git push origin master)) //отправка изменений на удалённый репозиторий.
- git push --set-upstream [nameRemoteRepo] [newNameBranchOnRemoteRepo] // текущую ветку отправляет на удалённый репозиторий под указанным именем, в котором нет такой ветки, и связывает связывает локальную и удалённую ветку.
- git push [nameRemoteRepo] --delete [nameRemoteBranch]] // удалить ветку на сервере.
- git push origin master:master // отправить изменения в master на сервер.
- git branch // список локальных веток.
- git branch -a // список всех веток + список удалённых веток
- git branch [nameNewBranch] // создание новой ветки относительно текущего коммита, переключение на новую ветку не происходит.
- git branch [nameBranch] [hashCommit] // создание ветки, которая начинается с указанного коммита.
- git branch -d [nameBranch] // удаление ветки
- git branch -v // отображает последний коммит на каждой ветке.
- git branch -f master HEAD-3 // принудительно перемещает ветку master на три родителя назад относительно HEAD.
- git branch -f master [hashCommit] // принудительно перемещает ветку master на указанный коммит.
- git branch -m // переименовать текущую ветку.
- git branch -m // переименовать указнную ветку.
- git branch -u origin/develop // связывает текущую ветку с удалённой (тогда можно писать просто git push без указания ветки, upstream).
Работа с несколькими рабочими деревьями (каталогами) одновременно. Разные рабочие деревья не могут одновременно использовать одну и ту же ветку. $ git worktree add --detach ../worktree_temp hashCommit // создаёт новое рабочее дерево на коммит hash. $ git worktree add -b tempBranch ../tempDir // создаёт ветку с именем tempBranch в папке ../tempDir, относительно папки, в которой папка .git. $ git worktree add [-f] [--detach] [--checkout] [--lock] [-b ] [] $ git worktree list [--porcelain] // List details of each worktree. $ git worktree lock [--reason ] // чтобы автоматически не удалялись деревья, если отсутствует каталог (например из-за отложенного монтирования каталога). $ git worktree unlock $ git worktree move // Move a working tree to a new location. $ git worktree remove [-f] // Remove a working tree. $ git worktree prune [-n] [-v] [--expire ] // удаляет все ссылка на дополнительные деревья, если файлы дополнительных деревьев были удалены вручную, а не через команду "git worktree remove".
- git reflog // история всех изменений в репозитории, история всех команд.
- git rebase [nameBranch] // повторно совершает коммиты из текущий ветки в указанную ветку.
- get rebase [nameBranchTarget] [nameBranchSource] // повторно совершает коммиты из ветки nameBranchSource в ветку nameBranchTarget
- git rebase -i HEAD~2 // интерактивный rebase для последних двух коммитов включая текущий HEAD.
- git cherry-pick [commit1] [commit2] ... // копирует указанные коммиты в текущую ветку.
- git cherry-pick -n // применяет изменения из коммита, но не фиксирует его.
Имеются легковесный и аннотированные метки. push по умолчанию не отправляет метки. pull забирает метки. Нельзя переключится на метку, нужно создавать ветку.
- git tag // выводи список текущий меток.
- git tag v1.5 // создание легковесной метки с именем "v1.5"
- git tag -a v1.4 -m 'my version 1.4' // создание аннотированной метки с именем "v1.4" и описанием "my version 1.4"
- git show v1.4 // просмотр сведений о метки "v1.4"
- git tag -a v1.2 [hashCommit] // метка для конкретного коммита.
- $ git checkout -b version2 v2.0.0 // переключает на метку с именем "v2.0.0", при этом создаётся новая ветка "version2".
- git tag -d [nameTag] // удалить tag.
- git describe // выводит информацию {[nameTag]-[countCommitsToTag]-[hashCommit]}
- git describe [ref] // выводит информацию относительно указанной ссылки.
- git shortlog // выводит только текстовые сообщения коммитов сгруппированые по автору.
- git grep "Text" // ищет указанный текст в файлах для текущего HEAD. -n // добавит в вывод номер строки --count // если в одном файле будет несколько совпадений, то в выводе будет только один раз указан файл и количество совпадений. -p // добавляет в вывод имя метода или функцию, в котором присутствует совпадение.
Важно! При получении (rebase) и отправки (dcommit) в svn все новые локальные коммиты изменяют свой хеш (добавляется специальная информация в message коммита). Настройка: git config --global svn.rmdir true // иначе будут оставаться в SVN репозитории пустые каталоги.
- git svn clone https://redminesrv.spectronxray.local:8443/svn/FPM/trunk/Rostov/FpmLibSolution
- git svn info // информация об svn.
- git svn rebase // забрать изменения из svn (локальные коммиты в побочных ветках будут автоматически скопированы в текущую).
- git svn dcommit // отправка изменений из git в svn из текущей ветки.
- git svn log // коммиты из svn (только до последнего обращения к svn).
- git svn show-ignore // показать, какие файлы svn игнорирует.
- git svn create-ignore // копирует из svn список игнорируемых файлов и создаёт файлы .gitignore.
- git svn show-ignore > .git/info/exclude // копирует из svn список игнорируемых файлов и создаёт один файл .git/info/exclude.
git version 2.19.1.windows.1 x64 -- git нормальное работает с SVN git version 2.20.1.windows.1 x64 -- не работает c SVN, зависает git git version 2.21.0.windows.1 x64 -- нормальное работает с SVN
- git cat-file -p // выводит содержимое объекта.
- git cat-file -t // выводит тип объекта.
- git cat-file blob // выводит содержимое объекта тип blob.
- git fsck --unreachable // отобразит все недостижимые объекты.
- git show-ref // выводит хеши всех указателей (указатели веток, указатель HEAD).
- git rev-list --objects --all // выводит все объекты, которые есть в репозитории (на которых есть прямая ссылка).
- git hash-object [file/folder] // возвращает хеш указанного файла, файл может не находиться в репозитории.
- git ls-tree <commit/ref> // выводит хеши всех объектов для указанного коммита.
- git ls-files --stage // отобразит хеши файлов, которые находятся в индексе.
- git fsck --full // выводит хеши всех объектов, недостижимые из других объектов.
- git count-objects -v // выводит сводку о количестве и размера объектов в репозитории.
- git ls-tree --name-only -r HEAD // выводит список всех имён файлов (с путями) текущего коммита.
- git gc --prune=now --aggressive // сжать репозиторий.
- git ls-tree --name-only -r HEAD // выводит список файлов
- git rm [nameFile] --cached // удаляет файл из репозитория (локальную копию не трогает)
- настройка в .git\config включает такое же поведение, как в Windows (игнорирование регистра)
в секции: [core]
свойство: ignorecase = true
- git format-patch -1 // создаёт патч для текущего коммита.
- git format-patch -2 // создаёт два патча для текущего коммита и предыдущего.
- git format-patch -1 // создаёт патч только для коммита hash.
- git format-patch // создаёт набор потчей для коммиов в диапазон (hash, HEAD].
- git format-patch -3 HEAD // создать три патча на основве текущего коммита и два предыдущих коммита.
- git format-patch upstream..topic // создать патчи на основе разницы веток upstream и topic.
Применить патч. Команда am используется, если патч был создан с помощью format-patch, а не diff.
- git am namePatch.patch // применить патч с именем файоа 'namePatch.patch', будет создан один коммит.
[user] name = Rostov Dmitry email = rostov.da@gmail.com [core] editor = code --wait excludesfile = ~/.gitignore [merge] tool = meld [mergetool "vscode"] cmd = code --wait $MERGED [diff] tool = vscode guitool = kdiff3 [difftool "vscode"] cmd = code --wait --diff $LOCAL $REMOTE [pull] rebase = false [fetch] prune = false [rebase] autoStash = false
[credential] helper = wincred [http] sslCAInfo = C:/Users/Rostov.DA/gitCertsMy/GPNRoot.cer [http] sslVerify = false [http] sslBackend = schannel
/.*
[core] ignorecase = true
https://fabianlee.org/2016/09/07/git-calling-git-clone-using-password-with-special-character/