From 02e357c5b491a2bf70be7e9b84b4be9392c4a2b7 Mon Sep 17 00:00:00 2001 From: Artem Buslov <33098513+buslov@users.noreply.github.com> Date: Sat, 2 Dec 2017 23:09:14 +0300 Subject: [PATCH] Added russian translations (#161) --- README_ru.md | 1272 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1272 insertions(+) create mode 100644 README_ru.md 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](https://badges.gitter.im/Join%20Chat.svg)](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 для просмотра состояния репозитория.