{{tag>scm git}}

====== Git - распределённая система управления версиями. ======

===== Инструкции =====

{{:071433372a.png?200|}}  {{:18333fig0106-tn.png?200|}}  


===== Инициализация / init =====

<code bash>
$ git init
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
</code>

=== Linux/Unix/Macos ===

== global ==

<code bash>
$ git config --global core.filemode false
</code>

== local ==

<code bash>
$ git config core.filemode false
</code>

=== Windows ===

== global ==

<code bash>
$ git config --global core.filemode false
$ git config --global core.preloadindex true
$ git config --global core.fscache true
$ git config --global gc.auto 256
$ git config --global status.submoduleSummary false
</code>

== local ==

<code bash>
$ git config core.filemode false
$ git config core.preloadindex true
$ git config core.fscache true
$ git config gc.auto 256
$ git config status.submoduleSummary false
</code>

===== Конфигурация =====

==== Вывод установленных параметров ====

<code bash>
$ git config --local -l
</code>

=== Установка параметров ===

<code bash>
$ git config --local core.filemode true
</code>
===== Актуализация изменений =====

<code bash>
$ git checkout -- . && git pull && git submodule update --init --recursive
</code>

==== Локальное хранилище / stage ====

    * Добавление в индекс
      * **git add <имя_файла>**
      * **git add * **
      * **git add .**
      * **git add -A** - Добавить в индекс только удаленные файлы
    * Удаление из индекса 
      * **git rm <имя_файла>**
      * **git rm *.php**
      * **git reset** - Отменить индексацию последних изменений
      * **git rm --cached <ИМЯ_ФАЙЛА>** - Удалить из индекса файл и добавить в игнор. Файл останется в каталоге.
      * **git reset HEAD benchmarks.rb** - Отменить индексацию файла benchmarks.rb

==== Локальный репозиторий ===

  * **git clone** http://site.com/git
    * Фиксация изменений
      * **git commit -m "Описание коммита"**
      * **git checkout <hash-коммита>** - Переключиться на определенный коммит
      * **git commit --amend** - Удаление последнего коммита
    * Восстановление файлов из репозитория
      * **git checkout <branch>** # Перемещение указателя HEAD на комит или ветку
      * **git reset --hard HEAD~n** # Перемещение указателя HEAD на комит
      * **git checkout -- <имя_файла>** - восстановление файла из репозитория
      * **git reset --hard origin/master** - удалить все локальные изменения и коммиты
      * **git reset --hard origin/master**
      * **git reset --hard HEAD^** # Сбросить все локальные измеения до текущего состояния
    * Перемещение комитов
      * **git rebase -i HEAD~n** # Позволяет переупорядочивать, менять комменты, выборочно удалять и прочее
    * Ветвление branch
      * **git branch bug1** Создать ветку bug1 
      * **git branch -d bug1** Удалить ветку bug1
    * Пересадка веток / rebase 
      * **git rebase master** 
        - git checkout master # переключаемся на бранч master
        - git rebase bug1 # пересаживаем историю изменений ветки bug1 в master
      * или
        - git checkout bug1
        - git rebase master
        - git checkout master
        - git merge bug1 # При этом произойдет fast-forward merge

=== Отмена коммитов ===

== До комита ==

  * git reset --hard HEAD

== После комита ==

  * git reset --hard ORIG_HEAD

== Документация ==

  * http://githowto.com/ru/undoing_committed_changes
  * http://uleming.github.io/gitbook/3_%D0%A3%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2%D0%B5%D1%82%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC.html
==== Временное хранилище / Stash ====

