Skip to content

Instantly share code, notes, and snippets.

@adminka-root
Created June 23, 2021 12:07
Show Gist options
  • Save adminka-root/b374d8eb4783beb601537c592803c13e to your computer and use it in GitHub Desktop.
Save adminka-root/b374d8eb4783beb601537c592803c13e to your computer and use it in GitHub Desktop.
Git commands crib

Git commands crib

Литература

книга "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

  • git help [command] // справка
  • git [command] --help // справка

git config

  • 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 // визуализация истории коммитов.

init

  • 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

  • git clone // Клонирование удалённого репозитория в текущий каталог, при этом создаёт новая папка, имя репозитория по умолчанию origin.

git status

  • git status -s // сведения в коротком виде.
  • git status -u // вывести все untracked файлы поимённой, а не только корневую папку.
  • git status --ignored // статус игнорируемых файлов. Описание кратких обозначений состояния файлов: red - файл не в индексе. green - файл в индекс. М-red - файл из репозитория был изменён, но ещё не проиндексирован. M-green - файл был изменён и проиндексирован. A - файл впервые попал в индекс (новый файл). ?? - файл не в индексе. AM - файл впервые внесли в индекс, но после ещё был изменён. R - файл переименован. UU - конфликтные файлы при слиянии.

git add

Добавляет файлы в индекс.

  • 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 // принудительно добавить файл, который попадает в список игнорируемых.

Git add -i

* 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 // показывает различие между рабочей областью и индексом.

  • 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

Отображает разницу между файлами в сторонней программе.

  • git difftool --tool-help // список доступных программа для просмотра файлов для их сравнения.
  • git difftool HEAD~ HEAD [pathFile] // отобразит разницу между двумя последними коммитами.
  • git difftool -d // открывает два каталог в редакторе, между которым есть различия.

git commit

  • git commit -m "Текст сообщения коммита" // делает коммит с указанным сообщением.
  • git commit -a // все файлы, которые есть в репозитории, автоматически индексируются и фиксируются, кроме новых файлов.
  • git commit -v // автоматически добавит в сообщение информацию об изменениях.
  • git commit --amend // позволяет изменять существующий коммит, попросит отредактировать сообщение к коммиту.
  • git commit --amend --no-edit // изменяет существующий коммит, а сообщение оставляет прежним.
  • git commit --amend --date=now // изменяет дату коммита на текущую.

git checkout

  • 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

  • git rm [file] // удаляет файл из рабочего каталога и добавляет в индекс это изменение.
  • git rm -f [file] // удаляет файл из рабочего каталога и индекса, даже если в индексе.
  • git rm --cached [file] // удаляет файл только из индекса.
  • git rm -r [file] // рекурсивно удалить все файлы с указанным именем.

git clean

Файлы которые под версионным контролем и модифицированы никак не изменяются.

  • 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

  • git mv [file-original] [file-renamed] // изменяет имя файла.

git ls-files

  • git ls-files --others --ignored --exclude-standard // выводит список всех игнорируемых файлов.

git stash

Временное сохранение состояние работы без использования коммита.

  • 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 // удаляет все файлы из индекса (сбрасывает индекс), рабочий каталог не трогает.

  • 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

  • git revert [hashCommit] // делает возврат к коммиту c помощью создания специального нового коммита.

git log

  • 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 // отобразить данные последнего коммита.
  • git show [hashCommit] // отобразить данные указанного коммита.
  • git show [hashCommit]:pathFile // отобразить данные указанного коммита и файла.

git remote

  • git remote // выводи информацию о доступных удалённых репозиториях.
  • git remote -v // просмотреть адреса для чтения и записи, привязанные к репозиторию
  • git remote add [shortname] [url] // добавить удалённый репозиторий под указанным именем
  • git remote rename [oldName] [newName] // переименовать удалённый репозиторий.
  • git remote rm [name] // удалить.
  • git remote show [nameRemoteRepo] // отобразить информацию об удалённом репозитории (как связаны ветки с локальным репозиторием).
  • удалить старый пароль: Панель управления\Все элементы панели управления\Диспетчер учетных данных → Учетные данные Windows.

git merge

  • 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 (или 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 (или git pull origin master) // получить скачать данные из удалённого репозитория и сразу пытаться мержить с локальным репозиторием.

git push

  • 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 // список локальных веток.
  • 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

Работа с несколькими рабочими деревьями (каталогами) одновременно. Разные рабочие деревья не могут одновременно использовать одну и ту же ветку. $ 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 reflog // история всех изменений в репозитории, история всех команд.

git rebase

  • git rebase [nameBranch] // повторно совершает коммиты из текущий ветки в указанную ветку.
  • get rebase [nameBranchTarget] [nameBranchSource] // повторно совершает коммиты из ветки nameBranchSource в ветку nameBranchTarget
  • git rebase -i HEAD~2 // интерактивный rebase для последних двух коммитов включая текущий HEAD.

git cherry-pick

  • git cherry-pick [commit1] [commit2] ... // копирует указанные коммиты в текущую ветку.
  • git cherry-pick -n // применяет изменения из коммита, но не фиксирует его.

git tag

Имеются легковесный и аннотированные метки. 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

  • git describe // выводит информацию {[nameTag]-[countCommitsToTag]-[hashCommit]}
  • git describe [ref] // выводит информацию относительно указанной ссылки.

git shortlog

  • git shortlog // выводит только текстовые сообщения коммитов сгруппированые по автору.

git grep

  • git grep "Text" // ищет указанный текст в файлах для текущего HEAD. -n // добавит в вывод номер строки --count // если в одном файле будет несколько совпадений, то в выводе будет только один раз указан файл и количество совпадений. -p // добавляет в вывод имя метода или функцию, в котором присутствует совпадение.

git svn

Важно! При получении (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

  • 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.

git am

Применить патч. Команда am используется, если патч был создан с помощью format-patch, а не diff.

  • git am namePatch.patch // применить патч с именем файоа 'namePatch.patch', будет создан один коммит.

.gitconfig

[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

[http]

proxy = spb99-proxy.gazprom-neft.local:8080

.gitignore (файл в папке пользователя; глобальное игнорирование для всех проектов)

/.*

.git/config

[core] ignorecase = true

Ввод пароля со спец-символами

https://fabianlee.org/2016/09/07/git-calling-git-clone-using-password-with-special-character/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment