diff --git a/README_ru.md b/README_ru.md
new file mode 100644
index 0000000..dd04a52
--- /dev/null
+++ b/README_ru.md
@@ -0,0 +1,1272 @@
+# Правила полета на git
+
+#### Что это за "правила полета" такие?
+
+Есть [инструкции для астронавтов](http://www.jsc.nasa.gov/news/columbia/fr_generic.pdf) (а здесь подобное руководство для пользователей git) о том, как быть, если что-то пошло не так.
+
+> *Полетные правила* - это с большим трудом полученный запас знаний, записанный в форме инструкций, в которых указан последовательный порядок действий в разных ситуациях и сказано, почему нужно делать именно так. По сути это крайне подробный, стандартный план действий в ситуациях, развивающихся по прописанным сценариям. [...]
+
+> В НАСА фиксируют все наши промахи, аварии и методы решения проблем с начала 1960 х гг., когда наземные группы проекта Mercury начали составлять сборник "выученных уроков". Теперь в этом сборнике перечислены тысячи сложных ситуаций и их решения – от отказа двигателей, поломки ручек люка до проблем с компьютером.
+
+— Крис Хэдфилд, *Руководство астронавта по жизни на Земле* (перевод Дмитрия Лазарева).
+
+#### Соглашения для этого документа
+
+Для наглядности во всех примерах в этом документе используется измененное приглашение командной строки, чтобы показать текущую ветку и есть ли подготовленные изменения. Ветка заключена в кавычки, а символ `*` после ветки означает подготовленные изменения.
+
+[](https://gitter.im/k88hudson/git-flight-rules?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+
+
+**Содержание** *generated with [DocToc](https://github.com/thlorenz/doctoc)*
+
+ - [Редактирование коммитов](#%D0%A0%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%BE%D0%B2)
+ - [Что я только что сохранил?](#%D0%A7%D1%82%D0%BE-%D1%8F-%D1%82%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE-%D1%87%D1%82%D0%BE-%D1%81%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D0%BB)
+ - [Я неправильно написал сообщение коммита](#%D0%AF-%D0%BD%D0%B5%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE-%D0%BD%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D0%BB-%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%B0)
+ - [Я сделал коммит с неправильным именем автора и адресом электронной почты](#%D0%AF-%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D0%BB-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82-%D1%81-%D0%BD%D0%B5%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%BC-%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BC-%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D0%B0-%D0%B8-%D0%B0%D0%B4%D1%80%D0%B5%D1%81%D0%BE%D0%BC-%D1%8D%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9-%D0%BF%D0%BE%D1%87%D1%82%D1%8B)
+ - [Я хочу удалить файл из коммита](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D1%83%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C-%D1%84%D0%B0%D0%B9%D0%BB-%D0%B8%D0%B7-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%B0)
+ - [Я хочу удалить последний коммит](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D1%83%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C-%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B8%D0%B9-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82)
+ - [Удалить произвольный коммит](#%D0%A3%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82)
+ - [Я пытаюсь опубликовать исправленный коммит, но получаю сообщение об ошибке](#%D0%AF-%D0%BF%D1%8B%D1%82%D0%B0%D1%8E%D1%81%D1%8C-%D0%BE%D0%BF%D1%83%D0%B1%D0%BB%D0%B8%D0%BA%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-%D0%B8%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82-%D0%BD%D0%BE-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B0%D1%8E-%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BE%D0%B1-%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B5)
+ - [Я случайно сделал жесткий сброс (--hard) и теперь хочу вернуть свои изменения](#%D0%AF-%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D0%BE-%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D0%BB-%D0%B6%D0%B5%D1%81%D1%82%D0%BA%D0%B8%D0%B9-%D1%81%D0%B1%D1%80%D0%BE%D1%81---hard-%D0%B8-%D1%82%D0%B5%D0%BF%D0%B5%D1%80%D1%8C-%D1%85%D0%BE%D1%87%D1%83-%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C-%D1%81%D0%B2%D0%BE%D0%B8-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F)
+ - [Подготовка изменений (staging)](#%D0%9F%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B0-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9-staging)
+ - [Мне нужно добавить подготовленные изменения в предыдущий коммит](#%D0%9C%D0%BD%D0%B5-%D0%BD%D1%83%D0%B6%D0%BD%D0%BE-%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D0%BF%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B2-%D0%BF%D1%80%D0%B5%D0%B4%D1%8B%D0%B4%D1%83%D1%89%D0%B8%D0%B9-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82)
+ - [Я хочу подготовить только часть файла, а не весь файл целиком](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%BF%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%B8%D1%82%D1%8C-%D1%82%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE-%D1%87%D0%B0%D1%81%D1%82%D1%8C-%D1%84%D0%B0%D0%B9%D0%BB%D0%B0-%D0%B0-%D0%BD%D0%B5-%D0%B2%D0%B5%D1%81%D1%8C-%D1%84%D0%B0%D0%B9%D0%BB-%D1%86%D0%B5%D0%BB%D0%B8%D0%BA%D0%BE%D0%BC)
+ - [Я хочу добавить изменения одного файла в два разных коммита](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F-%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE-%D1%84%D0%B0%D0%B9%D0%BB%D0%B0-%D0%B2-%D0%B4%D0%B2%D0%B0-%D1%80%D0%B0%D0%B7%D0%BD%D1%8B%D1%85-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%B0)
+ - [Я хочу подготовить свои неподготовленные правки и убрать из подготовки то, что уже подготовлено](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%BF%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%B8%D1%82%D1%8C-%D1%81%D0%B2%D0%BE%D0%B8-%D0%BD%D0%B5%D0%BF%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D0%BF%D1%80%D0%B0%D0%B2%D0%BA%D0%B8-%D0%B8-%D1%83%D0%B1%D1%80%D0%B0%D1%82%D1%8C-%D0%B8%D0%B7-%D0%BF%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B8-%D1%82%D0%BE-%D1%87%D1%82%D0%BE-%D1%83%D0%B6%D0%B5-%D0%BF%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%BE)
+ - [Неподготовленные правки](#%D0%9D%D0%B5%D0%BF%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D0%BF%D1%80%D0%B0%D0%B2%D0%BA%D0%B8)
+ - [Я хочу переместить мои неподготовленные правки в новую ветку](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C-%D0%BC%D0%BE%D0%B8-%D0%BD%D0%B5%D0%BF%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D0%BF%D1%80%D0%B0%D0%B2%D0%BA%D0%B8-%D0%B2-%D0%BD%D0%BE%D0%B2%D1%83%D1%8E-%D0%B2%D0%B5%D1%82%D0%BA%D1%83)
+ - [Я хочу переместить неподготовленные правки в другую существующую ветку](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C-%D0%BD%D0%B5%D0%BF%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D0%BF%D1%80%D0%B0%D0%B2%D0%BA%D0%B8-%D0%B2-%D0%B4%D1%80%D1%83%D0%B3%D1%83%D1%8E-%D1%81%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D1%83%D1%8E%D1%89%D1%83%D1%8E-%D0%B2%D0%B5%D1%82%D0%BA%D1%83)
+ - [Я хочу отменить мои локальные несохраненные изменения](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%BE%D1%82%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C-%D0%BC%D0%BE%D0%B8-%D0%BB%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%BD%D0%B5%D1%81%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F)
+ - [Я хочу отменить некоторые неподготовленные изменения](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%BE%D1%82%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C-%D0%BD%D0%B5%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5-%D0%BD%D0%B5%D0%BF%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F)
+ - [Я хочу отбросить неподготовленные изменения в некоторых файлах](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%BE%D1%82%D0%B1%D1%80%D0%BE%D1%81%D0%B8%D1%82%D1%8C-%D0%BD%D0%B5%D0%BF%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B2-%D0%BD%D0%B5%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D1%85-%D1%84%D0%B0%D0%B9%D0%BB%D0%B0%D1%85)
+ - [Я хочу убрать все мои локальные изменения](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D1%83%D0%B1%D1%80%D0%B0%D1%82%D1%8C-%D0%B2%D1%81%D0%B5-%D0%BC%D0%BE%D0%B8-%D0%BB%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F)
+ - [Ветки](#%D0%92%D0%B5%D1%82%D0%BA%D0%B8)
+ - [Создать ветку на определенном коммите](#%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D1%82%D1%8C-%D0%B2%D0%B5%D1%82%D0%BA%D1%83-%D0%BD%D0%B0-%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%BC-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%B5)
+ - [Я стянул изменения (pull) из неправильной ветки или в неправильную ветку](#%D0%AF-%D1%81%D1%82%D1%8F%D0%BD%D1%83%D0%BB-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F-pull-%D0%B8%D0%B7-%D0%BD%D0%B5%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9-%D0%B2%D0%B5%D1%82%D0%BA%D0%B8-%D0%B8%D0%BB%D0%B8-%D0%B2-%D0%BD%D0%B5%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D1%83%D1%8E-%D0%B2%D0%B5%D1%82%D0%BA%D1%83)
+ - [Я хочу отменить локальные коммиты, чтобы моя ветка стала такой же как на сервере](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%BE%D1%82%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C-%D0%BB%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D1%8B-%D1%87%D1%82%D0%BE%D0%B1%D1%8B-%D0%BC%D0%BE%D1%8F-%D0%B2%D0%B5%D1%82%D0%BA%D0%B0-%D1%81%D1%82%D0%B0%D0%BB%D0%B0-%D1%82%D0%B0%D0%BA%D0%BE%D0%B9-%D0%B6%D0%B5-%D0%BA%D0%B0%D0%BA-%D0%BD%D0%B0-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5)
+ - [Я сохранил коммит в ветку master вместо новой ветки](#%D0%AF-%D1%81%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D0%BB-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82-%D0%B2-%D0%B2%D0%B5%D1%82%D0%BA%D1%83-master-%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%BE-%D0%BD%D0%BE%D0%B2%D0%BE%D0%B9-%D0%B2%D0%B5%D1%82%D0%BA%D0%B8)
+ - [Я хочу сохранить файл целиком из другого ref-ish](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D1%81%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D1%82%D1%8C-%D1%84%D0%B0%D0%B9%D0%BB-%D1%86%D0%B5%D0%BB%D0%B8%D0%BA%D0%BE%D0%BC-%D0%B8%D0%B7-%D0%B4%D1%80%D1%83%D0%B3%D0%BE%D0%B3%D0%BE-ref-ish)
+ - [Я сделал несколько коммитов в одной ветке, а нужно было сохранять их в разных ветках](#%D0%AF-%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D0%BB-%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%BE%D0%B2-%D0%B2-%D0%BE%D0%B4%D0%BD%D0%BE%D0%B9-%D0%B2%D0%B5%D1%82%D0%BA%D0%B5-%D0%B0-%D0%BD%D1%83%D0%B6%D0%BD%D0%BE-%D0%B1%D1%8B%D0%BB%D0%BE-%D1%81%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D1%8F%D1%82%D1%8C-%D0%B8%D1%85-%D0%B2-%D1%80%D0%B0%D0%B7%D0%BD%D1%8B%D1%85-%D0%B2%D0%B5%D1%82%D0%BA%D0%B0%D1%85)
+ - [Я хочу удалить локальные ветки, которые были удалены в upstream](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D1%83%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C-%D0%BB%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%B2%D0%B5%D1%82%D0%BA%D0%B8-%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5-%D0%B1%D1%8B%D0%BB%D0%B8-%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D1%8B-%D0%B2-upstream)
+ - [Я нечаянно удалил мою ветку](#%D0%AF-%D0%BD%D0%B5%D1%87%D0%B0%D1%8F%D0%BD%D0%BD%D0%BE-%D1%83%D0%B4%D0%B0%D0%BB%D0%B8%D0%BB-%D0%BC%D0%BE%D1%8E-%D0%B2%D0%B5%D1%82%D0%BA%D1%83)
+ - [Я хочу удалить ветку](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D1%83%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C-%D0%B2%D0%B5%D1%82%D0%BA%D1%83)
+ - [Я хочу переименовать ветку](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%BF%D0%B5%D1%80%D0%B5%D0%B8%D0%BC%D0%B5%D0%BD%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-%D0%B2%D0%B5%D1%82%D0%BA%D1%83)
+ - [Я хочу перейти на удаленную ветку, над которой работает кто-то еще](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%BF%D0%B5%D1%80%D0%B5%D0%B9%D1%82%D0%B8-%D0%BD%D0%B0-%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%BD%D1%83%D1%8E-%D0%B2%D0%B5%D1%82%D0%BA%D1%83-%D0%BD%D0%B0%D0%B4-%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D0%BE%D0%B9-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82-%D0%BA%D1%82%D0%BE-%D1%82%D0%BE-%D0%B5%D1%89%D0%B5)
+ - [Я хочу создать новую удаленную ветку из текущей локальной](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D1%82%D1%8C-%D0%BD%D0%BE%D0%B2%D1%83%D1%8E-%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%BD%D1%83%D1%8E-%D0%B2%D0%B5%D1%82%D0%BA%D1%83-%D0%B8%D0%B7-%D1%82%D0%B5%D0%BA%D1%83%D1%89%D0%B5%D0%B9-%D0%BB%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9)
+ - [Перебазирование (rebase) и слияние (merge)](#%D0%9F%D0%B5%D1%80%D0%B5%D0%B1%D0%B0%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-rebase-%D0%B8-%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5-merge)
+ - [Я хочу отменить перебазирование/слияние](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%BE%D1%82%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C-%D0%BF%D0%B5%D1%80%D0%B5%D0%B1%D0%B0%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5)
+ - [Я сделал перебазирование, но я не хочу делать принудительный push](#%D0%AF-%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D0%BB-%D0%BF%D0%B5%D1%80%D0%B5%D0%B1%D0%B0%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BD%D0%BE-%D1%8F-%D0%BD%D0%B5-%D1%85%D0%BE%D1%87%D1%83-%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C-%D0%BF%D1%80%D0%B8%D0%BD%D1%83%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9-push)
+ - [Я хочу объединить коммиты](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%BE%D0%B1%D1%8A%D0%B5%D0%B4%D0%B8%D0%BD%D0%B8%D1%82%D1%8C-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D1%8B)
+ - [Безопасная стратегия слияния](#%D0%91%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%B0%D1%8F-%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%B5%D0%B3%D0%B8%D1%8F-%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D1%8F)
+ - [Мне нужно слить ветку в единственный коммит](#%D0%9C%D0%BD%D0%B5-%D0%BD%D1%83%D0%B6%D0%BD%D0%BE-%D1%81%D0%BB%D0%B8%D1%82%D1%8C-%D0%B2%D0%B5%D1%82%D0%BA%D1%83-%D0%B2-%D0%B5%D0%B4%D0%B8%D0%BD%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82)
+ - [Я хочу объединить только неопубликованные коммиты](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%BE%D0%B1%D1%8A%D0%B5%D0%B4%D0%B8%D0%BD%D0%B8%D1%82%D1%8C-%D1%82%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE-%D0%BD%D0%B5%D0%BE%D0%BF%D1%83%D0%B1%D0%BB%D0%B8%D0%BA%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D1%8B)
+ - [Мне нужно прервать слияние](#%D0%9C%D0%BD%D0%B5-%D0%BD%D1%83%D0%B6%D0%BD%D0%BE-%D0%BF%D1%80%D0%B5%D1%80%D0%B2%D0%B0%D1%82%D1%8C-%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5)
+ - [Проверить, что все коммиты ветви были слиты](#%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%B8%D1%82%D1%8C-%D1%87%D1%82%D0%BE-%D0%B2%D1%81%D0%B5-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D1%8B-%D0%B2%D0%B5%D1%82%D0%B2%D0%B8-%D0%B1%D1%8B%D0%BB%D0%B8-%D1%81%D0%BB%D0%B8%D1%82%D1%8B)
+ - [Возможные проблемы интерактивного перебазирования](#%D0%92%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D1%8B%D0%B5-%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D1%8B-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BF%D0%B5%D1%80%D0%B5%D0%B1%D0%B0%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)
+ - [Экран перебазирования говорит 'noop'](#%D0%AD%D0%BA%D1%80%D0%B0%D0%BD-%D0%BF%D0%B5%D1%80%D0%B5%D0%B1%D0%B0%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-%D0%B3%D0%BE%D0%B2%D0%BE%D1%80%D0%B8%D1%82-noop)
+ - [Здесь были конфликты](#%D0%97%D0%B4%D0%B5%D1%81%D1%8C-%D0%B1%D1%8B%D0%BB%D0%B8-%D0%BA%D0%BE%D0%BD%D1%84%D0%BB%D0%B8%D0%BA%D1%82%D1%8B)
+ - [Отложенные изменения (stash)](#%D0%9E%D1%82%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F-stash)
+ - [Отложить все правки](#%D0%9E%D1%82%D0%BB%D0%BE%D0%B6%D0%B8%D1%82%D1%8C-%D0%B2%D1%81%D0%B5-%D0%BF%D1%80%D0%B0%D0%B2%D0%BA%D0%B8)
+ - [Отложить заданные файлы](#%D0%9E%D1%82%D0%BB%D0%BE%D0%B6%D0%B8%D1%82%D1%8C-%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5-%D1%84%D0%B0%D0%B9%D0%BB%D1%8B)
+ - [Отложить с сообщением](#%D0%9E%D1%82%D0%BB%D0%BE%D0%B6%D0%B8%D1%82%D1%8C-%D1%81-%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC)
+ - [Применить заданный stash из списка](#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C-%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9-stash-%D0%B8%D0%B7-%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0)
+ - [Разное](#%D0%A0%D0%B0%D0%B7%D0%BD%D0%BE%D0%B5)
+ - [Клонировать все субмодули](#%D0%9A%D0%BB%D0%BE%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-%D0%B2%D1%81%D0%B5-%D1%81%D1%83%D0%B1%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B8)
+ - [Удалить субмодуль](#%D0%A3%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C-%D1%81%D1%83%D0%B1%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C)
+ - [Удалить метку](#%D0%A3%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C-%D0%BC%D0%B5%D1%82%D0%BA%D1%83)
+ - [Восстановить удаленную метку](#%D0%92%D0%BE%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C-%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%BD%D1%83%D1%8E-%D0%BC%D0%B5%D1%82%D0%BA%D1%83)
+ - [Удаленный патч](#%D0%A3%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9-%D0%BF%D0%B0%D1%82%D1%87)
+ - [Отслеживание файлов](#%D0%9E%D1%82%D1%81%D0%BB%D0%B5%D0%B6%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2)
+ - [Я хочу изменить регистр в имени файла, не меняя содержимое файла.](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C-%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80-%D0%B2-%D0%B8%D0%BC%D0%B5%D0%BD%D0%B8-%D1%84%D0%B0%D0%B9%D0%BB%D0%B0-%D0%BD%D0%B5-%D0%BC%D0%B5%D0%BD%D1%8F%D1%8F-%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%BC%D0%BE%D0%B5-%D1%84%D0%B0%D0%B9%D0%BB%D0%B0)
+ - [Я хочу переписать локальные файлы при выполнении git pull.](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%BF%D0%B5%D1%80%D0%B5%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C-%D0%BB%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D1%84%D0%B0%D0%B9%D0%BB%D1%8B-%D0%BF%D1%80%D0%B8-%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B8-git-pull)
+ - [Я хочу удалить файл из git, но оставить сам файл](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D1%83%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C-%D1%84%D0%B0%D0%B9%D0%BB-%D0%B8%D0%B7-git-%D0%BD%D0%BE-%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D1%81%D0%B0%D0%BC-%D1%84%D0%B0%D0%B9%D0%BB)
+ - [Я хочу откатить файл до заданной ревизии](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%BE%D1%82%D0%BA%D0%B0%D1%82%D0%B8%D1%82%D1%8C-%D1%84%D0%B0%D0%B9%D0%BB-%D0%B4%D0%BE-%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%BD%D0%BE%D0%B9-%D1%80%D0%B5%D0%B2%D0%B8%D0%B7%D0%B8%D0%B8)
+ - [Конфигурация](#%D0%9A%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D1%8F)
+ - [Я хочу добавить псевдонимы для некоторых команд git](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D0%BF%D1%81%D0%B5%D0%B2%D0%B4%D0%BE%D0%BD%D0%B8%D0%BC%D1%8B-%D0%B4%D0%BB%D1%8F-%D0%BD%D0%B5%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D1%85-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4-git)
+ - [Я хочу добавить в свой репозиторий пустую папку](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D0%B2-%D1%81%D0%B2%D0%BE%D0%B9-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B9-%D0%BF%D1%83%D1%81%D1%82%D1%83%D1%8E-%D0%BF%D0%B0%D0%BF%D0%BA%D1%83)
+ - [Я хочу сохранить имя пользователя и пароль для репозитория](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D1%81%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D1%82%D1%8C-%D0%B8%D0%BC%D1%8F-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F-%D0%B8-%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8C-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F)
+ - [Я хочу, чтобы Git игнорировал изменения разрешений и прав файлов](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D1%87%D1%82%D0%BE%D0%B1%D1%8B-git-%D0%B8%D0%B3%D0%BD%D0%BE%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BB-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F-%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B8-%D0%BF%D1%80%D0%B0%D0%B2-%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2)
+ - [Я не представляю что я сделал неправильно](#%D0%AF-%D0%BD%D0%B5-%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D1%8F%D1%8E-%D1%87%D1%82%D0%BE-%D1%8F-%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D0%BB-%D0%BD%D0%B5%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE)
+- [Другие ресурсы](#%D0%94%D1%80%D1%83%D0%B3%D0%B8%D0%B5-%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B)
+ - [Книги](#%D0%9A%D0%BD%D0%B8%D0%B3%D0%B8)
+ - [Учебники](#%D0%A3%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA%D0%B8)
+ - [Скрипты и инструменты](#%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D1%8B-%D0%B8-%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B)
+ - [Графические клиенты](#%D0%93%D1%80%D0%B0%D1%84%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5-%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D1%8B)
+
+
+
+
+## Редактирование коммитов
+
+
+### Что я только что сохранил?
+
+Допустим, Вы не глядя сохранили изменения с помощью `git commit -a` и теперь не уверены что именно сохранили. В таком случае Вы можете просмотреть последний коммит в HEAD с помощью:
+
+```sh
+(master)$ git show
+```
+
+или
+
+```sh
+$ git log -n1 -p
+```
+
+
+### Я неправильно написал сообщение коммита
+
+Если Вы неправильно сохранили коммит, но еще не сделали `push`, то для исправления сообщения коммита сделайте следующее:
+
+```sh
+$ git commit --amend
+```
+Это откроет текстовый редактор по-умолчанию, в котором Вы сможете исправить сообщение. С другой стороны Вы можете сделать это одной командой:
+
+```sh
+$ git commit --amend -m 'xxxxxxx'
+```
+
+Если Вы уже сделали `push`, то Вы по-прежнему можете исправить коммит, но после этого придется делать `push` с принудительной перезаписью, что не рекомендуется.
+
+
+### Я сделал коммит с неправильным именем автора и адресом электронной почты
+
+Если это один коммит, то исправьте его с помощью `amend`
+
+```sh
+$ git commit --amend --author "New Authorname "
+```
+
+Если Вам нужно изменить всю историю, то смотрите документацию для 'git filter-branch'.
+
+
+
+### Я хочу удалить файл из коммита
+
+Чтобы удалить файл из коммита, сделайте следующее:
+
+```sh
+$ git checkout HEAD^ myfile
+$ git add myfile
+$ git commit --amend --no-edit
+```
+
+Это особенно полезно, когда у Вас открытый патч, а Вы сохранили ненужный файл и теперь нужно сделать принудительный `push` для обновления патча в удаленном репозитории. Опция `--no-edit` оставляет прежнее сообщение коммита без изменений.
+
+
+### Я хочу удалить последний коммит
+
+Если хотите удалить опубликованные коммиты, воспользуйтесь приведенным ниже приемом. Однако, это бесповоротно изменит у Вас историю git, а также испортит историю git у любого, что уже стянул (pull) изменения из репозитория. Короче говоря, никогда так не делайте, если не уверены.
+
+```sh
+$ git reset HEAD^ --hard
+$ git push --force-with-lease [remote] [branch]
+```
+
+Если Вы еще не опубликовали коммит, то просто сбросьте ветку в состояние перед Вашим последним коммитом (подготовленные изменения не пропадут):
+
+```
+(my-branch*)$ git reset --soft HEAD@{1}
+
+```
+
+Это работает, если Вы еще не сделали `push`. Если Вы уже сделали `push`, то единственный по-настоящему безопасный способ это `git revert SHAofBadCommit`. Это создаст новый коммит, который отменит все изменения предыдущего коммита. Или, если ветка, в которую вы делаете `push` безопасна для перезаписи (т.е. не предполагается, другие разработчики будут стягивать из нее изменения), то просто используйте `git push --force-with-lease`. Подробнее см. [в этом пункте выше](#delete-pushed-commit).
+
+
+### Удалить произвольный коммит
+
+Здесь уместны те же предупреждения, что и в пункте выше. По возможности, никогда так не делайте.
+
+```sh
+$ git rebase --onto SHA1_OF_BAD_COMMIT^ SHA1_OF_BAD_COMMIT
+$ git push --force-with-lease [remote] [branch]
+```
+
+Или сделайте [интерактивное перебазирование](#interactive-rebase) и удалите строки ненужных коммитов.
+
+
+### Я пытаюсь опубликовать исправленный коммит, но получаю сообщение об ошибке
+
+```sh
+To https://github.com/yourusername/repo.git
+! [rejected] mybranch -> mybranch (non-fast-forward)
+error: failed to push some refs to 'https://github.com/tanay1337/webmaker.org.git'
+hint: Updates were rejected because the tip of your current branch is behind
+hint: its remote counterpart. Integrate the remote changes (e.g.
+hint: 'git pull ...') before pushing again.
+hint: See the 'Note about fast-forwards' in 'git push --help' for details.
+```
+
+Напомним, что подобно перебазированию (см. ниже), исправление коммита (amend) **заменяет старый коммит новым**, поэтому Вы должны делать принудительный `push` (`--force-with-lease`) Ваших изменений, если хотите заменить уже опубликованные на удаленном репозитории коммиты. Будьте осторожны, когда так делаете – *всегда* проверяйте с какой веткой Вы проводите эти действия!
+
+```sh
+(my-branch)$ git push origin mybranch --force-with-lease
+```
+
+В общем, **избегайте делать принудительный push**. Лучше создать и опубликовать еще один коммит, чем переписывать измененные коммиты, т.к. это приведет к конфликтам истории у других разработчиков, которые работают с этой или дочерними ветками. `--force-with-lease` по-прежнему выдаст ошибку, если кто-то одновременно с Вами работает с данной веткой и Ваш принудительный push переписал бы чужие изменения.
+
+Если Вы *абсолютно* уверены, что никто кроме Вас не работает с данной веткой или Вы хотите обновить вершину ветви в любом случае, то используйте `--force` (`-f`), но вообще этого следует избегать.
+
+
+### Я случайно сделал жесткий сброс (--hard) и теперь хочу вернуть свои изменения
+
+Если Вы случайно сделали `git reset --hard`, то вы можете вернуть назад коммиты, т.к. git несколько дней хранит все действия в журнале.
+
+Замечание: Это относится только если ваша работа была сохранена, т.е. Вы сделали коммит или stash. `git reset --hard` _удалит_ несохраненные изменения, так что пользуйтесь им с осторожностью. (Безопасная опция это `git reset --keep`.)
+
+```sh
+(master)$ git reflog
+```
+
+Вы увидете список Ваших предыдущих коммитов и коммит для сброса. Выберите SHA коммита, который хотите вернуть и снова сделайте сброс:
+
+```sh
+(master)$ git reset --hard SHA1234
+```
+
+И Вы сможете продолжить работу.
+
+## Подготовка изменений (staging)
+
+
+### Мне нужно добавить подготовленные изменения в предыдущий коммит
+
+```sh
+(my-branch*)$ git commit --amend
+
+```
+
+
+### Я хочу подготовить только часть файла, а не весь файл целиком
+
+Обычно, если хотите подготовить часть файл, Вы запускаете:
+
+```sh
+$ git add --patch filename.x
+```
+
+`-p` - сокращение для `--patch`. Это откроет интерактивный режим. Вы сможете разбить коммит с помощью опции `s`, однако, если файл новый, то у Вас не будет такой возможности. При добавлении нового файла делайте так:
+
+```sh
+$ git add -N filename.x
+```
+
+Затем используйте опцию `e` для ручного выбора строк. Запустив `git diff --cached` или
+`git diff --staged`, Вы увидите какие строки вы подготовили по-сравнению с тем, что сохранено в рабочей копии.
+
+
+
+### Я хочу добавить изменения одного файла в два разных коммита
+
+`git add` добавляет в коммит весь файл целиком. `git add -p` позволяет интерактивно выбрать изменения, которые Вы хотите добавить.
+
+
+
+### Я хочу подготовить свои неподготовленные правки и убрать из подготовки то, что уже подготовлено
+
+Это сложно. Лучшее, что я смог придумать это отложить (stash) неподготовленные изменения. Затем сделать сброс. После этого вернуть отложенные изменения и добавить их.
+
+```sh
+$ git stash -k
+$ git reset --hard
+$ git stash pop
+$ git add -A
+```
+
+## Неподготовленные правки
+
+
+### Я хочу переместить мои неподготовленные правки в новую ветку
+
+```sh
+$ git checkout -b my-branch
+```
+
+
+### Я хочу переместить неподготовленные правки в другую существующую ветку
+
+```sh
+$ git stash
+$ git checkout my-branch
+$ git stash pop
+```
+
+
+### Я хочу отменить мои локальные несохраненные изменения
+
+Это уберет из индекса все подготовленные изменения:
+
+```sh
+$ git reset
+```
+
+Это удалит все локальные изменения, которые не были сохранены или добавлены в индекс (нужно запускать из корня репозитория):
+
+```sh
+$ git checkout .
+```
+
+Вы также можете отменить несохраненные изменения в определенном файле или папке:
+
+```sh
+$ git checkout [some_dir|file.txt]
+```
+
+Еще один способ отменить все несохраненные изменения (длиннее, зато работает в любой папке):
+
+```sh
+$ git reset --hard HEAD
+```
+
+Это удалит все локальные неотслеживаемые файлы, так что останутся только отслеживаемые:
+
+```sh
+$ git clean -fdx
+```
+
+ПРЕДУПРЕЖДЕНИЕ: -x удалит также и игнорируемые файлы!
+
+
+### Я хочу отменить некоторые неподготовленные изменения
+
+Когда Вы хотите избавиться от некоторых, но не всех изменений в Вашей рабочей копии.
+
+Сделайте checkout ненужных изменений, оставив нужные.
+
+```sh
+$ git checkout -p
+# Отвечайте `y` для всех фрагментов, которые Вы хотите выбросить
+```
+
+Другим подходом является использование stash. Отложите все хорошие изменения, сбросьте рабочую копию и верните отложенные хорошие изменения.
+
+```sh
+$ git stash -p
+# Выберите фрагменты, которые Вы хотите сохранить
+$ git reset --hard
+$ git stash pop
+```
+
+В качестве альтернативы, отложите ненужные изменения, а затем выбросьте их.
+
+```sh
+$ git stash -p
+# Выберите фрагменты, которые Вы не хотите сохранять
+$ git stash drop
+```
+
+### Я хочу отбросить неподготовленные изменения в некоторых файлах
+
+Когда Вы хотите убрать изменения какого-то файла в Вашей рабочей копии.
+
+```sh
+$ git checkout myFile
+```
+
+Чтобы убрать изменения в нескольких файлах, перечислите их имена.
+
+```sh
+$ git checkout myFirstFile mySecondFile
+```
+
+### Я хочу убрать все мои локальные изменения
+
+Когда Вы хотите убрать все несохраненные локальные изменения.
+
+```sh
+$ git checkout .
+```
+
+## Ветки
+
+### Создать ветку на определенном коммите
+```sh
+$ git checkout -b
+```
+
+
+
+### Я стянул изменения (pull) из неправильной ветки или в неправильную ветку
+
+Это очередная возможность воспользоваться `git reflog`, чтобы посмотреть куда указывала ваша HEAD перед неправильным pull.
+
+```sh
+(master)$ git reflog
+ab7555f HEAD@{0}: pull origin wrong-branch: Fast-forward
+c5bc55a HEAD@{1}: checkout: checkout message goes here
+```
+
+Просто сбросьте ветку обратно на требуемый коммит:
+
+```sh
+$ git reset --hard c5bc55a
+```
+
+Готово.
+
+
+### Я хочу отменить локальные коммиты, чтобы моя ветка стала такой же как на сервере
+
+Подтвердите, что не хотите отправлять изменения на сервер.
+
+`git status` покажет на сколько коммитов Вы опережаете источник:
+
+```sh
+(my-branch)$ git status
+# On branch my-branch
+# Your branch is ahead of 'origin/my-branch' by 2 commits.
+# (use "git push" to publish your local commits)
+#
+```
+
+Один из способов сбросить до источника (чтобы иметь то же, что и в удаленном репозитории):
+
+```sh
+(master)$ git reset --hard origin/my-branch
+```
+
+
+### Я сохранил коммит в ветку master вместо новой ветки
+
+Создайте новую ветку, оставаясь на master:
+
+```sh
+(master)$ git branch my-branch
+```
+
+Сбросьте ветку master к предыдущему коммиту:
+
+```sh
+(master)$ git reset --hard HEAD^
+```
+
+`HEAD^` - это сокращение для `HEAD^1`. Это подставляет первого предка `HEAD`, подобно этому `HEAD^2` подставляет второго предка коммита (слияния могут иметь 2 предков).
+
+Заметьте, что `HEAD^2` это **не** то же самое, что `HEAD~2` (для подробностей см. [эту ссылку](http://www.paulboxley.com/blog/2011/06/git-caret-and-tilde)).
+
+Если не хотите использовать `HEAD^`, то найдите хэш коммита, на который Вы хотите установить ветку (`git log` может помочь в этом). Затем сделайте сброс к этому хэшу. С помощью `git push` удостоверьтесь, что эти изменения отражены в удаленном репозитории.
+
+К примеру, ветка master обязана находится на коммите с хэшем `a13b85e`:
+
+```sh
+(master)$ git reset --hard a13b85e
+HEAD is now at a13b85e
+```
+
+Перейти на новую ветку для продолжения работы:
+
+```sh
+(master)$ git checkout my-branch
+```
+
+
+### Я хочу сохранить файл целиком из другого ref-ish
+
+Скажем, у Вас рабочий spike (см. заметку) на сотни изменений. Всё работает. Теперь Вы сохраняете эту работу в другую ветку:
+
+```sh
+(solution)$ git add -A && git commit -m "Добавлены все изменения из этого рывка в один большой коммит."
+```
+
+Когда Вы хотите поместить его в ветку (например `feature` или `develop`), Вы хотите сохранять по целым файлам. А также Вы хотите разбить большой коммит на несколько небольших.
+
+Скажем, Вы имеете:
+
+ * ветку `solution` с решением к Вашему spike. На один коммит впереди `develop`.
+ * ветку `develop`, куда Вы хотите добавить Ваши изменения.
+
+Вы можете выполнить это, перенеся содержимое файла в Вашу ветку:
+
+```sh
+(develop)$ git checkout solution -- file1.txt
+```
+
+Это скопирует содержимое данного файла из ветки `solution` в ветку `develop`:
+
+```sh
+# On branch develop
+# Your branch is up-to-date with 'origin/develop'.
+# Changes to be committed:
+# (use "git reset HEAD ..." to unstage)
+#
+# modified: file1.txt
+```
+
+Теперь сделайте коммит как обычно.
+
+Заметка: Spike-решения делаются для анализа или решения проблемы. Эти решения используют, чтобы оценить проблему, и отбрасывают сразу же, как только все получают ясное представление о проблеме. ~ [Wikipedia](https://en.wikipedia.org/wiki/Extreme_programming_practices).
+
+
+### Я сделал несколько коммитов в одной ветке, а нужно было сохранять их в разных ветках
+
+Скажем, Вы в ветке master. Запустив `git log`, Вы увидите, что сделали два коммита:
+
+```sh
+(master)$ git log
+
+commit e3851e817c451cc36f2e6f3049db528415e3c114
+Author: Alex Lee
+Date: Tue Jul 22 15:39:27 2014 -0400
+
+ Bug #21 - Added CSRF protection
+
+commit 5ea51731d150f7ddc4a365437931cd8be3bf3131
+Author: Alex Lee
+Date: Tue Jul 22 15:39:12 2014 -0400
+
+ Bug #14 - Fixed spacing on title
+
+commit a13b85e984171c6e2a1729bb061994525f626d14
+Author: Aki Rose
+Date: Tue Jul 21 01:12:48 2014 -0400
+
+ First commit
+```
+
+Обратим внимание на ссылки на каждый баг (`e3851e8` для #21, `5ea5173` для #14).
+
+Во-первых, сбросим ветку master на правильный коммит (`a13b85e`):
+
+```sh
+(master)$ git reset --hard a13b85e
+HEAD is now at a13b85e
+```
+
+Теперь, мы может создать новую ветку для бага #21:
+
+```sh
+(master)$ git checkout -b 21
+(21)$
+```
+
+Теперь сделаем *cherry-pick* коммита для бага #21 на верх нашей ветки. Это значит, что мы помещаем этот и только этот коммит напрямую на вершину ветки, какой бы она ни была.
+
+```sh
+(21)$ git cherry-pick e3851e8
+```
+
+На этом этапе есть вероятность конфликтов. О том как разрешить конфликты см. в главе [**Здесь были конфликты**](#merge-conflict) в [разделе интерактивное перебазирование выше](#interactive-rebase).
+
+
+Теперь давайте создадим новую ветку для бага #14, которая также основана на master
+
+```sh
+(21)$ git checkout master
+(master)$ git checkout -b 14
+(14)$
+```
+
+И наконец, сделаем cherry-pick коммита для бага #14:
+
+```sh
+(14)$ git cherry-pick 5ea5173
+```
+
+
+
+### Я хочу удалить локальные ветки, которые были удалены в upstream
+Как только Вы слили пулл-реквест на github, Вам предлагают удалить слитую ветку из Вашего форка. Если Вы не планируете продолжать работу в этой ветке, то для поддержания рабочей копии в чистоте Вы можете удалить локальные копии ненужных веток, чтобы не путаться в них.
+
+```sh
+$ git fetch -p
+```
+
+
+### Я нечаянно удалил мою ветку
+
+Если Вы регулярно отправляете изменения в удаленное хранилище, большую часть времени Вы в безопасности. Но в один прекрасный момент Вы всё же можете случайно удалить Ваши ветки. Скажем, мы создали ветку и создали новый файл:
+
+```sh
+(master)$ git checkout -b my-branch
+(my-branch)$ git branch
+(my-branch)$ touch foo.txt
+(my-branch)$ ls
+README.md foo.txt
+```
+
+Давайте добавим его и сохраним.
+
+```sh
+(my-branch)$ git add .
+(my-branch)$ git commit -m 'foo.txt added'
+(my-branch)$ foo.txt added
+ 1 files changed, 1 insertions(+)
+ create mode 100644 foo.txt
+(my-branch)$ git log
+
+commit 4e3cd85a670ced7cc17a2b5d8d3d809ac88d5012
+Author: siemiatj
+Date: Wed Jul 30 00:34:10 2014 +0200
+
+ foo.txt added
+
+commit 69204cdf0acbab201619d95ad8295928e7f411d5
+Author: Kate Hudson
+Date: Tue Jul 29 13:14:46 2014 -0400
+
+ Fixes #6: Force pushing after amending commits
+```
+
+Теперь мы переключаемся обратно на master и 'нечаянно' удаляем нашу ветку.
+
+```sh
+(my-branch)$ git checkout master
+Switched to branch 'master'
+Your branch is up-to-date with 'origin/master'.
+(master)$ git branch -D my-branch
+Deleted branch my-branch (was 4e3cd85).
+(master)$ echo О, нет, моя ветка удалена!
+О, нет, моя ветка удалена!
+```
+
+На этом этапе Вы должны быть знакомы с 'reflog' (расширенный журнал). Он хранит историю всех действий в репозитории.
+
+```
+(master)$ git reflog
+69204cd HEAD@{0}: checkout: moving from my-branch to master
+4e3cd85 HEAD@{1}: commit: foo.txt added
+69204cd HEAD@{2}: checkout: moving from master to my-branch
+```
+
+Как мы можем видеть, у нас есть хэш коммита из удаленной ветки. Посмотрим, можем ли мы восстановить удаленную ветку.
+
+```sh
+(master)$ git checkout -b my-branch-help
+Switched to a new branch 'my-branch-help'
+(my-branch-help)$ git reset --hard 4e3cd85
+HEAD is now at 4e3cd85 foo.txt added
+(my-branch-help)$ ls
+README.md foo.txt
+```
+
+Вуаля! Мы вернули наш удаленный файл обратно. Git reflog также бывает полезен, когда перебазирование срабатывает не так, как Вы хотели.
+
+
+### Я хочу удалить ветку
+
+Чтобы удалить ветку на удаленном репозитории:
+
+```sh
+(master)$ git push origin --delete my-branch
+```
+
+Вы также можете сделать:
+
+```sh
+(master)$ git push origin :my-branch
+```
+
+Чтобы удалить локальную ветку:
+
+```sh
+(master)$ git branch -D my-branch
+```
+
+
+### Я хочу переименовать ветку
+
+Чтобы переименовать текущую локальную ветку:
+
+```sh
+(master)$ git branch -m new-name
+```
+
+Чтобы переименовать другую локальную ветку:
+
+```sh
+(master)$ git branch -m old-name new-name
+```
+
+
+### Я хочу перейти на удаленную ветку, над которой работает кто-то еще
+
+Во-первых, получим все ветки из удаленного репозитория:
+
+```sh
+(master)$ git fetch --all
+```
+
+Скажем, Вы хотите перейти на `daves` из удаленного репозитория.
+
+```sh
+(master)$ git checkout --track origin/daves
+Branch daves set up to track remote branch daves from origin.
+Switched to a new branch 'daves'
+```
+
+(`--track` - это сокращение для `git checkout -b [branch] [remotename]/[branch]`)
+
+Это создаст Вам локальную копию ветки `daves` и после `push` обновления также появятся в удаленном репозитории.
+
+
+### Я хочу создать новую удаленную ветку из текущей локальной
+
+
+```sh
+$ git config push.default upstream
+$ git push -u origin HEAD
+```
+
+Если Вы хотите узнать какие еще настройки по-умолчанию может принимать ```git push```, обратитесь к документации на Git https://git-scm.com/docs/git-config#git-config-pushdefault
+
+Если Вы не хотите изменять настройку git, можете использовать:
+
+```sh
+$ git push -u HEAD
+```
+
+В режиме ```upstream``` или в режиме ```simple``` (по-умолчанию в Git 2.0), следующая команда отправит текущую ветку в удаленную ветку, которая была ранее зарегистрирована с помощью -u :
+
+```sh
+$ git push
+```
+
+Поведение других режимов ```git push``` описано в документации на push.default.
+
+
+## Перебазирование (rebase) и слияние (merge)
+
+
+### Я хочу отменить перебазирование/слияние
+
+Вы можете слить/перебазировать Вашу ветку с неправильной веткой. А также бывают случаи, когда Вы не можете предугадать успешно ли завершится процесс перебазирования/слияния. Git сохраняет исходный указатель HEAD в переменную ORIG_HEAD перед тем как приступить к опасным операциям, так что вернуть ветку на состояние до перебазирования/слияния просто.
+
+```sh
+(my-branch)$ git reset --hard ORIG_HEAD
+```
+
+
+### Я сделал перебазирование, но я не хочу делать принудительный push
+
+К сожалению, вы должны сделать принудительный push, если хотите, чтобы изменения были отражены на удаленной ветке. Это потому что у вас есть перемотанный (fast-forward) коммит и измененная история git. Удаленная ветка не примет изменения, если не сделать принудительный push. Это одна из основных причин, по которым большинство людей основывает свой рабочий процесс на слиянии вместо перебазирования - большие команды могут столкнуться с проблемами, если разработчики будут делать принудительный `push`. Используйте это с осторожностью. Безопасный способ использовать перебазирование - это не отражать Ваши изменения напрямую на удаленную ветку, а вместо этого делать следующее:
+
+```sh
+(master)$ git checkout my-branch
+(my-branch)$ git rebase -i master
+(my-branch)$ git checkout master
+(master)$ git merge --ff-only my-branch
+```
+
+Чтобы узнать больше, см. [эту SO ветку](http://stackoverflow.com/questions/11058312/how-can-i-use-git-rebase-without-requiring-a-forced-push).
+
+
+### Я хочу объединить коммиты
+
+Предположим, что Вы работаете в ветке, которая стала или станет пулл-реквестом в `master`. В простейшем случае когда всё, что Вы хотите сделать - это объединить *все* коммиты в один единственный коммит и Вам не важны временные метки, Вы можете сделать сброс и заново сделать коммит. Убедитесь, что ветка master обновлена и Ваши изменения сохранены, затем:
+
+```sh
+(my-branch)$ git reset --soft master
+(my-branch)$ git commit -am "New awesome feature"
+```
+
+Если Вы хотите больше контроля, а также сохранить метки времени, Вам нужно сделать кое-что, называемое интерактивным перебазированием:
+
+```sh
+(my-branch)$ git rebase -i master
+```
+
+Если Вы не работаете с другой веткой, можете делать перебазирование относительно Вашей `HEAD`. Например, если Вы хотите объединить последние два коммита, Вам нужно делать перебазирование относительно `HEAD~2`. Для последних 3 - `HEAD~3` и т.д.
+
+```sh
+(master)$ git rebase -i HEAD~2
+```
+
+После того, как запустите интерактивное перебазирование, Вы увидите нечто подобное в Вашем текстовом редакторе:
+
+```vim
+pick a9c8a1d Some refactoring
+pick 01b2fd8 New awesome feature
+pick b729ad5 fixup
+pick e3851e8 another fix
+
+# Rebase 8074d12..b729ad5 onto 8074d12
+#
+# Commands:
+# p, pick = use commit
+# r, reword = use commit, but edit the commit message
+# e, edit = use commit, but stop for amending
+# s, squash = use commit, but meld into previous commit
+# f, fixup = like "squash", but discard this commit's log message
+# x, exec = run command (the rest of the line) using shell
+#
+# These lines can be re-ordered; they are executed from top to bottom.
+#
+# If you remove a line here THAT COMMIT WILL BE LOST.
+#
+# However, if you remove everything, the rebase will be aborted.
+#
+# Note that empty commits are commented out
+```
+
+Все строки, начинающиеся с `#` являются комментариями и не оказывают влияния на перебазирование.
+
+Теперь замените команды `pick` на команды, перечисленные ниже. Также Вы можете удалить коммиты, удалив соответствующие строки.
+
+Например, если Вы хотите **оставить только старейший коммит и объединить все последующие коммиты во второй коммит**, Вам нужно рядом с каждым коммитом кроме первого и второго вместо `pick` написать `f`:
+
+```vim
+pick a9c8a1d Some refactoring
+pick 01b2fd8 New awesome feature
+f b729ad5 fixup
+f e3851e8 another fix
+```
+
+Если Вы хотите объединить эти коммиты **и переименовать коммит**, Вам нужно дополнительно добавить `r` рядом со вторым коммитом или просто используйте `s` вместо `f`:
+
+```vim
+pick a9c8a1d Some refactoring
+pick 01b2fd8 New awesome feature
+s b729ad5 fixup
+s e3851e8 another fix
+```
+
+Теперь Вы можете переименовать коммит в следующем запросе, который появится.
+
+```vim
+Newer, awesomer features
+
+# Please enter the commit message for your changes. Lines starting
+# with '#' will be ignored, and an empty message aborts the commit.
+# rebase in progress; onto 8074d12
+# You are currently editing a commit while rebasing branch 'master' on '8074d12'.
+#
+# Changes to be committed:
+# modified: README.md
+#
+
+```
+
+Если всё успешно, Вы увидите что-то вроде:
+
+```sh
+(master)$ Successfully rebased and updated refs/heads/master.
+```
+
+#### Безопасная стратегия слияния
+`--no-commit` производит слияние, но не делает коммит результата, давая пользователю возможность проверить и доработать результат слияния перед коммитом. `no-ff` сохраняет доказательства того, что когда-то существовала ветка feature, сохраняя цельность истории проекта.
+
+```sh
+(master)$ git merge --no-ff --no-commit my-branch
+```
+
+#### Мне нужно слить ветку в единственный коммит
+
+```sh
+(master)$ git merge --squash my-branch
+```
+
+
+#### Я хочу объединить только неопубликованные коммиты
+
+Иногда у Вас бывает несколько временных коммитов, которые Вы хотите объединить перед публикацией в upstream. Вы не хотите ненароком объединить свои коммиты с уже опубликованными, потому что кто-то уже мог работать с ними.
+
+```sh
+(master)$ git rebase -i @{u}
+```
+
+Это выполнит интерактивное перебазирование со списком еще не опубликованных коммитов и Вы сможете безопасно упорядочить/исправить/объединить коммиты из списка.
+
+
+#### Мне нужно прервать слияние
+
+Иногда слияние может создавать проблемы в некоторых файлах. В таких случаях мы можем воспользоваться опцией `abort` для прерывания текущего процесса разрешения конфликтов и попробовать вернуться к состоянию перед слиянием.
+
+```sh
+(my-branch)$ git merge --abort
+```
+
+Эта команда доступна начиная с версии git >= 1.7.4
+
+
+### Проверить, что все коммиты ветви были слиты
+
+Для проверки того, что все коммиты ветки слиты в другую ветку, Вам нужно сравнить вершины (или любые коммиты) этих ветвей:
+
+```sh
+(master)$ git log --graph --left-right --cherry-pick --oneline HEAD...feature/120-on-scroll
+```
+
+Это расскажет Вам обо всех коммитах, которые есть в одной, но отсутствуют в другой ветке и выдаст список всех различий ветвей. Или можете сделать так:
+
+```sh
+(master)$ git log master ^feature/120-on-scroll --no-merges
+```
+
+### Возможные проблемы интерактивного перебазирования
+
+
+#### Экран перебазирования говорит 'noop'
+
+Если Вы видите это:
+```
+noop
+```
+
+Это значит, что Вы пытаетесь сделать перебазирование в ветку, которая уже имеет идентичный коммит или она *впереди* текущей ветки. Вы может попробовать:
+
+* удостовериться что Ваша ветка master находится там, где она должна быть
+* вместо этого перебазировать `HEAD~2` или что-то более раннее
+
+
+#### Здесь были конфликты
+
+Если Вам не удается успешно завершить перебазирование, то, возможно, Вам придется разрешать конфликты.
+
+Для начала запустите `git status`, чтобы увидеть какие файлы содержат конфликты:
+
+```sh
+(my-branch)$ git status
+On branch my-branch
+Changes not staged for commit:
+ (use "git add ..." to update what will be committed)
+ (use "git checkout -- ..." to discard changes in working directory)
+
+ both modified: README.md
+```
+
+В данном примере `README.md` содержит конфликты. Откройте файл и взгляните на следующее:
+
+```vim
+ <<<<<<< HEAD
+ some code
+ =========
+ some code
+ >>>>>>> new-commit
+```
+
+Вам нужно выбрать между кодом, который был добавлен в Вашем новом коммите (в данном примере, это все от средней линии до `new-commit`) и Вашей `HEAD`.
+
+Если Вы хотите сохранить версию из какой-то одной ветки, то используйте `--ours` или `--theirs`:
+
+```sh
+(master*)$ git checkout --ours README.md
+```
+
+- Во время *слияния* используйте `--ours` для сохранения изменений из локальной ветки или `--theirs` для сохранения изменений из другой ветки.
+- Во время *перебазирования* используйте `--theirs` для сохранения изменений из локальной ветки или `--ours` для сохранения изменений из другой ветки. Для объяснения такого обмена см. [эту заметку в документации git](https://git-scm.com/docs/git-rebase#git-rebase---merge).
+
+Если слияние более сложное, можете воспользоваться визуальным редактором различий:
+
+```sh
+(master*)$ git mergetool -t opendiff
+```
+
+После разрешения всех конфликтов и тестирования кода подготовьте файлы, которые Вы изменили `git add`, а затем продолжите перебазирование с помощью `git rebase --continue`
+
+```sh
+(my-branch)$ git add README.md
+(my-branch)$ git rebase --continue
+```
+
+Если после разрешения всех конфликтов, Вы получили точно такое же дерево, какое было перед коммитом, то вместо этого Вам нужно сделать `git rebase --skip`.
+
+В любой момент Вы можете остановить перебазирование и вернуть ветку в начальное состояние, выполнив:
+
+```sh
+(my-branch)$ git rebase --abort
+```
+
+## Отложенные изменения (stash)
+
+
+### Отложить все правки
+
+Чтобы отложить все правки в рабочем каталоге
+
+```sh
+$ git stash
+```
+
+Если Вы хотите отложить заодно и неотслеживаемые файлы, добавьте опцию `-u`.
+
+```sh
+$ git stash -u
+```
+
+
+### Отложить заданные файлы
+
+Отложить только один файл из рабочей папки
+
+```sh
+$ git stash push working-directory-path/filename.ext
+```
+
+Отложить несколько файлов из рабочей папки
+
+```sh
+$ git stash push working-directory-path/filename1.ext working-directory-path/filename2.ext
+```
+
+
+### Отложить с сообщением
+
+```sh
+$ git stash save
+```
+
+
+### Применить заданный stash из списка
+
+Во-первых, проверьте список отложенных изменений, используя
+
+```sh
+$ git stash list
+```
+
+Затем примените заданный stash из списка, используя
+
+```sh
+$ git stash apply "stash@{n}"
+```
+
+Здесь 'n' показывает позицию stash-а в стеке. Верхний stash имеет позицию 0.
+
+
+
+## Разное
+
+
+### Клонировать все субмодули
+
+```sh
+$ git clone --recursive git://github.com/foo/bar.git
+```
+
+Если уже клонированы:
+
+```sh
+$ git submodule update --init --recursive
+```
+
+
+### Удалить субмодуль
+
+Создание субмодуля довольно прямолинейно, чего не скажешь об удалении. Команды, которые Вам нужны:
+
+```sh
+$ git submodule deinit submodulename
+$ git rm submodulename
+$ git rm --cached submodulename
+$ rm -rf .git/modules/submodulename
+```
+
+
+### Удалить метку
+
+```sh
+$ git tag -d
+$ git push :refs/tags/
+```
+
+
+### Восстановить удаленную метку
+
+Если хотите восстановить метку, которая была удалена, Вы можете сделать следующее: во-первых, Вам нужно найти недостижимую метку:
+
+```sh
+$ git fsck --unreachable | grep tag
+```
+
+Запомните для себя хэш метки. Затем восстановите удаленную метку, используя команду git [update-ref](http://git-scm.com/docs/git-update-ref):
+
+```sh
+$ git update-ref refs/tags/
+```
+
+Ваша метка была восстановлена.
+
+
+### Удаленный патч
+
+Если кто-то прислал Вам пулл-реквест на GitHub, но потом удалил свой форк, то вы не сможете клонировать его репозиторий или использовать `git am`, поскольку [.diff, .patch](https://github.com/blog/967-github-secrets) URL'ы становятся недоступными. Но Вы можете сделать `checkout` самого пулл-реквеста используя [специальные GitHub's refs](https://gist.github.com/piscisaureus/3342247). Для получения содержимого PR#1 в новую ветку с названием pr_1:
+
+```sh
+$ git fetch origin refs/pull/1/head:pr_1
+From github.com:foo/bar
+ * [new ref] refs/pull/1/head -> pr_1
+```
+
+## Отслеживание файлов
+
+
+### Я хочу изменить регистр в имени файла, не меняя содержимое файла.
+
+```sh
+(master)$ git mv --force myfile MyFile
+```
+
+
+### Я хочу переписать локальные файлы при выполнении git pull.
+
+```sh
+(master)$ git fetch --all
+(master)$ git reset --hard origin/master
+```
+
+
+### Я хочу удалить файл из git, но оставить сам файл
+
+```sh
+(master)$ git rm --cached log.txt
+```
+
+
+### Я хочу откатить файл до заданной ревизии
+
+Полагая, что хэш желаемого коммита c5f567:
+
+```sh
+(master)$ git checkout c5f567 -- file1/to/restore file2/to/restore
+```
+
+Если вы хотите откатить файл к состоянию на 1 коммит раньше, чем c5f567, задайте хэш коммита как c5f567~1:
+
+```sh
+(master)$ git checkout c5f567~1 -- file1/to/restore file2/to/restore
+```
+
+## Конфигурация
+
+
+### Я хочу добавить псевдонимы для некоторых команд git
+
+В OS X и Linux Ваш файл конфигурации git хранится в ```~/.gitconfig```. В качестве примера я добавил некоторые псевдонимы, которые сам использую для краткости (а также некоторые из моих типичных опечаток), в раздел ```[alias]``` как показано ниже:
+
+```vim
+[alias]
+ a = add
+ amend = commit --amend
+ c = commit
+ ca = commit --amend
+ ci = commit -a
+ co = checkout
+ d = diff
+ dc = diff --changed
+ ds = diff --staged
+ f = fetch
+ loll = log --graph --decorate --pretty=oneline --abbrev-commit
+ m = merge
+ one = log --pretty=oneline
+ outstanding = rebase -i @{u}
+ s = status
+ unpushed = log @{u}
+ wc = whatchanged
+ wip = rebase -i @{u}
+ zap = fetch -p
+```
+
+
+### Я хочу добавить в свой репозиторий пустую папку
+
+Вы не можете этого сделать! Git просто не поддерживает этого, но есть уловка. Вы можете создать файл .gitignore в папке со следующим содержанием:
+
+```
+ # Игнорировать всё в этой папке
+ *
+ # Кроме этого файла
+ !.gitignore
+```
+
+Другой общеиспользуемый способ - это создать в папке пустой файл с названием .gitkeep.
+
+```sh
+$ mkdir mydir
+$ touch mydir/.gitkeep
+```
+
+Вы можете назвать его просто .keep , в этом случае вторая строка выше будет ```touch mydir/.keep```
+
+
+### Я хочу сохранить имя пользователя и пароль для репозитория
+
+У Вас может быть репозиторий, требующий авторизации. В этом случае вы можете сохранить на время имя пользователя и пароль, и Вам не потребуется вводить их при каждом вызове push / pull. Помощник по учетным записям сделает это за Вас.
+
+```sh
+$ git config --global credential.helper cache
+# Включает кэширование памяти учетных записей
+```
+
+```sh
+$ git config --global credential.helper 'cache --timeout=3600'
+# Задает таймаут для кэша 1 час (задается в секундах)
+```
+
+
+### Я хочу, чтобы Git игнорировал изменения разрешений и прав файлов
+
+```sh
+$ git config core.fileMode false
+```
+
+Если Вы хотите задать это поведение по-умолчанию для всех авторизованных пользователей, тогда используйте:
+
+```sh
+$ git config --global core.fileMode false
+```
+
+
+## Я не представляю что я сделал неправильно
+
+Итак, Вы в затруднении - Вы сбросили что-то или Вы слили неправильную ветку, или Вы отправили изменения с принудительной перезаписью и теперь Вы не можете найти свои коммиты. Вы знаете, что в какой-то момент было всё в порядке и Вы хотите вернуться к этому состоянию.
+
+Как раз для этого и нужен `git reflog`. `reflog` отслеживает все изменения вершины ветки, даже если на эту вершину не указывает ни единая ветвь или метка. В принципе, всякий раз при изменении HEAD, в reflog добавляется новая запись. К сожалению, это работает только с локальными репозиториями и отслеживаются только движения (а не, например, изменения файла, которые не были никуда записаны).
+
+```sh
+(master)$ git reflog
+0a2e358 HEAD@{0}: reset: moving to HEAD~2
+0254ea7 HEAD@{1}: checkout: moving from 2.2 to master
+c10f740 HEAD@{2}: checkout: moving from master to 2.2
+```
+
+reflog выше показывает переход с ветки master на ветку 2.2 и обратно. Затем происходит жесткий сброс на старый коммит. Самое последнее действие находится вверху с надписью `HEAD@{0}`.
+
+Если Вы случайно переместитесь назад, то reflog будет содержать коммит (0254ea7), на который указывала ветка master до того, как Вы случайно выбросили 2 коммита.
+
+```sh
+$ git reset --hard 0254ea7
+```
+
+С помощью git reset можно вернуть ветку master обратно на коммит, на котором она была прежде. Это обеспечивает безопасность при случайном изменении истории.
+
+(взято из [Источник](https://www.atlassian.com/git/tutorials/rewriting-history/git-reflog)).
+
+
+# Другие ресурсы
+
+## Книги
+
+* [Pro Git](https://git-scm.com/book/en/v2) - великолепная книга Скотта Чакона
+* [Git Internals](https://github.com/pluralsight/git-internals-pdf) - еще одна великолепная книга Скотта Чакона
+
+## Учебники
+
+* [Изучаем ветвление в Git](https://learngitbranching.js.org/) Интерактивный веб-учебник по ветвлению/слиянию/перебазированию
+* [Getting solid at Git rebase vs. merge](https://medium.com/@porteneuve/getting-solid-at-git-rebase-vs-merge-4fa1a48c53aa)
+* [git-workflow](https://github.com/asmeurer/git-workflow) - Руководство от [Aaron Meurer](https://github.com/asmeurer) по использованию git в совместной разработке проектов с открытым исходным кодом
+* [GitHub как рабочий процесс](http://hugogiraudel.com/2015/08/13/github-as-a-workflow/) - Интересный подход к использованию GitHub в качестве рабочего процесса, в частности с пустыми пулл-реквестами
+* [Githug](https://github.com/Gazler/githug) - Игра для изучения более общих рабочих процессов git
+
+## Скрипты и инструменты
+
+* [firstaidgit.io](http://firstaidgit.io/) Выборка наиболее частых вопросов и ответов по git c поиском
+* [git-extra-commands](https://github.com/unixorn/git-extra-commands) - сборник полезных дополнительных скриптов для git
+* [git-extras](https://github.com/tj/git-extras) - GIT utilities -- статистика репозитория, REPL, генерация журнала изменений, статистика по авторам изменений и многое другое
+* [git-fire](https://github.com/qw3rtman/git-fire) - git-fire - это плагин для Git, который предупреждает при потенциально опасных действиях, таких как: добавление всех файлов из текущей папки, создание коммита и публикация измений в новую ветку (для предотвращения конфликтов при слиянии).
+* [git-tips](https://github.com/git-tips/tips) - Краткие советы по git
+* [git-town](https://github.com/Originate/git-town) - Общая высокоуровневая поддержка рабочего процесса Git! http://www.git-town.com
+
+## Графические клиенты
+* [GitKraken](https://www.gitkraken.com/) - роскошный Git-клиент для Windows, Mac и Linux
+* [git-cola](https://git-cola.github.io/) - еще один git-клиент для Windows и OS X
+* [GitUp](https://github.com/git-up/GitUp) - новый графический клиент, имеющий весьма своеобразные методы работы со сложностями git
+* [gitx-dev](https://rowanj.github.io/gitx/) - еще один графический git-клиент для OS X
+* [Source Tree](https://www.sourcetreeapp.com/) - свободный графический git-клиент для Windows и OS X
+* [Tower](http://www.git-tower.com/) - графический git-клиент для OS X (платный)
+* [tig](https://jonas.github.io/tig/) - консольный текстовый интерфейс для Git
+* [Magit](https://magit.vc/) - интерфейс для git, реализованный в виде модуля Emacs.
+* [GitExtensions](https://github.com/gitextensions/gitextensions) - расширение оболочки, плагин для Visual Studio 2010-2015 и автономный инструмент для управления репозиториями Git.
+* [Fork](https://git-fork.com/) - быстрый и дружелюбный git-клиент для Mac (бета)
+* [gmaster](https://gmaster.io/) - git-клиент для Windows с трехсторонним слиянием, обнаружением рефакторинга, семантическим сравнением и слиянием (бета)
+* [gitk](https://git-scm.com/docs/gitk) - git-клиент под Linux для просмотра состояния репозитория.