Git Список часто используемых команд
Установка
sudo apt-get update
sudo apt-get install git
Рекомендуемые утилиты
Справочник по командам
Первоначальная настройка
# установка имени и почты
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com
# отключить fast-forward при merge (начиная с git version 1.7.6)
git config --global merge.ff false
# разрешить fast-forward при pull, т.к. pull == featch+merge (начиная с git version 1.7.6)
git config --global pull.ff yes
# установка редактора
git config --global core.editor "code --wait"
# проверка настроек общая
git config --list
# проверка настроек конкретного параметра
git config user.name
# для удаления настройки
git config --global --unset <param.name>
# добавление глобального .gitignore - нужен для внесения исключений, общих для всех проектов, например .idea
# сам файл ~/.gitignore создаем и вносим в него нужные правила
git config --global core.excludesfile ~/.gitignore
Общие команды
- инициализация
git init
- добавление к будущему комиту
git add .
git add --all
- коммит
git commit -m"комментарий к комиту"
Работа с удаленными репозиториями
- добавление привязки удаленного репозитория к проекту
git remote add somename <path-to-repo>
- удаление привязки к удаленному репозиторию
git remote rm somename
- изменение ссылки на удаленный репозиторий
git remote set-url origin git://new.url.here
- просмотр списка удаленных репозиториев
git remote -v
- изменение адреса удаленного репозитория
git remote set-url origin https://github.com/USERNAME/OTHERREPOSITORY.git
- привязать локальную ветку к удаленной для отслеживания
git branch --set-upstream-to=origin/<branch> <local_branch_name>
- получение удаленной ветки в локальный репозиторий
git branch -f remote_branch_name origin/remote_branch_name
git checkout remote_branch_name
- пуш коммита в удаленный репозиторий
git push origin master
- получение данных из удаленного репозитория
git pull
# или
git pull origin
# или
git pull origin master
# при возникновении ошибки fatal: refusing to merge unrelated histories
git pull origin master --allow-unrelated-histories
- удаление удаленной ветки
git push origin --delete <branchName>
- обновление данных об удаленных ветках
git fetch -p
Откаты и восстановления
- откатить не проиндексированный файл (до добавления в список перед коммита)
git checkout <filename>
- откатить проиндексированный файл (до коммита)
git reset HEAD <filename> // это сбросит проиндексированные файлы, но изменения в файле не откатятся
git checkout <filename> // это откатит сами изменения
- Удаление неотслеживаемых файлов ПРОСМОТР списка удалений
git clean -d -n
- Удаление неотслеживаемых файлов + те которые добавлены в игнор ПРОСМОТР списка удалений !!! осторожно . удалит и файлы настроек, т.к. они всегда в игноре
git clean -d -n -x
- Исправить последний коммит
# исправить только текст коммита
git --amend -m"New commint text"
# переключиться на родительский коммит и исправить файлы
git reset HEAD^
# правим файлы, добавляем как обычно и коммитим
git --amend -m"New commint text"
- Привести ветку в состояние удаленного репозитория !!! Осторожно, удалит все локальные коммиты, которых нет в удаленной ветке
git checkout -B master origin/master
- Удалить последние n коммитов
Специальной команды для этого нет, нужно выполнить ряд действий:
# переключиться на коммит к которому мы хотим откатить ветку
git checkout <needed commit hash>
# создать новую ветку от текущего коммита и переключиться на нее
git checkout -b new_tmp_branch
# удалить старую ветку
git branch -d old_branch_name
# переименовать новую ветку в старое имя
git branch -m new_tmp_branch old_branch_name
# при необходимости прокинуть ветку в удаленный репозиторий и назначить отслеживание локальной веткой удаленной
Прятанье источник
- спрятать изменения без коммита
git stash
- просмотр списка спрятанных изменениц
git stash list
- достать спрятанные изменения
# восстановить последние спрятанные данные
git stash apply
# восстановить последние спрятанные данные, без добавления файлов в индекс
git stash apply --index
# восстановить выбранные спрятанные данные
git stash apply stash@{2}
- удалить спрятанные изменения
git stash drop stash@{0}
Работа с ветками
- создание ветки
git branch new-branch
- переключение на ветку
git checkout new-branch
- создание ветки и переключение на нее в одну команду
git checkout -b new-branch
- удаление ветки
git branch -d branch-name
- переименование ветки
git branch -m old_name new_name
- просмотр веток
git branch -v
- просмотр всех веток вместе с удаленными
git branch -a
- просмотр только удаленных веток
git branch -r
- совместный просмотр и локальных и удаленных веток с подробной информацией
git branch -avv
- просмотр веток, влитых в текущую
git branch --merged
- просмотр веток, не влитых в текущую
git branch --no-merged
- Слияние веток
# все вливается в текущую ветку на которой вы находитесь, поэтому перед слиянием переключитесь на нужную ветку
git checkout branch1-name
# льем другую ветку в текущую
git merge --no-ff branch2-name
# если после слияния ветка не нужна, то можно ее удалить
git branch -d branch2-name
Работа с метками (тегами) источник
- просмотр списка тегов
git tag
- поиск по маске
git tag -l 'v1.4.*'
- создание аннотированной метки
git tag -a v1.4 -m 'my version 1.4'
- создание легковесной метки
git tag v1.4
- добавление метки на созданный ранее коммит
git tag -a v1.2 -m 'version 1.2' [код коммита]
- проталкивание данных о метках в удаленный репозиторий
# все
git push origin --tags
# одну конкретную
git push origin v1.5
Просмотр логов
- просмотр лога
https://git-scm.com/book/ru/v1/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%9F%D1%80%D0%BE%D1%81%D0%BC%D0%BE%D1%82%D1%80-%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D0%B8-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%BE%D0%B2
git log
git log -p
git log --pretty=oneline --graph
git log --pretty=format:"%h - %an, %ar : %s"
gitk //это GUI утилита, в линукс потребуется установка через sudo apt-get install gitk
- список коммитов, сделанных за последние две недели
git log --since=2.weeks
// так же можно указать дату например "2008-01-15",
// Опция --author позволяет фильтровать по автору, опция --grep позволяет искать по ключевым словам в сообщении
- поиск по сообщениям коммитов
git log --all --grep='some text'
Сравнение изменений
- сравнение текущих изменений с последним комитом
# все файлы
git diff HEAD
# определенный файл
git diff HEAD fileName.ext
- сравнение комитов между собой
git diff [commit_code_1] [commit_code_2]
- просмотр объема правок перед коммитом
git count-objects -vH
Работа с подмодулями
- привязка подмодуля
git submodule add <submodule_repo_path> path/to/submodule/folder
- первичная инициализация подмодулей
git submodule init
- получение/обновление содержимого подмодулей
git submodule update
- просмотр списка подмодулей
git submodule status
- Удаление подмодуля
mv a/submodule a/submodule_tmp
git submodule deinit -f -- a/submodule
rm -rf .git/modules/a/submodule
git rm -f a/submodule
# Note: a/submodule (no trailing slash)
# or, if you want to leave it in your working tree
git rm --cached a/submodule
mv a/submodule_tmp a/submodule
В случае получения ошибки “already exists in the index” при добавлении подмодуля:
#просмотреть наличие проиндексированных данных
git ls-files --stage projectfolder
# удалить данные из индекса
git rm --cached projectfolder
# повторно пытаемся добавить подмодуль
git add submodule <repo> <path>
Оптимизация репозитория
- Очистка логов
git reflog expire --all --expire=now
- Запуск сборщика мусора
git gc --prune=now --aggressive
Материалы для обучения
- Пошаговый учебник
- Видеокурс “Git для профессионалов” от http://pr-of-it.ru найдете при желании :)
- Статья о rebase и слиянии веток
- Обучающие видео http://monsterlessons.com/project/categories/git
- Полезные алиасы git команд https://habrahabr.ru/company/mailru/blog/318508/?utm_campaign=email_digest&utm_source=email_habrahabr&utm_medium=email_week_20170110&utm_content=link2post
- Шпаргалка по работе с Git http://eax.me/git-commands/
- Поддержание аккуратной истории в Git с помощью интерактивного rebase
установка средства сравнения
0.1) устанавливаем
sudo aptitude install meld
0.2) создаем скрипт питона
cd ~/scriptHelpers touch diff.py
#!/usr/bin/python
import sys
import os
os.system('meld "%s" "%s"' % (sys.argv[2], sys.argv[5]))
0.3) прописываем в настройках гита
git config –global diff.external ~/scriptHelpers/diff.py что бы отменить эту настройку используем git config –global –unset diff.external
Проверить что настройки применились git config –list
3) создание репозитория git init
добавление удаленного репозитория к текушему git remote add origin https://github.com/gdecider/tscc.git
проталкивание изменений в удаленный репозиторий git push -u origin master
клонирование репозитория в текущую папку git clone https://github.com/gdecider/tscc.git .
удаление файлов из подготовленных к коммиту
git rm –cached
(http://uleming.github.io/gitbook/4%D0%9E%D1%82%D0%BC%D0%B5%D0%BD%D0%B0%D0%B2git-%D0%A1%D0%B1%D1%80%D0%BE%D1%81,%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%D0%B8%D0%9E%D1%82%D0%BA%D0%B0%D1%82.html) (https://www.prolinux.org/post/korotkii-spravochnik-po-git-komandam/)
git reset –hard HEAD git clean -f
Это отбросит все сделанные изменения которые вы возможно добавили в индекс git, а также все другие изменения в вашей рабочем дереве. Другими словами, результат этого - вывод команд “git diff” и “git diff –cached” будет пустым.
About MELD http://meldmerge.org/help/
1) Installing Meld on Ubuntu (http://linuxpitstop.com/install-meld-on-ubuntu-and-mint-linux/)
sudo apt-get update sudo apt-get install meld
настройки можно внести в глобальный файл настроек гита, который находится ~/.gitconfig
[user]
name = decider_op
email = decider@ya.ru
[core]
editor = subl -n -w
[diff]
tool = meld
[difftool]
prompt = false
[merge]
tool = meld
[mergetool]
keepBackup = false
или через команды
git config –global diff.tool meld git config –global merge.tool meld . . . и т.д.
— !!!то что ниже не проверено
git config –global mergetool.meld.trustExitCode false
// Fix git mergetool meld –help error git config mergetool.meld.hasOutput true
Для доступа к репозиторию нужно добавить SSH ключ в настройках аккаунта github https://help.github.com/articles/connecting-to-github-with-ssh/
0) Проверим есть ли ключ на ПК с которого нужно соединиться ls -al ~/.ssh
1) Сгенерируем ключ, если нет существующего ssh-keygen -t rsa -b 4096 -C “your_email@example.com”
На вопрос об имени файла можно оставить имя по умолчанию
На вопрос о пароле введите пароль или оставьте его пустым
2) Привязка ключа в аккаунт github Для получения содержимомо ключа выведем его на экран
cat ~/.ssh/id_rsa.pub
Копируем то что вывелось в буфер обмена
Можно воспользоваться утилитой xcopy
В Вашем аккаунте GitHub идем в настройки, пункт SSH and GPG keys - New SSH key, вставляем скопированный ключ.
Добавление информации о публичном ключе на сервер
Вариант 1
ssh-copy-id <user_name>@<server_ip_on_domain>
Вариант 2
cat ~/.ssh/<your_ssh_key_name>.pub | ssh <user_name>@<server_ip_on_domain> "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"