mirror of
https://github.com/k88hudson/git-flight-rules.git
synced 2025-03-10 12:48:43 -03:00
* make a readme make a new readme for Korean * git-flight-rule 번역 중간과정 01 브랜치 부분에서 한번 커밋 * git-flight-rule 번역 중간과정 02 머지 시작 * git-flight-rule 번역 1차 종료후 점검 * 점검 후 첫 완료 * 오타 수정 몇가지 수정 * 네비게이션 링크 추가 * 표현 수정
1569 lines
95 KiB
Markdown
1569 lines
95 KiB
Markdown
# Правила полета на Git
|
||
|
||
🌍
|
||
*[English](README.md) ∙ [Español](README_es.md) ∙ [Русский](README_ru.md) ∙ [简体中文](README_zh-CN.md)∙ [한국어](README_kr.md)*
|
||
|
||
#### Что это за "правила полета" такие?
|
||
|
||
Есть [инструкции для астронавтов](https://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)
|
||
|
||
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
|
||
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
||
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
||
|
||
- [Репозитории](#%D0%A0%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B8)
|
||
- [Я хочу создать локальный репозиторий](#%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%BB%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%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%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%BA%D0%BB%D0%BE%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%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%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%BF%D1%80%D0%B5%D0%B4%D1%8B%D0%B4%D1%83%D1%89%D0%B5%D0%B3%D0%BE-%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%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%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%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%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%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%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%D1%81%D0%B5-%D0%BD%D0%B5%D0%BE%D1%82%D1%81%D0%BB%D0%B5%D0%B6%D0%B8%D0%B2%D0%B0%D0%B5%D0%BC%D1%8B%D0%B5-%D1%84%D0%B0%D0%B9%D0%BB%D1%8B)
|
||
- [Ветки](#%D0%92%D0%B5%D1%82%D0%BA%D0%B8)
|
||
- [Я хочу получить список всех веток](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C-%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA-%D0%B2%D1%81%D0%B5%D1%85-%D0%B2%D0%B5%D1%82%D0%BE%D0%BA)
|
||
- [Создать ветку на определенном коммите](#%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-%D1%83%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C-%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE-%D0%B2%D0%B5%D1%82%D0%BE%D0%BA)
|
||
- [Я хочу переименовать ветку](#%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)
|
||
- [Я хочу настроить локальную ветку на отслеживание удаленной (upstream) ветки](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C-%D0%BB%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D1%83%D1%8E-%D0%B2%D0%B5%D1%82%D0%BA%D1%83-%D0%BD%D0%B0-%D0%BE%D1%82%D1%81%D0%BB%D0%B5%D0%B6%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9-upstream-%D0%B2%D0%B5%D1%82%D0%BA%D0%B8)
|
||
- [Я хочу настроить HEAD на отслеживание основной удаленной ветки](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C-head-%D0%BD%D0%B0-%D0%BE%D1%82%D1%81%D0%BB%D0%B5%D0%B6%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%BE%D0%B9-%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9-%D0%B2%D0%B5%D1%82%D0%BA%D0%B8)
|
||
- [Я сделал изменения в неправильной ветке](#%D0%AF-%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D0%BB-%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%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%B5)
|
||
- [Перебазирование (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%9F%D0%BE%D0%B8%D1%81%D0%BA)
|
||
- [Я хочу найти строку в коммитах](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%BD%D0%B0%D0%B9%D1%82%D0%B8-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D1%83-%D0%B2-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%B0%D1%85)
|
||
- [Я хочу искать по автору или сохранившему изменения (committer)](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%B8%D1%81%D0%BA%D0%B0%D1%82%D1%8C-%D0%BF%D0%BE-%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D1%83-%D0%B8%D0%BB%D0%B8-%D1%81%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D0%B2%D1%88%D0%B5%D0%BC%D1%83-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F-committer)
|
||
- [Я хочу получить список коммитов, содержащих заданный файл](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C-%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%BE%D0%B2-%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D1%89%D0%B8%D1%85-%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9-%D1%84%D0%B0%D0%B9%D0%BB)
|
||
- [Найти метки для заданного коммита](#%D0%9D%D0%B0%D0%B9%D1%82%D0%B8-%D0%BC%D0%B5%D1%82%D0%BA%D0%B8-%D0%B4%D0%BB%D1%8F-%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%B0)
|
||
- [Субмодули](#%D0%A1%D1%83%D0%B1%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B8)
|
||
- [Клонировать все субмодули](#%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%A0%D0%B0%D0%B7%D0%BD%D0%BE%D0%B5)
|
||
- [Восстановить удаленный файл](#%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%8B%D0%B9-%D1%84%D0%B0%D0%B9%D0%BB)
|
||
- [Удалить метку](#%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)
|
||
- [Экспорт репозитория в Zip-файл](#%D0%AD%D0%BA%D1%81%D0%BF%D0%BE%D1%80%D1%82-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F-%D0%B2-zip-%D1%84%D0%B0%D0%B9%D0%BB)
|
||
- [Отслеживание файлов](#%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%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C-%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B2-%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%BD%D0%BE%D0%BC-%D1%84%D0%B0%D0%B9%D0%BB%D0%B5-%D0%B8%D0%B7-%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%BE%D0%B2-%D0%B8%D0%BB%D0%B8-%D0%B2%D0%B5%D1%82%D0%BE%D0%BA)
|
||
- [Конфигурация](#%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-%D1%85%D0%BE%D1%87%D1%83-%D0%B7%D0%B0%D0%B4%D0%B0%D1%82%D1%8C-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5-%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%B2-%D0%B3%D0%BB%D0%BE%D0%B1%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0%D1%85)
|
||
- [Я хочу настроить цветовую схему для командной строки Git](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C-%D1%86%D0%B2%D0%B5%D1%82%D0%BE%D0%B2%D1%83%D1%8E-%D1%81%D1%85%D0%B5%D0%BC%D1%83-%D0%B4%D0%BB%D1%8F-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D0%BE%D0%B9-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8-git)
|
||
- [Я не представляю что я сделал неправильно](#%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)
|
||
|
||
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
||
|
||
## Репозитории
|
||
|
||
### Я хочу создать локальный репозиторий
|
||
|
||
Чтобы создать репозиторий Git в текущей папке:
|
||
|
||
```sh
|
||
(my-folder) $ git init
|
||
```
|
||
|
||
### Я хочу клонировать удаленный репозиторий
|
||
|
||
Чтобы клонировать (копировать) удаленный репозиторий, скопируйте адрес репозиторий и запустите:
|
||
|
||
```sh
|
||
$ git clone [url]
|
||
```
|
||
|
||
Git сохранит копию в папке с названием репозитория. Убедитесь, что у Вас есть соединение с удаленным сервером, откуда Вы клонируете (в большинстве случаев это означает наличие выхода в Интернет).
|
||
|
||
Чтобы клонировать в папку с произвольным именем:
|
||
|
||
```sh
|
||
$ git clone [url] name-of-new-folder
|
||
```
|
||
|
||
## Редактирование коммитов
|
||
|
||
<a name="diff-last"></a>
|
||
|
||
### Что я только что сохранил?
|
||
|
||
Допустим, Вы не глядя сохранили изменения с помощью `git commit -a` и теперь не уверены что именно сохранили. В таком случае Вы можете просмотреть последний коммит в HEAD с помощью:
|
||
|
||
```sh
|
||
(master)$ git show
|
||
```
|
||
|
||
Или
|
||
|
||
```sh
|
||
$ git log -n1 -p
|
||
```
|
||
|
||
Если Вы хотите просмотреть файл из определенного коммита, Вы можете сделать так (`<commitid>` - нужный Вам коммит):
|
||
|
||
```sh
|
||
$ git show <commitid>:filename
|
||
```
|
||
|
||
### Я неправильно написал сообщение коммита
|
||
|
||
Если Вы неправильно сохранили коммит, но еще не сделали `push`, то для исправления сообщения коммита сделайте следующее:
|
||
|
||
```sh
|
||
$ git commit --amend
|
||
```
|
||
|
||
Это откроет текстовый редактор по-умолчанию, в котором Вы сможете исправить сообщение. С другой стороны Вы можете сделать это одной командой:
|
||
|
||
```sh
|
||
$ git commit --amend -m 'xxxxxxx'
|
||
```
|
||
|
||
Если Вы уже сделали `push`, то Вы по-прежнему можете исправить коммит, но после этого придется делать `push` с принудительной перезаписью, что не рекомендуется.
|
||
|
||
<a name="commit-wrong-author"></a>
|
||
|
||
### Я сделал коммит с неправильным именем автора и адресом электронной почты
|
||
|
||
Если это один коммит, то исправьте его с помощью `amend`
|
||
|
||
```sh
|
||
$ git commit --amend --no-edit --author "New Authorname <authoremail@mydomain.com>"
|
||
```
|
||
|
||
Или Вы можете сконфигурировать глобальные настройки автора `git config --global author.(name|email)`, а затем выполнить
|
||
|
||
```sh
|
||
$ git commit --amend --reset-author --no-edit
|
||
```
|
||
|
||
Если Вам нужно изменить всю историю, то смотрите документацию для `git filter-branch`.
|
||
|
||
### Я хочу удалить файл из предыдущего коммита
|
||
|
||
Чтобы удалить изменения файла из предыдущего коммита, сделайте следующее:
|
||
|
||
```sh
|
||
$ git checkout HEAD^ myfile
|
||
$ git add myfile
|
||
$ git commit --amend --no-edit
|
||
```
|
||
|
||
Когда в коммит был добавлен новый файл и Вы хотите его удалить (только из Git), выполните:
|
||
|
||
```sh
|
||
$ git rm --cached myfile
|
||
$ git commit --amend --no-edit
|
||
```
|
||
|
||
Это особенно полезно, когда у Вас открытый патч, а Вы сохранили ненужный файл и теперь нужно сделать принудительный `push` для обновления патча в удаленном репозитории. Опция `--no-edit` оставляет прежнее сообщение коммита без изменений.
|
||
|
||
<a name="delete-pushed-commit"></a>
|
||
|
||
### Я хочу удалить последний коммит
|
||
|
||
Если хотите удалить опубликованные коммиты, воспользуйтесь приведенным ниже приемом. Однако, это бесповоротно изменит у Вас историю 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).
|
||
|
||
<a name="delete-any-commit"></a>
|
||
|
||
### Удалить произвольный коммит
|
||
|
||
Здесь уместны те же предупреждения, что и в пункте выше. По возможности, никогда так не делайте.
|
||
|
||
```sh
|
||
$ git rebase --onto SHA1_OF_BAD_COMMIT^ SHA1_OF_BAD_COMMIT
|
||
$ git push --force-with-lease [remote] [branch]
|
||
```
|
||
|
||
Или сделайте [интерактивное перебазирование](#interactive-rebase) и удалите строки ненужных коммитов.
|
||
|
||
<a name="#force-push"></a>
|
||
|
||
### Я пытаюсь опубликовать исправленный коммит, но получаю сообщение об ошибке
|
||
|
||
```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`), но вообще этого следует избегать.
|
||
|
||
<a href="undo-git-reset-hard"></a>
|
||
|
||
### Я случайно сделал жесткий сброс (--hard) и теперь хочу вернуть свои изменения
|
||
|
||
Если Вы случайно сделали `git reset --hard`, то вы можете вернуть назад коммиты, т.к. Git несколько дней хранит все действия в журнале.
|
||
|
||
Замечание: Это относится только если ваша работа была сохранена, т.е. Вы сделали коммит или stash. `git reset --hard` *удалит* несохраненные изменения, так что пользуйтесь им с осторожностью. (Безопасная опция это `git reset --keep`.)
|
||
|
||
```sh
|
||
(master)$ git reflog
|
||
```
|
||
|
||
Вы увидете список Ваших предыдущих коммитов и коммит для сброса. Выберите SHA коммита, который хотите вернуть и снова сделайте сброс:
|
||
|
||
```sh
|
||
(master)$ git reset --hard SHA1234
|
||
```
|
||
|
||
И Вы сможете продолжить работу.
|
||
|
||
## Подготовка изменений (staging)
|
||
|
||
<a href="#i-need-to-add-staged-changes-to-the-previous-commit"></a>
|
||
|
||
### Мне нужно добавить подготовленные изменения в предыдущий коммит
|
||
|
||
```sh
|
||
(my-branch*)$ git commit --amend
|
||
|
||
```
|
||
|
||
<a name="commit-partial-new-file"></a>
|
||
|
||
### Я хочу подготовить только часть файла, а не весь файл целиком
|
||
|
||
Обычно, если хотите подготовить часть файл, Вы запускаете:
|
||
|
||
```sh
|
||
$ git add --patch filename.x
|
||
```
|
||
|
||
`-p` - сокращение для `--patch`. Это откроет интерактивный режим. Вы сможете разбить коммит с помощью опции `s`, однако, если файл новый, то у Вас не будет такой возможности. При добавлении нового файла делайте так:
|
||
|
||
```sh
|
||
$ git add -N filename.x
|
||
```
|
||
|
||
Затем используйте опцию `e` для ручного выбора строк. Запустив `git diff --cached` или
|
||
`git diff --staged`, Вы увидите какие строки вы подготовили по-сравнению с тем, что сохранено в рабочей копии.
|
||
|
||
<a href="stage-in-two-commits"></a>
|
||
|
||
### Я хочу добавить изменения одного файла в два разных коммита
|
||
|
||
`git add` добавляет в коммит весь файл целиком. `git add -p` позволяет интерактивно выбрать изменения, которые Вы хотите добавить.
|
||
|
||
<a href="unstaging-edits-and-staging-the-unstaged"></a>
|
||
|
||
### Я хочу подготовить свои неподготовленные правки и убрать из подготовки то, что уже подготовлено
|
||
|
||
Это сложно. Лучшее, что я смог придумать это отложить (stash) неподготовленные изменения. Затем сделать сброс. После этого вернуть отложенные изменения и добавить их.
|
||
|
||
```sh
|
||
$ git stash -k
|
||
$ git reset --hard
|
||
$ git stash pop
|
||
$ git add -A
|
||
```
|
||
|
||
## Неподготовленные правки
|
||
|
||
<a href="move-unstaged-edits-to-new-branch"></a>
|
||
|
||
### Я хочу переместить мои неподготовленные правки в новую ветку
|
||
|
||
```sh
|
||
$ git checkout -b my-branch
|
||
```
|
||
|
||
<a href="move-unstaged-edits-to-old-branch"></a>
|
||
|
||
### Я хочу переместить неподготовленные правки в другую существующую ветку
|
||
|
||
```sh
|
||
$ git stash
|
||
$ git checkout my-branch
|
||
$ git stash pop
|
||
```
|
||
|
||
<a href="i-want-to-discard-my-local-uncommitted-changes"></a>
|
||
|
||
### Я хочу отменить мои локальные несохраненные изменения (подготовленные и неподготовленные)
|
||
|
||
Если Вы хотите отменить все подготовленные и неподготовленные изменения, то можете сделать так:
|
||
|
||
```sh
|
||
(my-branch)$ git reset --hard
|
||
# or
|
||
(master)$ git checkout -f
|
||
```
|
||
|
||
Это уберет из индекса все подготовленные изменения:
|
||
|
||
```sh
|
||
$ git reset
|
||
```
|
||
|
||
Это удалит все локальные изменения, которые не были сохранены или добавлены в индекс (нужно запускать из корня репозитория):
|
||
|
||
```sh
|
||
$ git checkout .
|
||
```
|
||
|
||
Вы также можете отменить несохраненные изменения в определенном файле или папке:
|
||
|
||
```sh
|
||
$ git checkout [some_dir|file.txt]
|
||
```
|
||
|
||
Еще один способ отменить все несохраненные изменения (длиннее, зато работает в любой папке):
|
||
|
||
```sh
|
||
$ git reset --hard HEAD
|
||
```
|
||
|
||
Это удалит все локальные неотслеживаемые файлы, так что останутся только отслеживаемые:
|
||
|
||
```sh
|
||
$ git clean -fd
|
||
```
|
||
|
||
`-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 .
|
||
```
|
||
|
||
<a href="i-want-to-discard-all-my-untracked-files"></a>
|
||
|
||
### Я хочу удалить все неотслеживаемые файлы
|
||
|
||
Когда Вы хотите удалить все неотслеживаемые файлы
|
||
|
||
```sh
|
||
$ git clean -f
|
||
```
|
||
|
||
## Ветки
|
||
|
||
### Я хочу получить список всех веток
|
||
|
||
Список локальных веток
|
||
|
||
```sh
|
||
$ git branch
|
||
```
|
||
|
||
Список удаленных веток
|
||
|
||
```sh
|
||
$ git branch -r
|
||
```
|
||
|
||
Список всех веток (локальных и удаленных)
|
||
|
||
```sh
|
||
$ git branch -a
|
||
```
|
||
|
||
<a name="create-branch-from-commit"></a>
|
||
|
||
### Создать ветку на определенном коммите
|
||
|
||
```sh
|
||
$ git checkout -b <branch> <SHA1_OF_COMMIT>
|
||
```
|
||
|
||
<a name="pull-wrong-branch"></a>
|
||
|
||
### Я стянул изменения (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
|
||
```
|
||
|
||
Готово.
|
||
|
||
<a href="discard-local-commits"></a>
|
||
|
||
### Я хочу отменить локальные коммиты, чтобы моя ветка стала такой же как на сервере
|
||
|
||
Подтвердите, что не хотите отправлять изменения на сервер.
|
||
|
||
`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
|
||
```
|
||
|
||
<a name="commit-wrong-branch"></a>
|
||
|
||
### Я сохранил коммит в ветку 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
|
||
```
|
||
|
||
<a name="keep-whole-file"></a>
|
||
|
||
### Я хочу сохранить файл целиком из другого 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 <file>..." to unstage)
|
||
#
|
||
# modified: file1.txt
|
||
```
|
||
|
||
Теперь сделайте коммит как обычно.
|
||
|
||
Заметка: Spike-решения делаются для анализа или решения проблемы. Эти решения используют, чтобы оценить проблему, и отбрасывают сразу же, как только все получают ясное представление о проблеме. ~ [Wikipedia](https://en.wikipedia.org/wiki/Extreme_programming_practices).
|
||
|
||
<a name="cherry-pick"></a>
|
||
|
||
### Я сделал несколько коммитов в одной ветке, а нужно было сохранять их в разных ветках
|
||
|
||
Скажем, Вы в ветке master. Запустив `git log`, Вы увидите, что сделали два коммита:
|
||
|
||
```sh
|
||
(master)$ git log
|
||
|
||
commit e3851e817c451cc36f2e6f3049db528415e3c114
|
||
Author: Alex Lee <alexlee@example.com>
|
||
Date: Tue Jul 22 15:39:27 2014 -0400
|
||
|
||
Bug #21 - Added CSRF protection
|
||
|
||
commit 5ea51731d150f7ddc4a365437931cd8be3bf3131
|
||
Author: Alex Lee <alexlee@example.com>
|
||
Date: Tue Jul 22 15:39:12 2014 -0400
|
||
|
||
Bug #14 - Fixed spacing on title
|
||
|
||
commit a13b85e984171c6e2a1729bb061994525f626d14
|
||
Author: Aki Rose <akirose@example.com>
|
||
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
|
||
```
|
||
|
||
<a name="delete-stale-local-branches"></a>
|
||
|
||
### Я хочу удалить локальные ветки, которые были удалены в upstream
|
||
|
||
Как только Вы слили пулл-реквест на GitHub, Вам предлагают удалить слитую ветку из Вашего форка. Если Вы не планируете продолжать работу в этой ветке, то для поддержания рабочей копии в чистоте Вы можете удалить локальные копии ненужных веток, чтобы не путаться в них.
|
||
|
||
```sh
|
||
$ git fetch -p upstream
|
||
```
|
||
|
||
где `upstream` - удаленная ветка, из которой Вы хотите получить изменения.
|
||
|
||
<a name="restore-a-deleted-branch"></a>
|
||
|
||
### Я нечаянно удалил мою ветку
|
||
|
||
Если Вы регулярно отправляете изменения в удаленное хранилище, большую часть времени Вы в безопасности. Но в один прекрасный момент Вы всё же можете случайно удалить Ваши ветки. Скажем, мы создали ветку и создали новый файл:
|
||
|
||
```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 <siemiatj@example.com>
|
||
Date: Wed Jul 30 00:34:10 2014 +0200
|
||
|
||
foo.txt added
|
||
|
||
commit 69204cdf0acbab201619d95ad8295928e7f411d5
|
||
Author: Kate Hudson <katehudson@example.com>
|
||
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
|
||
```
|
||
|
||
Чтобы удалить локальную ветку, которая *не была* слита с отслеживаемой веткой (заданной с помощью `--track` или `--set-upstream`) или с HEAD:
|
||
|
||
```sh
|
||
(master)$ git branch -D my-branch
|
||
```
|
||
|
||
### Я хочу удалить несколько веток
|
||
|
||
Скажем, Вы хотите удалить все ветки, начинающиеся с `fix/`:
|
||
|
||
```sh
|
||
(master)$ git branch | grep 'fix/' | xargs git branch -d
|
||
```
|
||
|
||
### Я хочу переименовать ветку
|
||
|
||
Чтобы переименовать текущую (локальную) ветку:
|
||
|
||
```sh
|
||
(master)$ git branch -m new-name
|
||
```
|
||
|
||
Чтобы переименовать другую (локальную) ветку:
|
||
|
||
```sh
|
||
(master)$ git branch -m old-name new-name
|
||
```
|
||
|
||
<a name="i-want-to-checkout-to-a-remote-branch-that-someone-else-is-working-on"></a>
|
||
|
||
### Я хочу перейти на удаленную ветку, над которой работает кто-то еще
|
||
|
||
Во-первых, получим все ветки из удаленного репозитория:
|
||
|
||
```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 push <remote> HEAD
|
||
```
|
||
|
||
Если Вы хотите, чтобы текущая локальная ветка отслеживала соответствующую удаленную (upstream) ветку, тогда выполните следующее:
|
||
|
||
```sh
|
||
$ git push -u <remote> HEAD
|
||
```
|
||
|
||
В режиме `upstream` или в режиме `simple` (по-умолчанию в Git 2.0) параметра `push.default`, следующая команда отправит текущую ветку в удаленную ветку, которая была ранее зарегистрирована с помощью -u :
|
||
|
||
```sh
|
||
$ git push
|
||
```
|
||
|
||
Поведение других режимов `git push` описано в документации на push.default.
|
||
|
||
### Я хочу настроить локальную ветку на отслеживание удаленной (upstream) ветки
|
||
|
||
Вы можете настроить текущую локальную ветку на отслеживание удаленной (upstream) ветки используя:
|
||
|
||
```sh
|
||
$ git branch --set-upstream-to [remotename]/[branch]
|
||
# или для краткости:
|
||
$ git branch -u [remotename]/[branch]
|
||
```
|
||
|
||
Для настройки отслеживаемой удаленной ветки на другую локальную ветку:
|
||
|
||
```sh
|
||
$ git branch -u [remotename]/[branch] [local-branch]
|
||
```
|
||
|
||
<a name="i-want-to-set-my-HEAD-to-track-the-default-remote-branch"></a>
|
||
|
||
### Я хочу настроить HEAD на отслеживание основной удаленной ветки
|
||
|
||
При просмотре удаленных веток можно увидеть какую удаленную ветку отслеживает HEAD. Может оказаться, что это не та ветка что нужно.
|
||
|
||
```sh
|
||
$ git branch -r
|
||
origin/HEAD -> origin/gh-pages
|
||
origin/master
|
||
```
|
||
|
||
Чтобы `origin/HEAD` отслеживала `origin/master`, выполните команду:
|
||
|
||
```sh
|
||
$ git remote set-head origin --auto
|
||
origin/HEAD set to master
|
||
```
|
||
|
||
### Я сделал изменения в неправильной ветке
|
||
|
||
Вы сделали несохраненные изменения, а потом поняли, что находитесь не в той ветке. Отложите эти изменения, а затем примените их к нужной ветке:
|
||
|
||
```sh
|
||
(wrong_branch)$ git stash
|
||
(wrong_branch)$ git checkout <correct_branch>
|
||
(correct_branch)$ git stash apply
|
||
```
|
||
|
||
## Перебазирование (rebase) и слияние (merge)
|
||
|
||
<a name="undo-rebase"></a>
|
||
|
||
### Я хочу отменить перебазирование/слияние
|
||
|
||
Вы можете слить/перебазировать Вашу ветку с неправильной веткой. А также бывают случаи, когда Вы не можете предугадать успешно ли завершится процесс перебазирования/слияния. Git сохраняет исходный указатель HEAD в переменную ORIG_HEAD перед тем как приступить к опасным операциям, так что вернуть ветку на состояние до перебазирования/слияния просто.
|
||
|
||
```sh
|
||
(my-branch)$ git reset --hard ORIG_HEAD
|
||
```
|
||
|
||
<a name="force-push-rebase"></a>
|
||
|
||
### Я сделал перебазирование, но я не хочу делать принудительный push
|
||
|
||
К сожалению, вы должны сделать принудительный push, если хотите, чтобы изменения были отражены на удаленной ветке. Это потому что у вас изменена история. Удаленная ветка не примет изменения, если не сделать принудительный 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 ветку](https://stackoverflow.com/questions/11058312/how-can-i-use-git-rebase-without-requiring-a-forced-push).
|
||
|
||
<a name="interactive-rebase"></a>
|
||
|
||
### Я хочу объединить коммиты
|
||
|
||
Предположим, что Вы работаете в ветке, которая стала или станет пулл-реквестом в `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
|
||
```
|
||
|
||
<a name="rebase-unpushed-commits"></a>
|
||
|
||
#### Я хочу объединить только неопубликованные коммиты
|
||
|
||
Иногда у Вас бывает несколько временных коммитов, которые Вы хотите объединить перед публикацией в 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
|
||
```
|
||
|
||
### Возможные проблемы интерактивного перебазирования
|
||
|
||
<a name="noop"></a>
|
||
|
||
#### Экран перебазирования говорит 'noop'
|
||
|
||
Если Вы видите это:
|
||
|
||
```
|
||
noop
|
||
```
|
||
|
||
Это значит, что Вы пытаетесь сделать перебазирование в ветку, которая уже имеет идентичный коммит или она *впереди* текущей ветки. Вы может попробовать:
|
||
|
||
- удостовериться что Ваша ветка master находится там, где она должна быть
|
||
- вместо этого перебазировать `HEAD~2` или что-то более раннее
|
||
|
||
<a name="merge-conflict"></a>
|
||
|
||
#### Здесь были конфликты
|
||
|
||
Если Вам не удается успешно завершить перебазирование, то, возможно, Вам придется разрешать конфликты.
|
||
|
||
Для начала запустите `git status`, чтобы увидеть какие файлы содержат конфликты:
|
||
|
||
```sh
|
||
(my-branch)$ git status
|
||
On branch my-branch
|
||
Changes not staged for commit:
|
||
(use "git add <file>..." to update what will be committed)
|
||
(use "git checkout -- <file>..." 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
|
||
```
|
||
|
||
<a name="stashing"></a>
|
||
|
||
## Отложенные изменения (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
|
||
```
|
||
|
||
<a name="stash-msg"></a>
|
||
|
||
### Отложить с сообщением
|
||
|
||
```sh
|
||
$ git stash save <message>
|
||
```
|
||
|
||
<a name="stash-apply-specific"></a>
|
||
|
||
### Применить заданный stash из списка
|
||
|
||
Во-первых, проверьте список отложенных изменений, используя
|
||
|
||
```sh
|
||
$ git stash list
|
||
```
|
||
|
||
Затем примените заданный stash из списка, используя
|
||
|
||
```sh
|
||
$ git stash apply "stash@{n}"
|
||
```
|
||
|
||
Здесь 'n' показывает позицию stash-а в стеке. Верхний stash имеет позицию 0.
|
||
|
||
## Поиск
|
||
|
||
### Я хочу найти строку в коммитах
|
||
|
||
Чтобы найти коммиты с заданной строкой, используйте следующее:
|
||
|
||
```sh
|
||
$ git log -S "string to find"
|
||
```
|
||
|
||
Общие параметры:
|
||
|
||
- `--source` показывает ссылки, от которых можно добраться до каждого коммита.
|
||
|
||
- `--all` ищет во всех ветках.
|
||
|
||
- `--reverse` выводит коммиты в обратном порядке, это значит, что вверху будет первый коммит, в котором сделано это изменение.
|
||
|
||
<a name="i-want-to-find-by-author-committer"></a>
|
||
|
||
### Я хочу искать по автору или сохранившему изменения (committer)
|
||
|
||
Найти все коммиты по автору или сохранившему изменения:
|
||
|
||
```sh
|
||
$ git log --author=<name or email>
|
||
$ git log --committer=<name or email>
|
||
```
|
||
|
||
Не забывайте, что автор и сохранивший изменения - это не всегда один и тот же человек. `--author` - это тот, кто написал код, а `--committer` - тот, кто сохранил код, написанный автором.
|
||
|
||
### Я хочу получить список коммитов, содержащих заданный файл
|
||
|
||
Чтобы найти все коммиты, содержащие заданный файл, Вы можете использовать:
|
||
|
||
```sh
|
||
$ git log -- <path to file>
|
||
```
|
||
|
||
Обычно Вы задаете точный путь, но можете использовать подстановочные знаки:
|
||
|
||
```sh
|
||
$ git log -- **/*.js
|
||
```
|
||
|
||
При использовании подстановочных знаков используйте `--name-status` для просмотра списка файлов, сохраненных в каждом коммите:
|
||
|
||
```sh
|
||
$ git log --name-status -- **/*.js
|
||
```
|
||
|
||
### Найти метки для заданного коммита
|
||
|
||
Чтобы найти все метки для заданного коммита:
|
||
|
||
```sh
|
||
$ git tag --contains <commitid>
|
||
```
|
||
|
||
## Субмодули
|
||
|
||
<a name="clone-submodules"></a>
|
||
|
||
### Клонировать все субмодули
|
||
|
||
```sh
|
||
$ git clone --recursive git://github.com/foo/bar.git
|
||
```
|
||
|
||
Если уже клонированы:
|
||
|
||
```sh
|
||
$ git submodule update --init --recursive
|
||
```
|
||
|
||
<a name="delete-submodule"></a>
|
||
|
||
### Удалить субмодуль
|
||
|
||
Создание субмодуля довольно прямолинейно, чего не скажешь об удалении. Команды, которые Вам нужны:
|
||
|
||
```sh
|
||
$ git submodule deinit submodulename
|
||
$ git rm submodulename
|
||
$ git rm --cached submodulename
|
||
$ rm -rf .git/modules/submodulename
|
||
```
|
||
|
||
## Разное
|
||
|
||
### Восстановить удаленный файл
|
||
|
||
Сначала нужно найти последний коммит, где файл еще существует:
|
||
|
||
```sh
|
||
$ git rev-list -n 1 HEAD -- filename
|
||
```
|
||
|
||
Затем взять версию файла из коммита непосредственно перед удалением:
|
||
|
||
```
|
||
git checkout deletingcommitid^ -- filename
|
||
```
|
||
|
||
### Удалить метку
|
||
|
||
```sh
|
||
$ git tag -d <tag_name>
|
||
$ git push <remote> :refs/tags/<tag_name>
|
||
```
|
||
|
||
<a name="recover-tag"></a>
|
||
|
||
### Восстановить удаленную метку
|
||
|
||
Если хотите восстановить метку, которая была удалена, Вы можете сделать следующее: во-первых, Вам нужно найти недостижимую метку:
|
||
|
||
```sh
|
||
$ git fsck --unreachable | grep tag
|
||
```
|
||
|
||
Запомните для себя хэш метки. Затем восстановите удаленную метку, используя команду [`git update-ref`](https://git-scm.com/docs/git-update-ref):
|
||
|
||
```sh
|
||
$ git update-ref refs/tags/<tag_name> <hash>
|
||
```
|
||
|
||
Ваша метка была восстановлена.
|
||
|
||
### Удаленный патч
|
||
|
||
Если кто-то прислал Вам пулл-реквест на 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
|
||
```
|
||
|
||
### Экспорт репозитория в Zip-файл
|
||
|
||
```sh
|
||
$ git archive --format zip --output /full/path/to/zipfile.zip master
|
||
```
|
||
|
||
## Отслеживание файлов
|
||
|
||
<a href="i-want-to-change-a-file-names-capitalization-without-changing-the-contents-of-the-file"></a>
|
||
|
||
### Я хочу изменить регистр в имени файла, не меняя содержимое файла
|
||
|
||
```sh
|
||
(master)$ git mv --force myfile MyFile
|
||
```
|
||
|
||
### Я хочу переписать локальные файлы при выполнении git pull
|
||
|
||
```sh
|
||
(master)$ git fetch --all
|
||
(master)$ git reset --hard origin/master
|
||
```
|
||
|
||
<a href="remove-from-git"></a>
|
||
|
||
### Я хочу удалить файл из 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
|
||
```
|
||
|
||
### Я хочу получить список изменений в заданном файле из разных коммитов или веток
|
||
|
||
Полагая, что Вы хотите сравнить последний коммит с файлом из коммита c5f567:
|
||
|
||
```sh
|
||
$ git diff HEAD:path_to_file/file c5f567:path_to_file/file
|
||
```
|
||
|
||
Аналогично для веток:
|
||
|
||
```sh
|
||
$ git diff master:path_to_file/file staging:path_to_file/file
|
||
```
|
||
|
||
## Конфигурация
|
||
|
||
### Я хочу добавить псевдонимы для некоторых команд 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
|
||
```
|
||
|
||
### Я хочу задать данные пользователя в глобальных настройках
|
||
|
||
Чтобы настроить информацию о пользователе, используемую во всех локальных репозиториях, в частности имя, отображаемое в истории изменений:
|
||
|
||
```sh
|
||
$ git config --global user.name “[firstname lastname]”
|
||
```
|
||
|
||
Чтобы настроить адрес электронной почты, который будет связан с каждой записью в историю:
|
||
|
||
```sh
|
||
git config --global user.email “[valid-email]”
|
||
```
|
||
|
||
### Я хочу настроить цветовую схему для командной строки Git
|
||
|
||
Для наглядности можно настроить автоматическую цветовую схему командной строки Git:
|
||
|
||
```sh
|
||
$ git config --global color.ui auto
|
||
```
|
||
|
||
## Я не представляю что я сделал неправильно
|
||
|
||
Итак, Вы в затруднении - Вы сбросили что-то или Вы слили неправильную ветку, или Вы отправили изменения с принудительной перезаписью и теперь Вы не можете найти свои коммиты. Вы знаете, что в какой-то момент было всё в порядке и Вы хотите вернуться к этому состоянию.
|
||
|
||
Как раз для этого и нужен `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
|
||
- [Git Internals](https://github.com/pluralsight/git-internals-pdf) - еще одна великолепная книга Скотта Чакона, посвященная Git
|
||
|
||
## Учебники
|
||
|
||
- [Atlassian's Git tutorial](https://www.atlassian.com/git/tutorials) Получите Git сразу с учебниками от начального до продвинутого уровня.
|
||
- [Изучаем ветвление в 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 как рабочий процесс](https://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
|
||
- [Sourcetree](https://www.sourcetreeapp.com/) - Простота и мощь в красивом и свободном графическом Git-клиенте. Для Windows и Mac.
|
||
- [Tower](https://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 для просмотра состояния репозитория.
|