Редактировать

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

Материалы для обучения

установка средства сравнения

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 если это папка, то добавляем флаг -r для рекурсивного удаления

(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"