1
0
mirror of https://github.com/k88hudson/git-flight-rules.git synced 2025-05-10 01:48:25 -03:00

update Russian translation (#286)

This commit is contained in:
Artem Buslov 2019-10-15 14:24:03 +03:00 committed by Richard Littauer
parent 40a542d31a
commit e0ff2c06b9

View File

@ -20,7 +20,6 @@
Приведенные команды работают на Git версии 2.13.0 и выше. Для обновления Вашей версии Git посетите [вебсайт Git](https://www.git-scm.com/). Приведенные команды работают на Git версии 2.13.0 и выше. Для обновления Вашей версии Git посетите [вебсайт Git](https://www.git-scm.com/).
[![Заходите в чат 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) [![Заходите в чат 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)
<!-- START doctoc generated TOC please keep comment here to allow auto update --> <!-- 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 -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --> <!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
@ -29,6 +28,9 @@
- [Я хочу создать локальный репозиторий](#%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-%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%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%AF-%D0%BD%D0%B5%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE-%D0%B7%D0%B0%D0%B4%D0%B0%D0%BB-%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%AF-%D0%BD%D0%B5%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE-%D0%B7%D0%B0%D0%B4%D0%B0%D0%BB-%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%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%BA%D0%BE%D0%B4-%D0%B2-%D1%87%D1%83%D0%B6%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%9F%D1%80%D0%B5%D0%B4%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA%D0%BE%D0%B4%D0%B0-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-%D0%BF%D1%83%D0%BB%D0%BB-%D1%80%D0%B5%D0%BA%D0%B2%D0%B5%D1%81%D1%82%D0%BE%D0%B2)
- [Мне нужно обновить свой форк последними изменениями из исходного репозитория](#%D0%9C%D0%BD%D0%B5-%D0%BD%D1%83%D0%B6%D0%BD%D0%BE-%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C-%D1%81%D0%B2%D0%BE%D0%B9-%D1%84%D0%BE%D1%80%D0%BA-%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B8%D0%BC%D0%B8-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8-%D0%B8%D0%B7-%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F)
- [Редактирование коммитов](#%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%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%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-%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)
@ -40,6 +42,10 @@
- [Я случайно сделал жесткий сброс (--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) - [Я случайно сделал жесткий сброс (--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)
- [Я случайно опубликовал ненужное слияние](#%D0%AF-%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D0%BE-%D0%BE%D0%BF%D1%83%D0%B1%D0%BB%D0%B8%D0%BA%D0%BE%D0%B2%D0%B0%D0%BB-%D0%BD%D0%B5%D0%BD%D1%83%D0%B6%D0%BD%D0%BE%D0%B5-%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5) - [Я случайно опубликовал ненужное слияние](#%D0%AF-%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D0%BE-%D0%BE%D0%BF%D1%83%D0%B1%D0%BB%D0%B8%D0%BA%D0%BE%D0%B2%D0%B0%D0%BB-%D0%BD%D0%B5%D0%BD%D1%83%D0%B6%D0%BD%D0%BE%D0%B5-%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5)
- [Я случайно закоммитил и опубликовал файлы с конфиденциальными данными](#%D0%AF-%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D0%BE-%D0%B7%D0%B0%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%B8%D0%BB-%D0%B8-%D0%BE%D0%BF%D1%83%D0%B1%D0%BB%D0%B8%D0%BA%D0%BE%D0%B2%D0%B0%D0%BB-%D1%84%D0%B0%D0%B9%D0%BB%D1%8B-%D1%81-%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B4%D0%B5%D0%BD%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8) - [Я случайно закоммитил и опубликовал файлы с конфиденциальными данными](#%D0%AF-%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D0%BE-%D0%B7%D0%B0%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%B8%D0%BB-%D0%B8-%D0%BE%D0%BF%D1%83%D0%B1%D0%BB%D0%B8%D0%BA%D0%BE%D0%B2%D0%B0%D0%BB-%D1%84%D0%B0%D0%B9%D0%BB%D1%8B-%D1%81-%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B4%D0%B5%D0%BD%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8)
- [Я хочу удалить большой файл из истории репозитория](#%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%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B9-%D1%84%D0%B0%D0%B9%D0%BB-%D0%B8%D0%B7-%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D0%B8-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F)
- [Рекомендуемый способ: Использование bfg](#%D0%A0%D0%B5%D0%BA%D0%BE%D0%BC%D0%B5%D0%BD%D0%B4%D1%83%D0%B5%D0%BC%D1%8B%D0%B9-%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1-%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-bfg)
- [Встроенный способ: Использование git-filter-branch](#%D0%92%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9-%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1-%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-git-filter-branch)
- [Финальный шаг: Публикация измененной истории репозитория](#%D0%A4%D0%B8%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9-%D1%88%D0%B0%D0%B3-%D0%9F%D1%83%D0%B1%D0%BB%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9-%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D0%B8-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F)
- [Мне нужно изменить содержимое коммита, который не является последним](#%D0%9C%D0%BD%D0%B5-%D0%BD%D1%83%D0%B6%D0%BD%D0%BE-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C-%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%BC%D0%BE%D0%B5-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%B0-%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B9-%D0%BD%D0%B5-%D1%8F%D0%B2%D0%BB%D1%8F%D0%B5%D1%82%D1%81%D1%8F-%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B8%D0%BC) - [Мне нужно изменить содержимое коммита, который не является последним](#%D0%9C%D0%BD%D0%B5-%D0%BD%D1%83%D0%B6%D0%BD%D0%BE-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C-%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%BC%D0%BE%D0%B5-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%B0-%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B9-%D0%BD%D0%B5-%D1%8F%D0%B2%D0%BB%D1%8F%D0%B5%D1%82%D1%81%D1%8F-%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B8%D0%BC)
- [Подготовка изменений (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) - [Подготовка изменений (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%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)
@ -115,6 +121,7 @@
- [Я хочу откатить файл до заданной ревизии](#%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%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%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)
- [Я хочу, чтобы 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-%D0%B2-%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%BC-%D1%84%D0%B0%D0%B9%D0%BB%D0%B5) - [Я хочу, чтобы 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-%D0%B2-%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%BC-%D1%84%D0%B0%D0%B9%D0%BB%D0%B5)
- [Отладка с помощью Git](#%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-git)
- [Конфигурация](#%D0%9A%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D1%8F) - [Конфигурация](#%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) - [Я хочу добавить псевдонимы для некоторых команд 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-%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)
@ -146,7 +153,7 @@
### Я хочу клонировать удаленный репозиторий ### Я хочу клонировать удаленный репозиторий
Чтобы клонировать (копировать) удаленный репозиторий, скопируйте адрес репозиторий и запустите: Чтобы клонировать (копировать) удаленный репозиторий, скопируйте URL репозитория и запустите:
```sh ```sh
$ git clone [url] $ git clone [url]
@ -166,7 +173,7 @@ $ git clone [url] name-of-new-folder
Если Вы склонировали неправильный репозиторий, то просто удалите появившуюся папку и склонируйте правильный репозиторий. Если Вы склонировали неправильный репозиторий, то просто удалите появившуюся папку и склонируйте правильный репозиторий.
Если Вы неправильно настроили origin для существующего локального репозиторий, то измените адрес origin на правильный с помощью: Если Вы неправильно настроили origin для существующего локального репозиторий, то измените URL-адрес origin на правильный с помощью:
```sh ```sh
$ git remote set-url origin [правильный url] $ git remote set-url origin [правильный url]
@ -174,10 +181,82 @@ $ git remote set-url origin [правильный url]
См. [подробнее на StackOverflow](https://stackoverflow.com/questions/2432764/how-to-change-the-uri-url-for-a-remote-git-repository#2432799). См. [подробнее на StackOverflow](https://stackoverflow.com/questions/2432764/how-to-change-the-uri-url-for-a-remote-git-repository#2432799).
### Я хочу добавить код в чужой репозиторий
Git не разрешает добавлять код в чужой репозиторий без соответствующих прав доступа. Так же, как и GitHub, который, вообще говоря, не является самим Git-ом, а скорее хостингом для репозиториев Git. Тем не менее, вы можете предложить код посредством патчей или, на GitHub, посредством форков (ответвлений) и пулл-реквестов (запросов на слияние).
Сначала немного о форках. Форк - это копия репозитория. Эта операция не имеет прямого отношения к Git, это общая операция на GitHub, Bitbucket, GitLab и на других хостингах репозиториев Git. Вы можете сделать форк с помощью веб-интерфейса.
#### Предложение кода с помощью пулл-реквестов
После создания форка вам нужно склонировать репозиторий на свой компьютер. Вы можете сделать мелкие правки прямо на GitHub без клонирования, но это не "Правила полёта на GitHub", так что рассмотрим, как это сделать у себя на компьютере.
```sh
# если вы используете SSH
$ git clone git@github.com:k88hudson/git-flight-rules.git
# если вы используете HTTPS
$ git clone https://github.com/k88hudson/git-flight-rules.git
```
Если перейти в появившийся каталог и ввести команду `git remote`, то напечатается список ссылок на удаленные репозитории. Обычно будет единственная ссылка `origin`, которая будет указывать на `k88hudson/git-flight-rules`. Ещё вам понадобится ссылка на ваш форк.
Следуя общепринятым соглашениям, название `origin` используется для вашего собственного репозитория, а `upstream` - для исходного репозитория, с которого вы сделали форк. Так что переименуем `origin` в `upstream`
```sh
$ git remote rename origin upstream
```
Вместо этого можно использовать `git remote set-url`, но это дольше и требует больше действий.
Теперь настроим удаленную ссылку на ваш собственный репозиторий.
```sh
$ git remote add origin git@github.com:YourName/git-flight-rules.git
```
Обратите внимание, что у вас два удаленных репозитория.
- `origin` ссылается на ваш собственный репозиторий.
- `upstream` ссылается на исходный репозиторий.
Репозиторий origin доступен для чтения и записи, тогда как upstream доступен только для чтения.
Когда вы сделаете изменения, которые хотели, отправьте свои изменения (которые обычно делаются в отдельной ветке) в репозиторий `origin`. Если вы делаете изменения в отдельной ветке, то удобно пользоваться опцией `--set-upstream`, чтобы в будущем при отправке данной локальной ветки не приходилось каждый раз указывать удаленную ветку. Например:
```sh
$ (feature/my-feature) git push --set-upstream origin feature/my-feature
```
Git не располагает командами для создания пулл-реквестов (хотя есть внешние инструменты вроде [hub](http://github.com/github/hub)). Так что, когда подготовите необходимые изменения, открывайте GitHub (или другой сервер Git) и создавайте пулл-реквест. Обратите внимание, что сервер автоматически связывает исходный репозиторий и форк.
После этого не забудьте добавить описание предлагаемых изменений.
#### Мне нужно обновить свой форк последними изменениями из исходного репозитория
Со временем репозиторий `upstream` может обновиться, и эти обновления нужно внести в ваш репозиторий `origin`. Не забывайте, что другие люди тоже вносят свои изменения. Предположим, вы находитесь на ветке для своей фичи и вам нужно её обновить согласно последним изменениям исходного репозитория.
Возможно, вы уже настроили ссылку на исходный удаленный репозиторий. Если нет, тогда сделайте это сейчас. Обычно исходный удаленный репозиторий называют `upstream`:
```sh
$ (master) git remote add upstream <link-to-original-repository>
# $ (master) git remote add upstream git@github.com:k88hudson/git-flight-rules.git
```
Теперь вы можете получить последние обновления из upstream.
```sh
$ (master) git fetch upstream
$ (master) git merge upstream/master
# или одной командой
$ (master) git pull upstream master
```
## Редактирование коммитов ## Редактирование коммитов
<a name="diff-last"></a> <a name="diff-last"></a>
### Что я только что сохранил? ### Что я только что сохранил?
Допустим, Вы не глядя сохранили изменения с помощью `git commit -a` и теперь не уверены что именно сохранили. В таком случае Вы можете просмотреть последний коммит в HEAD с помощью: Допустим, Вы не глядя сохранили изменения с помощью `git commit -a` и теперь не уверены что именно сохранили. В таком случае Вы можете просмотреть последний коммит в HEAD с помощью:
@ -215,7 +294,6 @@ $ git commit --amend --only -m 'xxxxxxx'
Если Вы уже сделали `push`, то Вы по-прежнему можете исправить коммит, но после этого придется делать `push` с принудительной перезаписью, что не рекомендуется. Если Вы уже сделали `push`, то Вы по-прежнему можете исправить коммит, но после этого придется делать `push` с принудительной перезаписью, что не рекомендуется.
<a name="commit-wrong-author"></a> <a name="commit-wrong-author"></a>
### Я сделал коммит с неправильным именем автора и адресом электронной почты ### Я сделал коммит с неправильным именем автора и адресом электронной почты
Если это один коммит, то исправьте его с помощью `amend` Если это один коммит, то исправьте его с помощью `amend`
@ -252,7 +330,6 @@ $ git commit --amend --no-edit
Это особенно полезно, когда у Вас открытый патч, а Вы сохранили ненужный файл и теперь нужно сделать принудительный `push` для обновления патча в удаленном репозитории. Опция `--no-edit` оставляет прежнее сообщение коммита без изменений. Это особенно полезно, когда у Вас открытый патч, а Вы сохранили ненужный файл и теперь нужно сделать принудительный `push` для обновления патча в удаленном репозитории. Опция `--no-edit` оставляет прежнее сообщение коммита без изменений.
<a name="delete-pushed-commit"></a> <a name="delete-pushed-commit"></a>
### Я хочу удалить последний коммит ### Я хочу удалить последний коммит
Если хотите удалить опубликованные коммиты, воспользуйтесь приведенным ниже приемом. Однако, это бесповоротно изменит у Вас историю Git, а также испортит историю Git у любого, что уже стянул (pull) изменения из репозитория. Короче говоря, никогда так не делайте, если не уверены. Если хотите удалить опубликованные коммиты, воспользуйтесь приведенным ниже приемом. Однако, это бесповоротно изменит у Вас историю Git, а также испортит историю Git у любого, что уже стянул (pull) изменения из репозитория. Короче говоря, никогда так не делайте, если не уверены.
@ -272,7 +349,6 @@ $ git push --force-with-lease [remote] [branch]
Это работает, если Вы еще не сделали `push`. Если Вы уже сделали `push`, то единственный по-настоящему безопасный способ это `git revert SHAofBadCommit`. Это создаст новый коммит, который отменит все изменения предыдущего коммита. Или, если ветка, в которую вы делаете `push` безопасна для перезаписи (т.е. не предполагается, другие разработчики будут стягивать из нее изменения), то просто используйте `git push --force-with-lease`. Подробнее см. [в этом пункте выше](#delete-pushed-commit). Это работает, если Вы еще не сделали `push`. Если Вы уже сделали `push`, то единственный по-настоящему безопасный способ это `git revert SHAofBadCommit`. Это создаст новый коммит, который отменит все изменения предыдущего коммита. Или, если ветка, в которую вы делаете `push` безопасна для перезаписи (т.е. не предполагается, другие разработчики будут стягивать из нее изменения), то просто используйте `git push --force-with-lease`. Подробнее см. [в этом пункте выше](#delete-pushed-commit).
<a name="delete-any-commit"></a> <a name="delete-any-commit"></a>
### Удалить произвольный коммит ### Удалить произвольный коммит
Здесь уместны те же предупреждения, что и в пункте выше. По возможности, никогда так не делайте. Здесь уместны те же предупреждения, что и в пункте выше. По возможности, никогда так не делайте.
@ -285,7 +361,6 @@ $ git push --force-with-lease [remote] [branch]
Или сделайте [интерактивное перебазирование](#interactive-rebase) и удалите строки ненужных коммитов. Или сделайте [интерактивное перебазирование](#interactive-rebase) и удалите строки ненужных коммитов.
<a name="#force-push"></a> <a name="#force-push"></a>
### Я пытаюсь опубликовать исправленный коммит, но получаю сообщение об ошибке ### Я пытаюсь опубликовать исправленный коммит, но получаю сообщение об ошибке
```sh ```sh
@ -309,7 +384,6 @@ hint: See the 'Note about fast-forwards' in 'git push --help' for details.
Если Вы *абсолютно* уверены, что никто кроме Вас не работает с данной веткой или Вы хотите обновить вершину ветви в любом случае, то используйте `--force` (`-f`), но вообще этого следует избегать. Если Вы *абсолютно* уверены, что никто кроме Вас не работает с данной веткой или Вы хотите обновить вершину ветви в любом случае, то используйте `--force` (`-f`), но вообще этого следует избегать.
<a href="undo-git-reset-hard"></a> <a href="undo-git-reset-hard"></a>
### Я случайно сделал жесткий сброс (--hard) и теперь хочу вернуть свои изменения ### Я случайно сделал жесткий сброс (--hard) и теперь хочу вернуть свои изменения
Если Вы случайно сделали `git reset --hard`, то вы можете вернуть назад коммиты, т.к. Git несколько дней хранит все действия в журнале. Если Вы случайно сделали `git reset --hard`, то вы можете вернуть назад коммиты, т.к. Git несколько дней хранит все действия в журнале.
@ -372,6 +446,77 @@ echo sensitive_file >> .gitignore
Если Вы успели сделать другие коммиты после коммита с конфиденциальными данными, то Вам нужно использовать rebase. Если Вы успели сделать другие коммиты после коммита с конфиденциальными данными, то Вам нужно использовать rebase.
<a href="#i-want-to-remove-a-large-file-from-ever-existing-in-repo-history"></a>
### Я хочу удалить большой файл из истории репозитория
Если вы хотите удалить пароль или другую конфиденциальную информацию, то вместо этого смотрите [Я случайно закоммитил и опубликовал файлы с конфиденциальными данными](#%D0%AF-%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D0%BE-%D0%B7%D0%B0%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%B8%D0%BB-%D0%B8-%D0%BE%D0%BF%D1%83%D0%B1%D0%BB%D0%B8%D0%BA%D0%BE%D0%B2%D0%B0%D0%BB-%D1%84%D0%B0%D0%B9%D0%BB%D1%8B-%D1%81-%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B4%D0%B5%D0%BD%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8).
Даже если вы удалите большие или ненужные файлы из последнего коммита, они останутся в истоии Git, в подкаталоге `.git` вашего репозитория и `git clone` будет загружать ненужные файлы.
Действия, описанные в этой части руководства требуют принудительной перезаписи истории репозитория Git, так что, если вы сотрудничаете с удаленными разработчиками, что сначала убедитесь, что они опубликовали на сервере все свои локальные изменения.
Есть два способа переписывания истории: встроенная команда `git-filter-branch` и сторонняя программа [`bfg-repo-cleaner`](https://rtyley.github.io/bfg-repo-cleaner/). `bfg` значительно понятнее в использовании и быстрее по производительности, но её нужно устанавливать отдельно и она требует Java. Мы опишем оба этих способа. Финальный шаг - это принудительный push ваших изменений, который мы обсудим отдельно, поскольку, в отличие от обычного принудительного push, он приводит к масштабной безвозвратной перезаписи истории.
#### Рекомендуемый способ: Использование bfg
Использование bfg-repo-cleaner требует наличия Java. Скачайте bfg jar-файл по ссылке [здесь](https://rtyley.github.io/bfg-repo-cleaner/). В наших примерах будет использоваться `bfg.jar`, а загруженный вами файл будет содержать в названии номер версии, например, `bfg-1.13.0.jar`.
Чтобы удалить определенный файл:
```sh
(master)$ git rm path/to/filetoremove
(master)$ git commit -m "Commit removing filetoremove"
(master)$ java -jar ~/Downloads/bfg.jar --delete-files filetoremove
```
Заметьте, что в bfg вы должны использовать имя файла без пути, даже если файл находится в подкаталоге.
Также вы можете пользоваться шаблонами имен:
```sh
(master)$ git rm *.jpg
(master)$ git commit -m "Commit removing *.jpg"
(master)$ java -jar ~/Downloads/bfg.jar --delete-files *.jpg
```
При использовании bfg, файлы, существующие в вашем последнем коммите не будут затронуты. Например, если в вашем репозитории было много больших .tga файлов, а потом вы удалили несколько из них, то bfg не тронет файлы, которые присутствуют в последнем коммите.
Заметьте, что если вы переименовали файл в коммите, например, если он сначала назывался `LargeFileFirstName.mp4` и коммит переименовал его в `LargeFileSecondName.mp4`, то запуск `java -jar ~/Downloads/bfg.jar --delete-files LargeFileSecondName.mp4` не удалит его из истории Git. В таком случае запустите команду `--delete-files` с обоими именами или с шаблоном имен.
#### Встроенный способ: Использование git-filter-branch
Команду `git-filter-branch` сложнее использовать и она имеет меньше возможностей, но вы можете ей воспользоваться, если не хотите пользоваться `bfg`.
В приведенной ниже команде замените `filepattern` на требуемое имя или шаблон, например, `*.jpg`. Эта команда удалит файлы, подходящие под заданный шаблон из истории всех ветвей.
```sh
(master)$ git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch filepattern' --prune-empty --tag-name-filter cat -- --all
```
Пояснения:
`--tag-name-filter cat` - это неуклюжий, но в то же время самый простой способ применить исходные метки к новым коммитам с помощью команды cat.
`--prune-empty` удаляет все коммиты, которые теперь стали пустыми.
#### Финальный шаг: Публикация измененной истории репозитория
Как только вы удалили файлы, которые хотели, внимально проверьте, что ничего не сломали в репозитории - если сломали, то проще всего склонировать ваш репозиторий и начать снова.
Для завершения вы можете опционально запустить сборщик мусора Git, чтобы минимизировать размер локальной папки .git folder size, а после этого сделать принудительный push.
```sh
(master)$ git reflog expire --expire=now --all && git gc --prune=now --aggressive
(master)$ git push origin --force --tags
```
После того, как вы переписали всю историю репозитория, операция `git push` может оказаться слишком большой и вернет ошибку `“The remote end hung up unexpectedly” (Удаленный хост неожиданно прервал соединение)`. Если это произошло, то попробуйте увеличить размер буфера передачи:
```sh
(master)$ git config http.postBuffer 524288000
(master)$ git push --force
```
Если это не работает, то вам придется делать push частями. В команде ниже пробуйте увеличивать `<number>` пока push не сработает.
```sh
(master)$ git push -u origin HEAD~<number>:refs/head/master --force
```
После того как только команда push сработала в первый раз, постепенно уменьшайте `<number>`, пока не сработает обычная `git push`.
<a href="i-need-to-change-the-content-of-a-commit-which-is-not-my-last"></a> <a href="i-need-to-change-the-content-of-a-commit-which-is-not-my-last"></a>
### Мне нужно изменить содержимое коммита, который не является последним ### Мне нужно изменить содержимое коммита, который не является последним
@ -413,11 +558,9 @@ pick f4037ec The last commit
сделает оставшуюся работу за Вас. сделает оставшуюся работу за Вас.
## Подготовка изменений (staging) ## Подготовка изменений (staging)
<a href="#i-need-to-add-staged-changes-to-the-previous-commit"></a> <a href="#i-need-to-add-staged-changes-to-the-previous-commit"></a>
### Мне нужно добавить подготовленные изменения в предыдущий коммит ### Мне нужно добавить подготовленные изменения в предыдущий коммит
```sh ```sh
@ -432,7 +575,6 @@ pick f4037ec The last commit
<a name="commit-partial-new-file"></a> <a name="commit-partial-new-file"></a>
### Я хочу подготовить только часть файла, а не весь файл целиком ### Я хочу подготовить только часть файла, а не весь файл целиком
Обычно, если хотите подготовить часть файл, Вы запускаете: Обычно, если хотите подготовить часть файл, Вы запускаете:
@ -451,7 +593,6 @@ $ git add -N filename.x
`git diff --staged`, Вы увидите какие строки вы подготовили по-сравнению с тем, что сохранено в рабочей копии. `git diff --staged`, Вы увидите какие строки вы подготовили по-сравнению с тем, что сохранено в рабочей копии.
<a href="stage-in-two-commits"></a> <a href="stage-in-two-commits"></a>
### Я хочу добавить изменения одного файла в два разных коммита ### Я хочу добавить изменения одного файла в два разных коммита
`git add` добавляет в коммит весь файл целиком. `git add -p` позволяет интерактивно выбрать изменения, которые Вы хотите добавить. `git add` добавляет в коммит весь файл целиком. `git add -p` позволяет интерактивно выбрать изменения, которые Вы хотите добавить.
@ -462,7 +603,6 @@ $ git add -N filename.x
`git reset -p` откроет интерактивный диалог сброса. Это похоже на `git add -p`, за исключением того, что выбор "yes" уберёт правку из готовящегося коммита. `git reset -p` откроет интерактивный диалог сброса. Это похоже на `git add -p`, за исключением того, что выбор "yes" уберёт правку из готовящегося коммита.
<a href="unstaging-edits-and-staging-the-unstaged"></a> <a href="unstaging-edits-and-staging-the-unstaged"></a>
### Я хочу подготовить свои неподготовленные правки и убрать из подготовки то, что уже подготовлено ### Я хочу подготовить свои неподготовленные правки и убрать из подготовки то, что уже подготовлено
Это сложно. Лучшее, что я смог придумать это отложить (stash) неподготовленные изменения. Затем сделать сброс. После этого вернуть отложенные изменения и добавить их. Это сложно. Лучшее, что я смог придумать это отложить (stash) неподготовленные изменения. Затем сделать сброс. После этого вернуть отложенные изменения и добавить их.
@ -477,7 +617,6 @@ $ git add -A
## Неподготовленные правки ## Неподготовленные правки
<a href="move-unstaged-edits-to-new-branch"></a> <a href="move-unstaged-edits-to-new-branch"></a>
### Я хочу переместить мои неподготовленные правки в новую ветку ### Я хочу переместить мои неподготовленные правки в новую ветку
```sh ```sh
@ -485,7 +624,6 @@ $ git checkout -b my-branch
``` ```
<a href="move-unstaged-edits-to-old-branch"></a> <a href="move-unstaged-edits-to-old-branch"></a>
### Я хочу переместить неподготовленные правки в другую существующую ветку ### Я хочу переместить неподготовленные правки в другую существующую ветку
```sh ```sh
@ -495,7 +633,6 @@ $ git stash pop
``` ```
<a href="i-want-to-discard-my-local-uncommitted-changes"></a> <a href="i-want-to-discard-my-local-uncommitted-changes"></a>
### Я хочу отменить мои локальные несохраненные изменения (подготовленные и неподготовленные) ### Я хочу отменить мои локальные несохраненные изменения (подготовленные и неподготовленные)
Если Вы хотите отменить все подготовленные и неподготовленные изменения, то можете сделать так: Если Вы хотите отменить все подготовленные и неподготовленные изменения, то можете сделать так:
@ -587,9 +724,7 @@ $ git checkout myFirstFile mySecondFile
```sh ```sh
$ git checkout . $ git checkout .
``` ```
<a href="i-want-to-discard-all-my-untracked-files"></a> <a href="i-want-to-discard-all-my-untracked-files"></a>
### Я хочу удалить все неотслеживаемые файлы ### Я хочу удалить все неотслеживаемые файлы
Когда Вы хотите удалить все неотслеживаемые файлы Когда Вы хотите удалить все неотслеживаемые файлы
@ -632,15 +767,12 @@ $ git branch -a
``` ```
<a name="create-branch-from-commit"></a> <a name="create-branch-from-commit"></a>
### Создать ветку на определенном коммите ### Создать ветку на определенном коммите
```sh ```sh
$ git checkout -b <branch> <SHA1_OF_COMMIT> $ git checkout -b <branch> <SHA1_OF_COMMIT>
``` ```
<a name="pull-wrong-branch"></a> <a name="pull-wrong-branch"></a>
### Я стянул изменения (pull) из неправильной ветки или в неправильную ветку ### Я стянул изменения (pull) из неправильной ветки или в неправильную ветку
Это очередная возможность воспользоваться `git reflog`, чтобы посмотреть куда указывала ваша HEAD перед неправильным pull. Это очередная возможность воспользоваться `git reflog`, чтобы посмотреть куда указывала ваша HEAD перед неправильным pull.
@ -660,7 +792,6 @@ $ git reset --hard c5bc55a
Готово. Готово.
<a href="discard-local-commits"></a> <a href="discard-local-commits"></a>
### Я хочу отменить локальные коммиты, чтобы моя ветка стала такой же как на сервере ### Я хочу отменить локальные коммиты, чтобы моя ветка стала такой же как на сервере
Подтвердите, что не хотите отправлять изменения на сервер. Подтвердите, что не хотите отправлять изменения на сервер.
@ -682,7 +813,6 @@ $ git reset --hard c5bc55a
``` ```
<a name="commit-wrong-branch"></a> <a name="commit-wrong-branch"></a>
### Я сохранил коммит в ветку master вместо новой ветки ### Я сохранил коммит в ветку master вместо новой ветки
Создайте новую ветку, оставаясь на master: Создайте новую ветку, оставаясь на master:
@ -717,7 +847,6 @@ HEAD is now at a13b85e
``` ```
<a name="keep-whole-file"></a> <a name="keep-whole-file"></a>
### Я хочу сохранить файл целиком из другого ref-ish ### Я хочу сохранить файл целиком из другого ref-ish
Скажем, у Вас рабочий spike (см. заметку) на сотни изменений. Всё работает. Теперь Вы сохраняете эту работу в другую ветку: Скажем, у Вас рабочий spike (см. заметку) на сотни изменений. Всё работает. Теперь Вы сохраняете эту работу в другую ветку:
@ -755,7 +884,6 @@ HEAD is now at a13b85e
Заметка: Spike-решения делаются для анализа или решения проблемы. Эти решения используют, чтобы оценить проблему, и отбрасывают сразу же, как только все получают ясное представление о проблеме. ~ [Wikipedia](https://en.wikipedia.org/wiki/Extreme_programming_practices). Заметка: Spike-решения делаются для анализа или решения проблемы. Эти решения используют, чтобы оценить проблему, и отбрасывают сразу же, как только все получают ясное представление о проблеме. ~ [Wikipedia](https://en.wikipedia.org/wiki/Extreme_programming_practices).
<a name="cherry-pick"></a> <a name="cherry-pick"></a>
### Я сделал несколько коммитов в одной ветке, а нужно было сохранять их в разных ветках ### Я сделал несколько коммитов в одной ветке, а нужно было сохранять их в разных ветках
Скажем, Вы в ветке master. Запустив `git log`, Вы увидите, что сделали два коммита: Скажем, Вы в ветке master. Запустив `git log`, Вы увидите, что сделали два коммита:
@ -821,9 +949,7 @@ HEAD is now at a13b85e
``` ```
<a name="delete-stale-local-branches"></a> <a name="delete-stale-local-branches"></a>
### Я хочу удалить локальные ветки, которые были удалены в upstream ### Я хочу удалить локальные ветки, которые были удалены в upstream
Как только Вы слили пулл-реквест на GitHub, Вам предлагают удалить слитую ветку из Вашего форка. Если Вы не планируете продолжать работу в этой ветке, то для поддержания рабочей копии в чистоте Вы можете удалить локальные копии ненужных веток, чтобы не путаться в них. Как только Вы слили пулл-реквест на GitHub, Вам предлагают удалить слитую ветку из Вашего форка. Если Вы не планируете продолжать работу в этой ветке, то для поддержания рабочей копии в чистоте Вы можете удалить локальные копии ненужных веток, чтобы не путаться в них.
```sh ```sh
@ -833,7 +959,6 @@ $ git fetch -p upstream
где `upstream` - удаленная ветка, из которой Вы хотите получить изменения. где `upstream` - удаленная ветка, из которой Вы хотите получить изменения.
<a name="restore-a-deleted-branch"></a> <a name="restore-a-deleted-branch"></a>
### Я нечаянно удалил мою ветку ### Я нечаянно удалил мою ветку
Если Вы регулярно отправляете изменения в удаленное хранилище, большую часть времени Вы в безопасности. Но в один прекрасный момент Вы всё же можете случайно удалить Ваши ветки. Скажем, мы создали ветку и создали новый файл: Если Вы регулярно отправляете изменения в удаленное хранилище, большую часть времени Вы в безопасности. Но в один прекрасный момент Вы всё же можете случайно удалить Ваши ветки. Скажем, мы создали ветку и создали новый файл:
@ -952,7 +1077,6 @@ README.md foo.txt
``` ```
<a name="i-want-to-checkout-to-a-remote-branch-that-someone-else-is-working-on"></a> <a name="i-want-to-checkout-to-a-remote-branch-that-someone-else-is-working-on"></a>
### Я хочу перейти на удаленную ветку, над которой работает кто-то еще ### Я хочу перейти на удаленную ветку, над которой работает кто-то еще
Во-первых, получим все ветки из удаленного репозитория: Во-первых, получим все ветки из удаленного репозитория:
@ -1010,7 +1134,6 @@ $ git branch -u [remotename]/[branch] [local-branch]
``` ```
<a name="i-want-to-set-my-HEAD-to-track-the-default-remote-branch"></a> <a name="i-want-to-set-my-HEAD-to-track-the-default-remote-branch"></a>
### Я хочу настроить HEAD на отслеживание основной удаленной ветки ### Я хочу настроить HEAD на отслеживание основной удаленной ветки
При просмотре удаленных веток можно увидеть какую удаленную ветку отслеживает HEAD. Может оказаться, что это не та ветка что нужно. При просмотре удаленных веток можно увидеть какую удаленную ветку отслеживает HEAD. Может оказаться, что это не та ветка что нужно.
@ -1041,7 +1164,6 @@ origin/HEAD set to master
## Перебазирование (rebase) и слияние (merge) ## Перебазирование (rebase) и слияние (merge)
<a name="undo-rebase"></a> <a name="undo-rebase"></a>
### Я хочу отменить перебазирование/слияние ### Я хочу отменить перебазирование/слияние
Вы можете слить/перебазировать Вашу ветку с неправильной веткой. А также бывают случаи, когда Вы не можете предугадать успешно ли завершится процесс перебазирования/слияния. Git сохраняет исходный указатель HEAD в переменную ORIG_HEAD перед тем как приступить к опасным операциям, так что вернуть ветку на состояние до перебазирования/слияния просто. Вы можете слить/перебазировать Вашу ветку с неправильной веткой. А также бывают случаи, когда Вы не можете предугадать успешно ли завершится процесс перебазирования/слияния. Git сохраняет исходный указатель HEAD в переменную ORIG_HEAD перед тем как приступить к опасным операциям, так что вернуть ветку на состояние до перебазирования/слияния просто.
@ -1051,7 +1173,6 @@ origin/HEAD set to master
``` ```
<a name="force-push-rebase"></a> <a name="force-push-rebase"></a>
### Я сделал перебазирование, но я не хочу делать принудительный push ### Я сделал перебазирование, но я не хочу делать принудительный push
К сожалению, вы должны сделать принудительный push, если хотите, чтобы изменения были отражены на удаленной ветке. Это потому что у вас изменена история. Удаленная ветка не примет изменения, если не сделать принудительный push. Это одна из основных причин, по которым большинство людей основывает свой рабочий процесс на слиянии вместо перебазирования - большие команды могут столкнуться с проблемами, если разработчики будут делать принудительный `push`. Используйте это с осторожностью. Безопасный способ использовать перебазирование - это не отражать Ваши изменения напрямую на удаленную ветку, а вместо этого делать следующее: К сожалению, вы должны сделать принудительный push, если хотите, чтобы изменения были отражены на удаленной ветке. Это потому что у вас изменена история. Удаленная ветка не примет изменения, если не сделать принудительный push. Это одна из основных причин, по которым большинство людей основывает свой рабочий процесс на слиянии вместо перебазирования - большие команды могут столкнуться с проблемами, если разработчики будут делать принудительный `push`. Используйте это с осторожностью. Безопасный способ использовать перебазирование - это не отражать Ваши изменения напрямую на удаленную ветку, а вместо этого делать следующее:
@ -1066,7 +1187,6 @@ origin/HEAD set to master
Чтобы узнать больше, см. [эту SO ветку](https://stackoverflow.com/questions/11058312/how-can-i-use-git-rebase-without-requiring-a-forced-push). Чтобы узнать больше, см. [эту SO ветку](https://stackoverflow.com/questions/11058312/how-can-i-use-git-rebase-without-requiring-a-forced-push).
<a name="interactive-rebase"></a> <a name="interactive-rebase"></a>
### Я хочу объединить коммиты ### Я хочу объединить коммиты
Предположим, что Вы работаете в ветке, которая стала или станет пулл-реквестом в `master`. В простейшем случае когда всё, что Вы хотите сделать - это объединить *все* коммиты в один единственный коммит и Вам не важны временные метки, Вы можете сделать сброс и заново сделать коммит. Убедитесь, что ветка master обновлена и Ваши изменения сохранены, затем: Предположим, что Вы работаете в ветке, которая стала или станет пулл-реквестом в `master`. В простейшем случае когда всё, что Вы хотите сделать - это объединить *все* коммиты в один единственный коммит и Вам не важны временные метки, Вы можете сделать сброс и заново сделать коммит. Убедитесь, что ветка master обновлена и Ваши изменения сохранены, затем:
@ -1160,7 +1280,6 @@ Newer, awesomer features
``` ```
#### Безопасная стратегия слияния #### Безопасная стратегия слияния
`--no-commit` производит слияние, но не делает коммит результата, давая пользователю возможность проверить и доработать результат слияния перед коммитом. `no-ff` сохраняет доказательства того, что когда-то существовала ветка feature, сохраняя цельность истории проекта. `--no-commit` производит слияние, но не делает коммит результата, давая пользователю возможность проверить и доработать результат слияния перед коммитом. `no-ff` сохраняет доказательства того, что когда-то существовала ветка feature, сохраняя цельность истории проекта.
```sh ```sh
@ -1174,7 +1293,6 @@ Newer, awesomer features
``` ```
<a name="rebase-unpushed-commits"></a> <a name="rebase-unpushed-commits"></a>
#### Я хочу объединить только неопубликованные коммиты #### Я хочу объединить только неопубликованные коммиты
Иногда у Вас бывает несколько временных коммитов, которые Вы хотите объединить перед публикацией в upstream. Вы не хотите ненароком объединить свои коммиты с уже опубликованными, потому что кто-то уже мог работать с ними. Иногда у Вас бывает несколько временных коммитов, которые Вы хотите объединить перед публикацией в upstream. Вы не хотите ненароком объединить свои коммиты с уже опубликованными, потому что кто-то уже мог работать с ними.
@ -1222,11 +1340,9 @@ Newer, awesomer features
### Возможные проблемы интерактивного перебазирования ### Возможные проблемы интерактивного перебазирования
<a name="noop"></a> <a name="noop"></a>
#### Экран перебазирования говорит 'noop' #### Экран перебазирования говорит 'noop'
Если Вы видите это: Если Вы видите это:
``` ```
noop noop
``` ```
@ -1237,7 +1353,6 @@ noop
- вместо этого перебазировать `HEAD~2` или что-то более раннее - вместо этого перебазировать `HEAD~2` или что-то более раннее
<a name="merge-conflict"></a> <a name="merge-conflict"></a>
#### Здесь были конфликты #### Здесь были конфликты
Если Вам не удается успешно завершить перебазирование, то, возможно, Вам придется разрешать конфликты. Если Вам не удается успешно завершить перебазирование, то, возможно, Вам придется разрешать конфликты.
@ -1297,7 +1412,6 @@ Changes not staged for commit:
``` ```
<a name="stashing"></a> <a name="stashing"></a>
## Отложенные изменения (stash) ## Отложенные изменения (stash)
### Отложить все правки ### Отложить все правки
@ -1329,7 +1443,6 @@ $ git stash push working-directory-path/filename1.ext working-directory-path/fil
``` ```
<a name="stash-msg"></a> <a name="stash-msg"></a>
### Отложить с сообщением ### Отложить с сообщением
```sh ```sh
@ -1337,7 +1450,6 @@ $ git stash save <message>
``` ```
<a name="stash-apply-specific"></a> <a name="stash-apply-specific"></a>
### Применить заданный stash из списка ### Применить заданный stash из списка
Во-первых, проверьте список отложенных изменений, используя Во-первых, проверьте список отложенных изменений, используя
@ -1373,7 +1485,6 @@ $ git log -S "string to find"
- `--reverse` выводит коммиты в обратном порядке, это значит, что вверху будет первый коммит, в котором сделано это изменение. - `--reverse` выводит коммиты в обратном порядке, это значит, что вверху будет первый коммит, в котором сделано это изменение.
<a name="i-want-to-find-by-author-committer"></a> <a name="i-want-to-find-by-author-committer"></a>
### Я хочу искать по автору или сохранившему изменения (committer) ### Я хочу искать по автору или сохранившему изменения (committer)
Найти все коммиты по автору или сохранившему изменения: Найти все коммиты по автору или сохранившему изменения:
@ -1427,7 +1538,6 @@ $ git tag --contains <commitid>
## Субмодули ## Субмодули
<a name="clone-submodules"></a> <a name="clone-submodules"></a>
### Клонировать все субмодули ### Клонировать все субмодули
```sh ```sh
@ -1441,7 +1551,6 @@ $ git submodule update --init --recursive
``` ```
<a name="delete-submodule"></a> <a name="delete-submodule"></a>
### Удалить субмодуль ### Удалить субмодуль
Создание субмодуля довольно прямолинейно, чего не скажешь об удалении. Команды, которые Вам нужны: Создание субмодуля довольно прямолинейно, чего не скажешь об удалении. Команды, которые Вам нужны:
@ -1477,7 +1586,6 @@ $ git push <remote> :refs/tags/<tag_name>
``` ```
<a name="recover-tag"></a> <a name="recover-tag"></a>
### Восстановить удаленную метку ### Восстановить удаленную метку
Если хотите восстановить метку, которая была удалена, Вы можете сделать следующее: во-первых, Вам нужно найти недостижимую метку: Если хотите восстановить метку, которая была удалена, Вы можете сделать следующее: во-первых, Вам нужно найти недостижимую метку:
@ -1509,7 +1617,6 @@ From github.com:foo/bar
```sh ```sh
$ git archive --format zip --output /full/path/to/zipfile.zip master $ git archive --format zip --output /full/path/to/zipfile.zip master
``` ```
### Как опубликовать ветку и метку, если они имеют одинаковые имена ### Как опубликовать ветку и метку, если они имеют одинаковые имена
Если в удаленном репозитории есть метка с таким же именем, как и ветка <branch>, то после выполнения команды `$ git push <remote> <branch>` Вы получите следующую ошибку: Если в удаленном репозитории есть метка с таким же именем, как и ветка <branch>, то после выполнения команды `$ git push <remote> <branch>` Вы получите следующую ошибку:
@ -1535,7 +1642,6 @@ $ git push origin refs/tags/<tag-name>
## Отслеживание файлов ## Отслеживание файлов
<a href="i-want-to-change-a-file-names-capitalization-without-changing-the-contents-of-the-file"></a> <a href="i-want-to-change-a-file-names-capitalization-without-changing-the-contents-of-the-file"></a>
### Я хочу изменить регистр в имени файла, не меняя содержимое файла ### Я хочу изменить регистр в имени файла, не меняя содержимое файла
```sh ```sh
@ -1550,7 +1656,6 @@ $ git push origin refs/tags/<tag-name>
``` ```
<a href="remove-from-git"></a> <a href="remove-from-git"></a>
### Я хочу удалить файл из git, но оставить сам файл ### Я хочу удалить файл из git, но оставить сам файл
```sh ```sh
@ -1599,6 +1704,39 @@ $ git update-index --assume-unchanged file-to-ignore
$ git update-index --no-assume-unchanged file-to-stop-ignoring $ git update-index --no-assume-unchanged file-to-stop-ignoring
``` ```
## Отладка с помощью Git
Команда [git-bisect](https://git-scm.com/docs/git-bisect) с помощью двоичного поиска находит в истории Git коммит, в котором впервые появилась ошибка.
Пусть вы находитесь на ветке `master` и хотите найти коммит, которых поломал некую функцию. Вы начинаете процедуру поиска:
```sh
$ git bisect start
```
Затем вы должны указать коммит, где функция поломана (bad), коммит, где функция работает правильно (good). Предположим, что *текущая* версия поломана, а `v1.1.1` - работоспособная:
```sh
$ git bisect bad
$ git bisect good v1.1.1
```
После этого `git-bisect` выберет коммит из середины заданного вами диапазона, перейдет на него и спросит у вас: хороший он или плохой. Вы увидите что-то вроде:
```sh
$ Bisecting: 5 revision left to test after this (roughly 5 step)
$ [c44abbbee29cb93d8499283101fe7c8d9d97f0fe] Commit message
$ (c44abbb)$
```
Вы проверите хороший ли коммит. Если хороший:
```sh
$ (c44abbb)$ git bisect good
```
и `git-bisect` выберет другой коммит. Этот процесс (выбора `good` или `bad`) будет повторяться до тех пор, пока диапазон поиска не сузится до единственного коммита, после чего команда выведет описание **первого** плохого коммита.
## Конфигурация ## Конфигурация
### Я хочу добавить псевдонимы для некоторых команд Git ### Я хочу добавить псевдонимы для некоторых команд Git
@ -1784,43 +1922,43 @@ function Squash-Commits {
## Книги ## Книги
* [Learn Enough Git to Be Dangerous](https://www.learnenough.com/git-tutorial) - Книга Майкла Хартла, посвященная Git с самых основ * [Learn Enough Git to Be Dangerous](https://www.learnenough.com/git-tutorial) - Книга Майкла Хартла, посвященная Git с самых основ
- [Pro Git](https://git-scm.com/book/ru/v2) - великолепная книга Скотта Чакона и Бена Страуба про Git * [Pro Git](https://git-scm.com/book/ru/v2) - великолепная книга Скотта Чакона и Бена Страуба про Git
- [Git Internals](https://github.com/pluralsight/git-internals-pdf) - еще одна великолепная книга Скотта Чакона, посвященная Git * [Git Internals](https://github.com/pluralsight/git-internals-pdf) - еще одна великолепная книга Скотта Чакона, посвященная Git
* [Nasa handbook](https://www.nasa.gov/sites/default/files/atoms/files/nasa_systems_engineering_handbook.pdf)
## Учебники ## Учебники
* [19 Git Tips For Everyday Use](https://www.alexkras.com/19-git-tips-for-everyday-use) - Список полезных однострочников Git * [19 Git Tips For Everyday Use](https://www.alexkras.com/19-git-tips-for-everyday-use) - Список полезных однострочников Git
- [Atlassian's Git tutorial](https://www.atlassian.com/git/tutorials) Получите Git сразу с учебниками от начального до продвинутого уровня. * [Atlassian's Git tutorial](https://www.atlassian.com/git/tutorials) Получите Git сразу с учебниками от начального до продвинутого уровня.
- [Изучаем ветвление в Git](https://learngitbranching.js.org/) Интерактивный веб-учебник по ветвлению/слиянию/перебазированию * [Изучаем ветвление в Git](https://learngitbranching.js.org/) Интерактивный веб-учебник по ветвлению/слиянию/перебазированию
- [Конструктивно о слиянии и перебазировании в Git](https://medium.com/@porteneuve/getting-solid-at-git-rebase-vs-merge-4fa1a48c53aa) * [Конструктивно о слиянии и перебазировании в Git](https://medium.com/@porteneuve/getting-solid-at-git-rebase-vs-merge-4fa1a48c53aa)
* [Git Commands and Best Practices Cheat Sheet](https://zeroturnaround.com/rebellabs/git-commands-and-best-practices-cheat-sheet) - Шпаргалка Git с подробными пояснениями * [Git Commands and Best Practices Cheat Sheet](https://zeroturnaround.com/rebellabs/git-commands-and-best-practices-cheat-sheet) - Шпаргалка Git с подробными пояснениями
* [Git изнутри](https://codewords.recurse.com/issues/two/git-from-the-inside-out) - Учебник, погружающий во внутренности Git * [Git изнутри](https://codewords.recurse.com/issues/two/git-from-the-inside-out) - Учебник, погружающий во внутренности Git
- [git-workflow](https://github.com/asmeurer/git-workflow) - Руководство от [Aaron Meurer](https://github.com/asmeurer) по использованию Git в совместной разработке проектов с открытым исходным кодом * [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 в качестве рабочего процесса, в частности с пустыми пулл-реквестами * [GitHub как рабочий процесс](https://hugogiraudel.com/2015/08/13/github-as-a-workflow/) - Интересный подход к использованию GitHub в качестве рабочего процесса, в частности с пустыми пулл-реквестами
- [Githug](https://github.com/Gazler/githug) - Игра для изучения более общих рабочих процессов Git * [Githug](https://github.com/Gazler/githug) - Игра для изучения более общих рабочих процессов Git
* [learnGitBranching](https://github.com/pcottle/learnGitBranching) - Изучение ветвлений git в игровой форме. * [learnGitBranching](https://github.com/pcottle/learnGitBranching) - Изучение ветвлений git в игровой форме.
## Скрипты и инструменты ## Скрипты и инструменты
- [firstaidgit.io](http://firstaidgit.io/) Выборка наиболее частых вопросов и ответов по Git c поиском * [firstaidgit.io](http://firstaidgit.io/) Выборка наиболее частых вопросов и ответов по Git c поиском
- [git-extra-commands](https://github.com/unixorn/git-extra-commands) - сборник полезных дополнительных скриптов для Git * [git-extra-commands](https://github.com/unixorn/git-extra-commands) - сборник полезных дополнительных скриптов для Git
- [git-extras](https://github.com/tj/git-extras) - GIT utilities -- статистика репозитория, REPL, генерация журнала изменений, статистика по авторам изменений и многое другое * [git-extras](https://github.com/tj/git-extras) - GIT utilities -- статистика репозитория, REPL, генерация журнала изменений, статистика по авторам изменений и многое другое
- [git-fire](https://github.com/qw3rtman/git-fire) - git-fire - это плагин для Git, который предупреждает при потенциально опасных действиях, таких как: добавление всех файлов из текущей папки, создание коммита и публикация измений в новую ветку (для предотвращения конфликтов при слиянии). * [git-fire](https://github.com/qw3rtman/git-fire) - git-fire - это плагин для Git, который предупреждает при потенциально опасных действиях, таких как: добавление всех файлов из текущей папки, создание коммита и публикация измений в новую ветку (для предотвращения конфликтов при слиянии).
- [git-tips](https://github.com/git-tips/tips) - Краткие советы по Git * [git-tips](https://github.com/git-tips/tips) - Краткие советы по Git
- [git-town](https://github.com/Originate/git-town) - Общая высокоуровневая поддержка рабочего процесса Git! http://www.git-town.com * [git-town](https://github.com/Originate/git-town) - Общая высокоуровневая поддержка рабочего процесса Git! http://www.git-town.com
## Графические клиенты ## Графические клиенты
* [GitKraken](https://www.gitkraken.com/) - роскошный Git-клиент для Windows, Mac и Linux
- [GitKraken](https://www.gitkraken.com/) - роскошный Git-клиент для Windows, Mac и Linux * [git-cola](https://git-cola.github.io/) - еще один Git-клиент для Windows и OS X
- [git-cola](https://git-cola.github.io/) - еще один Git-клиент для Windows и OS X * [GitUp](https://github.com/git-up/GitUp) - новый графический клиент, имеющий весьма своеобразные методы работы со сложностями Git
- [GitUp](https://github.com/git-up/GitUp) - новый графический клиент, имеющий весьма своеобразные методы работы со сложностями Git * [gitx-dev](https://rowanj.github.io/gitx/) - еще один графический Git-клиент для OS X
- [gitx-dev](https://rowanj.github.io/gitx/) - еще один графический Git-клиент для OS X * [Sourcetree](https://www.sourcetreeapp.com/) - Простота и мощь в красивом и свободном графическом Git-клиенте. Для Windows и Mac.
- [Sourcetree](https://www.sourcetreeapp.com/) - Простота и мощь в красивом и свободном графическом Git-клиенте. Для Windows и Mac. * [Tower](https://www.git-tower.com/) - графический Git-клиент для OS X (платный)
- [Tower](https://www.git-tower.com/) - графический Git-клиент для OS X (платный) * [tig](https://jonas.github.io/tig/) - консольный текстовый интерфейс для Git
- [tig](https://jonas.github.io/tig/) - консольный текстовый интерфейс для Git * [Magit](https://magit.vc/) - интерфейс для Git, реализованный в виде модуля Emacs.
- [Magit](https://magit.vc/) - интерфейс для Git, реализованный в виде модуля Emacs. * [GitExtensions](https://github.com/gitextensions/gitextensions) - расширение оболочки, плагин для Visual Studio 2010-2015 и автономный инструмент для управления репозиториями Git.
- [GitExtensions](https://github.com/gitextensions/gitextensions) - расширение оболочки, плагин для Visual Studio 2010-2015 и автономный инструмент для управления репозиториями Git. * [Fork](https://git-fork.com/) - быстрый и дружелюбный Git-клиент для Mac (бета)
- [Fork](https://git-fork.com/) - быстрый и дружелюбный Git-клиент для Mac (бета) * [gmaster](https://gmaster.io/) - Git-клиент для Windows с трехсторонним слиянием, обнаружением рефакторинга, семантическим сравнением и слиянием (бета)
- [gmaster](https://gmaster.io/) - Git-клиент для Windows с трехсторонним слиянием, обнаружением рефакторинга, семантическим сравнением и слиянием (бета) * [gitk](https://git-scm.com/docs/gitk) - Git-клиент под Linux для просмотра состояния репозитория.
- [gitk](https://git-scm.com/docs/gitk) - Git-клиент под Linux для просмотра состояния репозитория.
* [SublimeMerge](https://www.sublimemerge.com/) - Шустрый, расширяемый клиент для трехстороннего слияния, мощного поиска и подсветки синтаксиса. В активной разработке. * [SublimeMerge](https://www.sublimemerge.com/) - Шустрый, расширяемый клиент для трехстороннего слияния, мощного поиска и подсветки синтаксиса. В активной разработке.