Часто возникает такая ситуация, что пока вы работаете над частью своего проекта, всё находится в беспорядочном состоянии, а вам нужно переключить ветки, чтобы немного поработать над чем-то другим.
[[http://git-scm.com/book/ru/v1/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B-Git-%D0%9F%D1%80%D1%8F%D1%82%D0%B0%D0%BD%D1%8C%D0%B5|Подробнее...]]

Вместо **git reset --hard**, можно сначала файлы сохранять во временное хранилище, затем применять изменения.

  * **git stash** Поместить файлы во временное хранилище
  * **git stash apply** Применить последнее изменение из стека / лога к текущей рабочей копии
  * **git stash drop** Удалить последнее изменение в стеке / лога
  * **git stash list** Показать все изменения в стеке / логе
  * **git stash show** Показать последнее измененеие в стеке / логе (патч)
  * **git stash pop** Применить последнее изменение из стека к текущей рабочей копии и удалить его из стека
  * **git stash clear** Очистить стек изменений
==== Удаленный репозиторий / origin ====

    * Синхронизация
      * **git push origin master**
      * **git remote add origin <адрес_сервера>**

==== Submodule / Субмодули ====

  * git submodule add git@github.com:Mirocow/express-chat.git
  * git submodule update –init [express-chat]
  * git submodule update --init --recursive - обновить все зависимые модули (репозитории)
  * git rm -r yii2-mongodb - Удалить сабмодуль yii2-mongodb
  * **git rm -r yii2-redactor** - Удалить сабмодуль yii2-redactor :!:
  * **git submodule add -- /to/path/git/dir** - Добавить локальный модуль (Необходимо указывать только полный путь до папки) :!:

=== Как вынести код в отдельный репозитоий ===

Дано: 
  * Основной репозиторий **app/**
  * Необходимый код лежит тут **app/vendor/mirocow/yii2-redactor**
  * копируем код в отдельную папку и создаем репозитоий **путь-до-репозитория/yii2-redactor**
  * удаляем если есть уже ранее созданный модуль git rm -rf yii2-redactor
  * обязательно переходим в добавляемую папку **app/vendor/mirocow**
  * добавляем модуль как отдельный репозитоий из папки **git submodule add -f путь-до-репозитория/yii2-redactor/**

===== Отладка =====

==== GIT_CURL_VERBOSE ====

<code bash>
$ GIT_CURL_VERBOSE=1 git clone htps://...
</code>

==== GIT_TRACE ====

Принимает значаения 1, 2 или true

<code bash>
$ GIT_TRACE=2 git clone htps://...
</code>

===== Настройка =====

  * **git config color.ui true** - использовать цветной вывод в терминале

http://marklodato.github.io/visual-git-guide/index-ru.html?no-svg

===== Настройка deploy on github =====

Настройка github для работы с **Deploy keys** 

  * [[git:github:deploy]]

===== Ошибки =====

==== Ошибка: There is no tracking information for the current branch ====

При возникновении ошибки вида

<code bash>
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to rebase against.
See git-pull(1) for details

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream-to=origin/<branch> master
</code>

следует выполнить

<code bash>
$ git pull origin master
$ git branch --set-upstream-to=origin/master master
$ git pull
</code>
===== Видеоуроки =====

  * https://www.youtube.com/playlist?list=PLY4rE9dstrJyTdVJpv7FibSaXB4BHPInb

===== Документация =====

  * **[[unix:git:mini-doc|Мини документация]]** :!:
  * **[[unix:git:history-change|Редактирование истории в git]]**
  * 
  * https://git-scm.com/book/ru/v2/ - Pro Git (русский) ver 2 :!:
  * [[unix:git:gitignore]]
  * [[git:github:deploy]]
  * [[system:git-репозиторий_под_ubuntu]]
  * [[drupal:workflow-git]]
  * [[:git_vs_hg]]
  * [[unix:git]]
  * [[:git_vs_hg|GIT vs HG]]
  * [[unix:git:gitignore|.gitignore]]
  * http://gitimmersion.ru/
  * http://git-scm.com/book/ru
  * http://git-scm.com/book/ru/v1 :!:
  * http://www-cs-students.stanford.edu/~blynn/gitmagic/intl/ru :!:
  * [[develope:gitlab]]



===== Сервер =====

  * https://about.gitlab.com/ / https://github.com/gitlabhq/gitlabhq

===== Клиенты =====

  * [[software:smartgit]]
  * https://github.com/rowanj/gitx
  * https://www.sourcetreeapp.com/
===== Code Review =====

  * https://code.google.com/p/gerrit/
==== Ссылки ====

  * http://habrahabr.ru/post/174467/
  * [[http://www.redmine.org/boards/2/topics/15536|How to link to Git commit]]
  * [[http://book.git-scm.com/4_undoing_in_git_-_reset,_checkout_and_revert.html|Undoing in Git - Reset, Checkout and Revert]]
  * http://www-cs-students.stanford.edu/~blynn/gitmagic/intl/ru/index.html
  * http://marklodato.github.com/visual-git-guide/index-ru.html
  * [[http://habrahabr.ru/post/106912/|Удачная модель ветвления для Git]]
  * [[http://habrahabr.ru/post/60030/|Git Workflow]]
  * http://blog.nsws.ru/rabota-s-git-dlya-nachinayushhix.html
  * http://www-cs-students.stanford.edu/~blynn/gitmagic/intl/ru/ch02.html
  * http://lezhnevs.ru/git
  * http://lezhnevs.ru/git/submodule
  * http://lezhnevs.ru/git/kontrol-bazyi-dannyih-vmeste-s-faylami
  * http://rogerdudler.github.com/git-guide/index.ru.html
  * http://programilla.com/blog/siteconstruction/325.html
  * http://ignar.name/articles/git-create-remote-branch.html
  * http://blog.sectorit.net/development/430
  * http://habrahabr.ru/post/75990/
  * http://jetwalker.blogspot.ru/2012/01/receivedenycurrentbranch.html
  * http://stackoverflow.com/questions/2816369/git-push-error-remote-rejected-master-master-branch-is-currently-checked
  * [[http://stepansuvorov.com/blog/2014/07/how-to-update-the-git-fork/|How to update the git fork]]
  * [[http://habrahabr.ru/post/161009/|Git Rebase: руководство по использованию]]
  * [[http://habrahabr.ru/post/195674/|Тонкости благополучного git-merge]]
  * [[http://habrahabr.ru/post/157175/]]
  * http://www-cs-students.stanford.edu/~blynn/gitmagic/intl/ru/ch02.html
  * http://found-notes.blogspot.ru/
  * https://proglib.io/p/git-cheatsheet/
